本帖最后由 老刘1号 于 2023-5-12 18:58 编辑
不定期更新。
注意:ffmpeg的参数位置不同,意义不同,请不要改变参数位置。
中文文档(2018)
官方帮助
ffmpeg Documentation
ffplay Documentation
ffprobe Documentation
MPV Manual
离线帮助:
ffmpeg -h -- print basic options
ffmpeg -h long -- print more options
ffmpeg -h full -- print all options (including all format and codec specific options, very long)
ffmpeg -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf
视频转码为H.264/H.265编码(软编码,固定码率)
软编解码,封装格式mp4,视频流转h264编码,码率300k;音频流转mp3,码率32k。
参数介绍:
-vcodec:指定视频编码器,可简写为-c:v。
可以指定编码器为libx265,编码更慢,但在码率减少51-74%的情况下,H.265编码视频的质量还能与H.264编码视频近似甚至更好。
-acodec:指定音频编码器,可简写为-c:a。
-b:a:指定音频流的码率。
-b:v:指定视频流的码率。
以下为libx264编码器的参数:
-preset:品质,此处指定为faster。
可选:ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo
品质高于ultrafast,效果就比一般转码软件好。低码率也很清晰。
-tune:优化,此处指定为film。
可选:
film:电影真人类型
animation:动画
grain:需要保留大量的grain
stillimage:静态图像编码时使用
psnr:提高psnr做了优化的参数
ssim:提高ssim做了优化参数
fastdecode:可以快速解码的参数
zerolatency:零延迟,用在需要非常低的延迟的情况,比如电视电话会议编码
其它没有加进去的参数:
-r:修改帧率
-s:修改尺寸(如-s 1920x1080)
-ss:视频开始时间。(-ss hh:mm:ss[.xxx])
-t:持续时间(-t hh:mm:ss[.xxx]或-t 秒数)
-to:截止时间。(-to hh:mm:ss[.xxx])FFMPEG -i "%~1" -vcodec libx264 -preset faster -tune film -b:v 300k -c:a libmp3lame -b:a 32k "%~dp1(new)%~n1.MP4"COPY 视频转码为H.264/H.265编码(动态码率)
软编码器(兼容性较好,CPU占用大):
编码器名:libx264、libx265
参数:指定-crf(一般18就可以),-preset只决定最终文件大小,不影响视频质量。
参数详解:
设定CRF值,来确定画质。
数字越小画质越高,数字越大画质越差,一般在设定在16-24之间。
在其他参数不变的情况下,CRF值每减小6,输出的文件会变大一倍左右。
接着设定 Preset,来确定编码速度。
编码越快,生成的文件越大;编码越慢,文件越小。
一般设定在faster-slower之间。CRF模式下不影响画质,只和编码速度、文件大小有关。
硬编码器(兼容性一般,CPU占用低,编码速度快):
Intel QuickSync
编码器名:h264_qsv、hevc_qsv
参数:
h264_qsv:preset=veryslow,profile=high,look_ahead=1,global_quality=18
hevc_qsv:preset=veryslow,profile=main,look_ahead=1,global_quality=18
AMD AMF(首先你需要有A卡)
编码器名:h264_amf、hevc_amf
参数:
h264_amf:b=10000000,quality=quality,profile=high,rc=vbr_peak,maxrate=13000000,bufsize=20000000
hevc_amf:b=10000000,quality=quality,profile=main,rc=vbr_peak,maxrate=13000000,bufsize=20000000
Nvidia NVENC(首先你需要有N卡)
编码器名:h264_nvenc、hevc_nvenc
参数:
h264_nvenc:b=10000000,preset=slow,profile=high,rc=vbr_hq,maxrate=13000000,bufsize=20000000
hevc_nvenc:b=10000000,preset=slow,profile=main,rc=vbr_hq,maxrate=13000000,bufsize=20000000
SVP 4 插帧转码提取版(无水印)
ffff.py与转码参数的对应
最终视频帧率
=src_fps*smoothfps_params.rate.num/smoothfps_params.rate.den
num和den是整数。
SVP着色器
最快:algo:1
锐利(适用于动画):algo:2
分块(仅使用CPU):block:true,algo:11
简单清淡:algo:11
简单:algo:21,mask:{cover:80}
标准:algo:13
复杂:algo:23,mask:{cover:80}
帧插补
恒定帧间隔(流畅):scene:{mode:0}
“2m”伪影最小:scene:{mode:2}
“1.5m”少量伪影:scene:{limits:{m1:0,m2:0}}
“1m”普通模式:scene:{mode:1}
自适应
1m-1.5m-2m:scene:{adaptive:321}
1m-1m-2m:scene:{adaptive:331}
恒定帧间隔-1m-1.5:scene:{}
恒定帧间隔-1m-2m:scene:{adaptive:310}
| ::插帧软件SVP 4视频插帧转码提取版。 | | ::二倍帧率。 | | ::需要安装了SVPcode的SVP 4运行。 | | ::需要ffff.py。 | | >"%~dp0fps.txt" ffprobe ^ | | -v error ^ | | -select_streams v ^ | | -of default=noprint_wrappers=1:nokey=1 ^ | | -show_entries stream=r_frame_rate ^ | | "%~f1" | | Start /Wait "" "C:\Users\lenovo\Desktop\SVP\SVP 4\mpv64\mpv.exe" ^ | | "%~f1" --o="%~dpn1.MKV" ^ | | --no-sub --no-sub-auto ^ | | --input-ipc-server=mpvencodepipe ^ | | --input-media-keys=no ^ | | --no-msg-color ^ | | --vf=vapoursynth:[%~dp0ffff.py]:4:8 ^ | | --of=matroska ^ | | --ovc=libx264 --ovcopts=preset=slower,crf=30,threads=8 ^ | | %--oac=libmp3lame% %--oacopts=b=32k% --no-audio | | del "%~dp0fps.txt" | | ffmpeg -i "%~dpn1.MKV" -i "%~f1" -map 0:v -c:v copy -map 1:a -c:a copy "%~dp1NEW.%~n1.MP4" | | del "%~dpn1.MKV"COPY |
| | | | | f = open('C:\\Users\\lenovo\\Desktop\\SVP\\fps.txt') | | src_fps = eval(f.read()) | | f.close() | | | | | | | | | | import vapoursynth as vs | | core = vs.get_core(threads=8) | | | | core.std.LoadPlugin("C:\\Users\\lenovo\\Desktop\\SVP\\SVP 4\\plugins64\\svpflow1_vs.dll") | | core.std.LoadPlugin("C:\\Users\\lenovo\\Desktop\\SVP\\SVP 4\\plugins64\\svpflow2_vs.dll") | | | | clip = video_in | | | | super_params = "{scale:{up:0},gpu:1,rc:true}" | | analyse_params = "{block:{w:8},main:{search:{coarse:{distance:-12,bad:{sad:2000}},type:2}},refine:[{thsad:250}]}" | | smoothfps_params = "{gpuid:11,gpu_qn:2,rate:{num:2,den:1},algo:23,mask:{cover:80},scene:{mode:0}}" | | | | | | demo_mode = 0 | | stereo_type = 0 | | nvof = 0 | | | | | | | | | | | | | | def interpolate(clip): | | | | | | | | input_um = clip.resize.Point(format=vs.YUV420P8,dither_type="random") | | input_m = input_um | | input_m8 = input_m | | | | if nvof: | | smooth = core.svp2.SmoothFps_NVOF(input_m,smoothfps_params,nvof_src=input_m8,src=input_um,fps=src_fps) | | else: | | super = core.svp1.Super(input_m8,super_params) | | vectors = core.svp1.Analyse(super["clip"],super["data"],input_m8,analyse_params) | | smooth = core.svp2.SmoothFps(input_m,super["clip"],super["data"],vectors["clip"],vectors["data"],smoothfps_params,src=input_um,fps=src_fps) | | | | | | if demo_mode==1: | | return demo(input_m,smooth) | | else: | | return smooth | | | | if stereo_type == 1: | | lf = interpolate(core.std.CropRel(clip,0,(int)(clip.width/2),0,0)) | | rf = interpolate(core.std.CropRel(clip,(int)(clip.width/2),0,0,0)) | | smooth = core.std.StackHorizontal([lf, rf]) | | elif stereo_type == 2: | | lf = interpolate(core.std.CropRel(clip,0,0,0,(int)(clip.height/2))) | | rf = interpolate(core.std.CropRel(clip,0,0,(int)(clip.height/2),0)) | | smooth = core.std.StackVertical([lf, rf]) | | else: | | smooth = interpolate(clip) | | | | | | | | smooth = smooth.resize.Point(format=vs.YUV420P8) | | smooth.set_output()COPY |
例子/自用小程序
视频、音频转mp3(就是这么简单粗暴)for %%a in (%*) do ffmpeg -i "%%~fa" "%%~dpna.MP3"COPY 二倍速处理音频ffmpeg -i "%~1" -filter:a "atempo=2.0" -vn "%~dp1(二倍速)%~nx1"COPY
| ::无损视频合并 | | ::用法:按顺序拖入要合并的视频文件,然后回车。完成后按Ctrl+Z再回车,拖入输出路径。 | | ::要求:音频编码为AAC。 | | @echo off | | Setlocal enabledelayedexpansion | | ::CODER BY 老刘 POWERD BY iBAT | | copy con "%temp%\list.tmp">nul | | set /p outputpath=输出路径: | | set /a n=1 | | for /f "delims=" %%. in ('type "%temp%\list.tmp"') do ( | | ffmpeg -i "%%~f." -c:v copy -c:a copy -vbsf h264_mp4toannexb -y "%temp%\!n!.ts" | | Set "concat=!concat!%temp%\!n!.ts|" | | Set /a n+=1 | | ) | | ffmpeg -i "concat:!concat:~,-1!" -acodec copy -vcodec copy -absf aac_adtstoasc "!outputpath:"=!\output.mp4" | | pauseCOPY |
音频混音
改volume可以调整两个音频的音量,保证混音效果 | @echo off | | Setlocal enabledelayedexpansion | | ::CODER BY 老刘 POWERD BY iBAT | | ffmpeg -i "H:\db.MP3"^ | | -ss 00:00:03.15 -i "D:\我的文档目录\Tencent Files\632171029\FileRecv\MobileFile\音频录制2019-07-18 21-33-49.wav"^ | | -filter_complex "[0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=1[a0]; [1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=1[a1]; [a0][a1]amerge=inputs=2[aout]" -map "[aout]" -ac 2 -y h:\mix_v0.5.mp3 | | pauseCOPY |
录制桌面(无音频流(无声音),FPS(帧率) 6)ffmpeg.exe -f gdigrab -framerate 6 -i desktop out.mp4COPY M3U8下载并合并为视频
FLV"ffmpeg.exe" -threads 0 -i "URL" -c copy -y -f f4v -bsf:a aac_adtstoasc "1.flv"COPY MKV"ffmpeg.exe" -threads 0 -i "URL" -c copy -y -bsf:a aac_adtstoasc "1.mkv"COPY MP4"ffmpeg.exe" -threads 0 -i "%~1" -c copy -y -bsf:a aac_adtstoasc "1.mp4"COPY TS"ffmpeg.exe" -threads 0 -i "URL" -c copy -y -f mpegts "1.ts"COPY
| ::效果不好弃用,替代命令见下: | | ::https://bbs.kafan.cn/thread-2210091-1-1.html | | ::视频剪辑合并 | | ::用法: | | ::1、第一个分段中一定要有关键帧(不要截太短),否则会合并失败,变成只有音频流的mp4。 | | ::2、分段信息例: 1:37-7:21 8:40~10:00 (冒号全角半角都可,-或~分割起始点和终点,空格分隔每一段) | | ::缺点:剪切的视频开头有黑屏或卡顿,因为ffmpeg无法seek到关键帧上。 | | ::优点:不用转码,剪辑真的很快;可编程,可自动化,适合批量粗略剪辑。 | | @echo off | | Setlocal enabledelayedexpansion | | :start | | ::CODER BY 老刘 POWERD BY iBAT | | set /p Filepath=视频文件路径: | | set "FilePath=!FilePath:"=!" | | Set /p SplitInfo=分段信息: | | | | set SplitInfo=!SplitInfo:-=~! | | set SplitInfo=!SplitInfo::=:! | | set /a n=1 | | | | cd.>%temp%\concatlist | | for %%a in (!SplitInfo!) do ( | | for /f "tokens=1-2 delims=~" %%b in ("%%a") do ( | | for /f "tokens=1-2 delims=:" %%d in ("%%b") do ( | | set SplitFromMinute=%%d | | if "!SplitFromMinute:~1!" Equ "" set SplitFromMinute=0%%d | | set SplitFromSecond=%%e | | if "!SplitFromSecond:~1!" Equ "" set SplitFromSecond=0%%e | | if "!SplitFromMinute!:!SplitFromSecond!" Equ "00:00" set SplitFromSecond=01 | | ) | | | | for /f "tokens=1-2 delims=:" %%d in ("%%c") do ( | | set SplitToMinute=%%d | | if "!SplitToMinute:~1!" Equ "" set SplitToMinute=0%%d | | set SplitToSecond=%%e | | if "!SplitToSecond:~1!" Equ "" set SplitToSecond=0%%e | | ) | | Echo 截取分段 !n! : !SplitFromMinute!:!SplitFromSecond! -^> !SplitToMinute!:!SplitToSecond! | | for %%A in ("!Filepath!") do ( | | | | >nul 2>nul ffmpeg ^ | | -i "%%~fA" ^ | | -ss !SplitFromMinute!:!SplitFromSecond! ^ | | -to !SplitToMinute!:!SplitToSecond! ^ | | -c:v copy ^ | | -c:a copy ^ | | %-vbsf% %h264_mp4toannexb% ^ | | -y ^ | | "%temp%\!n!.ts.mp4" | | | | echo file '%temp%\!n!.ts.mp4' >>"%temp%\concatlist" | | Set /a n+=1 | | ) | | ) | | ) | | | | | | Set /a n-=1 | | for %%A in ("!Filepath!") do ( | | ren "%%~fA" "%%~nA.old" | | echo 合并 !n! 个分段 | | | | >nul 2>nul ffmpeg ^ | | -f concat ^ | | -safe 0 ^ | | -i "%temp%\concatlist" ^ | | -vcodec copy ^ | | -acodec copy ^ | | -y ^ | | "%%~fA" | | ) | | echo. | | goto start | | | | | | rem 以下命令已弃用,仅作备份 | | ffmpeg ^ | | -i "concat:!concat:~,-1!" ^ | | -vcodec copy ^ | | -absf aac_adtstoasc ^ | | -acodec copy ^ | | -y ^ | | "%%~fA"COPY |
| ::音频去噪 | | ::用法:媒体文件拖到bat上,然后按提示输入参数 | | @echo off | | Setlocal enabledelayedexpansion | | ::CODER BY 老刘 POWERD BY iBAT | | set /p t=噪音出现时间点(MM:SS): | | set /p x=去噪效果(0~1,推荐0.2~0.3): | | ffmpeg -i "%~1" "%tmp%\origin.wav" | | ffmpeg -i "%~1" -ss 00:!t! -t 1 "%tmp%\noise.wav" | | sox "%tmp%\noise.wav" -n noiseprof "%tmp%\noise.prof" | | sox "%tmp%\origin.wav" "%~dp1[NO_Noise]%~n1.wav" noisered "%tmp%\noise.prof" !x! | | pauseCOPY |
| ::视频音量调整 | | ::音频编码会被转为mp3 | | @set /p vpath=拖入视频路径: | | @set /p volume=输入音量增幅(单位dB): | | @set /p audio_bitrate=输入音频码率(单位kbps): | | @Call :处理 "%vpath:"=%" | | @Exit | | :处理 | | @ffmpeg -i "%~1" -c:v copy -c:a libmp3lame -b:a %audio_bitrate%k -af "volume=%volume%dB" "%~dp1(+%volume%dB)%~nx1"COPY |
| ::视频音频流码率压缩 | | ::压缩到:mp3 16kbps | | ::将视频拖动到批处理上。 | | FFMPEG -i "%~1" -c:a libmp3lame -b:a 16k -c:v copy "%~dp1(audio_16k)%~n1.MP4"COPY |
| ::视频帧率快速压缩 | | ::压缩到:13fps | | ::将视频拖动到批处理上。 | | FFMPEG -i "%~1" -r 13 -c:v libx264 -preset ultrafast -c:a copy "%~dp1(13fps)%~n1.MP4"COPY |
| ::视频帧率、音频流码率压缩 | | ::压缩到:13fps;mp3 16kbps | | ::将视频拖动到批处理上。 | | FFMPEG -i "%~1" -r 13 -c:v libx264 -preset ultrafast -c:a libmp3lame -b:a 16k "%~dp1(13fps audio_16k)%~n1.MP4"COPY |
| ::视频流+第二个音频流生成新视频 | | ffmpeg -i ".\2019.10.12 - 21.28.39.02.mp4" -map 0:v -c:v copy -map 0:a:1 -c:a copy 1.mp4COPY |
| ::导出第二个音频流 | | ffmpeg -i ".\2019.10.12 - 21.28.39.02.mp4" -map 0:a:1 -c:a copy 1.aacCOPY |
| ::视频动态码率压缩。 | | ::压缩到crf=30。 | | | | @ffmpeg.exe -i "%~f1" -c:a copy -c:v libx264 -preset slower -crf 30 "%~f1.new.mp4" | | | | @pauseCOPY |
| ::mpv视频动态码率压缩。 | | ::压缩到crf=30,占用比ffmpeg低。 | | @echo %time% | | @Start /Wait "" "C:\Users\lenovo\Desktop\SVP\SVP 4\mpv64\mpv.exe" ^ | | "%~f1" --o="%~dpn1.mkv" ^ | | --no-sub --no-sub-auto ^ | | --input-media-keys=no ^ | | --no-msg-color ^ | | --of=matroska ^ | | --ovc=libx264 --ovcopts=preset=slower,crf=30,threads=8 ^ | | %--oac=libmp3lame% %--oacopts=b=32k% %--no-audio% | | | | @echo %time% | | @pauseCOPY |
| ::得到视频帧率 | | >"%~dp0fps.txt" ffprobe ^ | | -v error ^ | | -select_streams v ^ | | -of default=noprint_wrappers=1:nokey=1 ^ | | -show_entries stream=r_frame_rate ^ | | "%~f1"COPY |
| ::嵌入ASS字幕 | | ::若出现Could not create a libass track when reading file 错误,请将字幕编码改为UTF-8 | | ffmpeg -i input.mp4 -i input.ass -vf ass=input.ass output.mp4COPY |
视频码率检测:
https://blog.csdn.net/qq_23282479/article/details/119488291
视频ts切片并生成m3u8
https://www.cnblogs.com/fieldtianye/p/13427303.html |