本帖最后由 老刘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"
复制代码 视频转码为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"
复制代码
- #ffff.py
- #插帧软件转码提取版所需的脚本。
- f = open('C:\\Users\\lenovo\\Desktop\\SVP\\fps.txt')
- src_fps = eval(f.read())
- f.close()
-
- # This script was generated by SVP 4 Manager.
- # Check https://www.svp-team.com for more details.
-
- 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}}"
-
- #src_fps = 25
- demo_mode = 0
- stereo_type = 0
- nvof = 0
-
- ########## BEGIN OF base.py ##########
- # This file is a part of SmoothVideo Project (SVP) ver.4
- # This is NOT the full Vapoursynth script, all used variables are defined via
- # JScript code that generates the full script text.
-
- def interpolate(clip):
- # input_um - original frame in 4:2:0
- # input_m - cropped and resized (if needed) frame
- # input_m8 - input_m converted to 8-bit
- 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)
- ########### END OF base.py ###########
-
-
- smooth = smooth.resize.Point(format=vs.YUV420P8)
- smooth.set_output()
复制代码 例子/自用小程序
视频、音频转mp3(就是这么简单粗暴)- for %%a in (%*) do ffmpeg -i "%%~fa" "%%~dpna.MP3"
复制代码 二倍速处理音频- ffmpeg -i "%~1" -filter:a "atempo=2.0" -vn "%~dp1(二倍速)%~nx1"
复制代码
- ::无损视频合并
- ::用法:按顺序拖入要合并的视频文件,然后回车。完成后按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"
- pause
复制代码 音频混音
改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
- pause
复制代码 录制桌面(无音频流(无声音),FPS(帧率) 6)- ffmpeg.exe -f gdigrab -framerate 6 -i desktop out.mp4
复制代码 M3U8下载并合并为视频
FLV- "ffmpeg.exe" -threads 0 -i "URL" -c copy -y -f f4v -bsf:a aac_adtstoasc "1.flv"
复制代码 MKV- "ffmpeg.exe" -threads 0 -i "URL" -c copy -y -bsf:a aac_adtstoasc "1.mkv"
复制代码 MP4- "ffmpeg.exe" -threads 0 -i "%~1" -c copy -y -bsf:a aac_adtstoasc "1.mp4"
复制代码 TS- "ffmpeg.exe" -threads 0 -i "URL" -c copy -y -f mpegts "1.ts"
复制代码
- ::效果不好弃用,替代命令见下:
- ::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
- rem set concat=
- 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 (
- rem >nul 2>nul
- >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"
- rem Set "concat=!concat!%temp%\!n!.ts.mp4|"
- echo file '%temp%\!n!.ts.mp4' >>"%temp%\concatlist"
- Set /a n+=1
- )
- )
- )
- rem notepad %temp%\concatlist
- rem exit
- Set /a n-=1
- for %%A in ("!Filepath!") do (
- ren "%%~fA" "%%~nA.old"
- echo 合并 !n! 个分段
- rem >nul 2>nul
- >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"
复制代码
- ::音频去噪
- ::用法:媒体文件拖到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!
- pause
复制代码
- ::视频音量调整
- ::音频编码会被转为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"
复制代码
- ::视频音频流码率压缩
- ::压缩到:mp3 16kbps
- ::将视频拖动到批处理上。
- FFMPEG -i "%~1" -c:a libmp3lame -b:a 16k -c:v copy "%~dp1(audio_16k)%~n1.MP4"
复制代码
- ::视频帧率快速压缩
- ::压缩到:13fps
- ::将视频拖动到批处理上。
- FFMPEG -i "%~1" -r 13 -c:v libx264 -preset ultrafast -c:a copy "%~dp1(13fps)%~n1.MP4"
复制代码
- ::视频帧率、音频流码率压缩
- ::压缩到: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"
复制代码
- ::视频流+第二个音频流生成新视频
- ffmpeg -i ".\2019.10.12 - 21.28.39.02.mp4" -map 0:v -c:v copy -map 0:a:1 -c:a copy 1.mp4
复制代码
- ::导出第二个音频流
- ffmpeg -i ".\2019.10.12 - 21.28.39.02.mp4" -map 0:a:1 -c:a copy 1.aac
复制代码
- ::视频动态码率压缩。
- ::压缩到crf=30。
- @rem echo %time%
- @ffmpeg.exe -i "%~f1" -c:a copy -c:v libx264 -preset slower -crf 30 "%~f1.new.mp4"
- @rem echo %time%
- @pause
复制代码
- ::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%
- @pause
复制代码
- ::得到视频帧率
- >"%~dp0fps.txt" ffprobe ^
- -v error ^
- -select_streams v ^
- -of default=noprint_wrappers=1:nokey=1 ^
- -show_entries stream=r_frame_rate ^
- "%~f1"
复制代码
- ::嵌入ASS字幕
- ::若出现Could not create a libass track when reading file 错误,请将字幕编码改为UTF-8
- ffmpeg -i input.mp4 -i input.ass -vf ass=input.ass output.mp4
复制代码 视频码率检测:
https://blog.csdn.net/qq_23282479/article/details/119488291
视频ts切片并生成m3u8
https://www.cnblogs.com/fieldtianye/p/13427303.html |