目录:
1. FFmpeg简介 FFmpeg编码流程 FFmpeg混淆概念
2.FFmpeg操作参数
3.FFmpeg常用操作
5.FFmpeg操作参数[1][2][3]
通过homebrew,在终端安装FFmpeg:
brew install FFmpeg
在终端输入:
ffmpeg -h
第一部分:FFmpeg版本、位置、模块等信息(可不看)
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.16)
configuration:
--prefix=/usr/local/Cellar/ffmpeg/4.2.2_1
--enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang
--host-cflags='-I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.0.1.jdk/Contents/
Home/include -I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.0.1.jdk/Contents/
Home/include/darwin -fno-stack-check'
--host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray
--enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy
--enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx
--enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma
--enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass
--enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp
--enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Hyper fast Audio and Video encoder
第二部分:FFmpeg用法
[global_options
第三部分:帮助/打印选项
#打印基本选项
-h long -- print more options
第四部分:功能显示
#显示版本
-buildconf show build configuration
第五部分:全局选项 [global_options]:(影响整个程序,而不仅仅是一个文件)
(affect whole program instead of just one file:
-loglevel loglevel
第六部分:文件主选项 [input_file_options] / [output_file_options]
#指定格式
-c codec codec name
文件主选项-其他:
-re:代表按照时间戳读取或发送数据,尤其在作为推流工具的时候一定要加上该参数,否则ffpmeg会按照最高速率向流媒体不停的发送数据。
-map:指定输出文件的流映射关系。例如:“-map 1:0 -map 1:1”要求按照第二个输入的文件的第一个流和第二个流写入输出文件。如果没有设置此项,则ffpmeg采用默认的映射关系。
-title string 设置标题
-author string 设置作者
-copyright string 设置版权
-comment string 设置评论
-hq 激活高质量设置
-itsoffset offset 设置以秒为基准的时间偏移,该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持
视频参数:
set the number of video frames to output
视频参数-其他:
-bitexact:使用标准比特率。
-vb:指定视频比特率(bit/s)
-croptop size:设置顶部切除尺寸(in pixels)
-cropleft size:设置左切除尺寸(in pixels)
-cropbottom size:设置地步切除尺寸(in pixels)
-cropright size:设置右切除尺寸(in pixels)
-padtop size:设置顶部补齐尺寸(in pixels)
-padleft size:设置左补齐尺寸(in pixels)
-padbottom size:设置地步补齐尺寸(in pixels)
-padright size:设置右补齐尺寸(in pixels)
-padcolor color:设置补齐颜色
音频参数:
set the number of audio frames to output
音频参数-其他
-ab:
设置比特率(bit/s),对于MP3的格式,
想要听到较高品质的声音,建议设置160Kbit/s(单声道80Kbit/s)以上。
字幕参数:
set frame size
高级视频参数:
-g gop_size 设置图像组大小
-intra 仅适用帧内编码
-qscale q 使用固定的视频量化标度(VBR)
-qmin q 最小视频量化标度(VBR)
-qmax q 最大视频量化标度(VBR)
-qdiff q 量化标度间最大偏差 (VBR)
-qblur blur 视频量化标度柔化(VBR)
-qcomp compression 视频量化标度压缩(VBR)
-rc_init_cplx complexity 一遍编码的初始复杂度
-b_qfactor factor 在p和b帧间的qp因子
-i_qfactor factor 在p和i帧间的qp因子
-b_qoffset offset 在p和b帧间的qp偏差
-i_qoffset offset 在p和i帧间的qp偏差
-rc_eq equation 设置码率控制方程 默认tex^qComp
-rc_override override 特定间隔下的速率控制重载
-me method 设置运动估计的方法 可用方法有 zero phods log x1 epzs(缺省) full
-dct_algo algo 设置dct的算法 可用的有 0 FF_DCT_AUTO 缺省的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
-idct_algo algo 设置idct算法。可用的有 0 FF_IDCT_AUTO 缺省的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
-er n 设置错误残留为n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE
-ec bit_mask 设置错误掩蔽为bit_mask,该值为如下值的位掩码 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
-bf frames 使用frames B 帧,支持mpeg1,mpeg2,mpeg4
-mbd mode 宏块决策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
-4mv 使用4个运动矢量 仅用于mpeg4
-part 使用数据划分 仅用于mpeg4
-bug param 绕过没有被自动监测到编码器的问题
-strict strictness 跟标准的严格性
-aic 使能高级帧内编码 h263+
-umv 使能无限运动矢量 h263+
-deinterlace 不采用交织方法
-interlace 强迫交织法编码仅对mpeg2和mpeg4有效。当你的输入是交织的并且你想要保持交织以最小图像损失的时候采用该选项。可选的方法是不交织,但是损失更大
-psnr 计算压缩帧的psnr
-vstats 输出视频编码统计到vstats_hhmmss.log
-vhook module 插入视频处理模块 module 包括了模块名和参数,用空格分开
音频/视频捕获选项
-vd device 设置视频捕获设备。比如/dev/video0
-vc channel 设置视频捕获通道 DV1394专用
-tvstd standard 设置电视标准 NTSC PAL(SECAM)
-dv1394 设置DV1394捕获
-av device 设置音频设备 比如/dev/dsp
高级选项
-map file:stream 设置输入流映射
-debug 打印特定调试信息
-benchmark 为基准测试加入时间
-hex 倾倒每一个输入包
-bitexact 仅使用位精确算法 用于编解码测试
-ps size 设置包大小,以bits为单位
-re 以本地帧频读数据,主要用于模拟捕获设备
-loop 循环输入流(只工作于图像流,用于ffserver测试)
1.获取音频/视频文件信息:
ffmpeg -i input.mp4
2.删除或修改音/视频的元数据信息:
ffmpeg -i "two.mp4" -map_metadata -1 -y "input.mp4"
#-map_metadata -1 就是清楚文件的元数据,-y 表示不用再次询问是否操作
ffmpeg -i input.mp4 -metadata artist=benarchen -metadata title="Test 1" output.mp4
#-metadata artist=benarchen 表示设置该资源的作者,-metadata title="Test 1" 是设置标题
3.去除水印(静态)
"delogo=x=1:y=1:w=100:h=30:show=0" output.mp4
4.去除多水印(静态)
"D:input.mp4" -vf
2.修改视频格式:
ffmpeg -i input.mp4 -qscale 0 -y output.mp4
#-qscale 0 参数是为了不影响资源的质量
剪切视频 对视频的剪切主要有两个,去除片头和去除片尾,FFmpeg 要去除固定时长的片头非常的简单,使用下面的命令就可以了:
ffmpeg -ss 00:03:00 -i input.mp4 -t 60 -c:v copy -c:a copy output.mp4
#-ss 00:03:00 表示从 3 分钟开始截取(也就是去除 3 分钟的开头)
#-t 60/-to 60 这里 -t 和 -to 都是一样的效果,意思是从截取开始往时间轴截取 60s
#-c:v copy -c:a copy 意思是复制源文件的编码格式,这样会比较快
#如果只是去除 3 分钟的片头可以不用加 -t 或者 -to 命令,如下:
ffmpeg -ss 00:03:00 -i input.mp4 -c:v copy -c:a copy output.mp4
还有一种情况就是在剪掉固定时长片头的同时也剪掉固定时长的片尾,FFmpeg 官方没有直接提供这中功能,一种最常用的思路是在 shell 脚本中先用 FFmpeg -i 把文件的元数据信息保留下来,再从元数据信息中提取出视频的时长,用视频的总时长减去要剪掉的开头时长后结尾时长就是我们需要的实际时长了:
#!/bin/bash
#我这里要切除的开头和结尾都是 7 秒
beg=7
end=7
#用 for 循环直接获取当前目录下的 mp4、mp3、avi 等文件循环处理,单个文件可以去掉 for 循环
for i in (*.mp4,*.mp3,*.avi ); do
#将元数据信息临时保存到 tmp.log 文件中
nohup /usr/local/ffmpeg/bin/ffmpeg -i "$i" > tmp.log
#获取视频的时长,格式为 00:00:10,10 (时:分:秒,微妙)
time="`cat /usr/local/ffmpeg/tmp.log |grep Duration: |awk '{print $2}'|awk -F "," '{print $1}'|xargs`"
echo $time
#求视频的总时长,先分别求出小时、分、秒的值,这里不处理微秒,可以忽略
hour="`echo $time |awk -F ":" '{print $1}' `"
min="`echo $time |awk -F ":" '{print $2}' `"
sec="`echo $time |awk -F ":" '{print $3}'|awk -F "." '{print $1}' `"
#echo $hour $min $sec
num1=`expr $hour * 3600`
num2=`expr $min * 60`
num3=$sec
#计算出视频的总时长(秒)
sum=`expr $num1 + $num2 + $num3`
#总时长减去开头和结尾就是截取后的视频时长,并且这里不需要再转回 hour:min:sec 的格式,直接使用结果即可
newtime=`expr $sum - $beg - $end`
echo $newtime
/usr/local/ffmpeg/bin/ffmpeg -ss 00:00:07 -i $i -t $newtime -c:v copy -c:a copy /data/tmp/$i -y
done
上面的 shell 脚本可以根据实际情况作出调整。
其他操作[4]
1.分离视频音频流
ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流
ffmpeg -i input_file -acodec copy -vn output_file_audio //分离音频流
2.视频解复用
ffmpeg –i test.mp4 –vcodec copy –an –f m4v test.264
ffmpeg –i test.avi –vcodec copy –an –f m4v test.264
3.视频转码
ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264 //转码为码流原始文件
ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264 //转码为码流原始文件
ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //转码为封装文件
//-bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制
4.视频封装
ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file
5.视频剪切
ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取图片
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi //剪切视频
//-r 提取图像的频率,-ss 开始时间,-t 持续时间
6.视频录制
ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi
7.YUV序列播放
ffplay -f rawvideo -video_size 1920x1080 input.yuv
8.YUV序列转AVI
ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi
9.视频转帧序列
ffmpeg -i split.avi %d.bmp
10.帧序列合并为视频
ffmpeg -i %d.bmp -y list.mp4
其他操作[5]
视频
1.获取视频流信息
用ffprobe可以获取到视频的所有流的具体信息
ffprobe -print_format json -show_streams -i input.mp4
1
2.多个视频拼接
可以将几个视频拼接成一个视频 -f 表示采用concat协议,-c 表示采用什么编码器 copy表示不重新编码,如果是x264 表示将采用x264进行重新编码。
ffmpeg -y -f concat -i videolist.txt -c copy output.mp4
1
3.视频截图
截一张图
-ss 表示在视频的多少S 截取一张图
ffmpeg -y -ss 8 -i input.mp4 -f image2 -vframes 1 output.jpg
1
截多张图
-r 表示每秒截多少张图; -qscale 表示生成的截图质量,该值越小图片质量越好;%5d.jpg 表示生成的截图的命令规则,5位数的整数命名。
ffmpeg -y -ss 0 -i input.mp4 -f image2 -r 1 -t 8 -qscale 1 ./jpgs/%5d.jpg
1
4.给视频加上水印图片
ffmpeg -y -i input.mp4 -i ./logo.png filter_complex "overlay=0:0:enable=between(t,0,2)" -c:v libx264 -c:a aac -strict -2 output.mp4
1
5.图片合成视频
ffmpeg -y -f image2 -framerate 10 -i ./jpgs/%05d.jpg -c:v libx264 -r 25 -pix_fmt yuv420p output.mp4
1
6.视频添加背景音乐
ffmpeg -y -i input.mp4 -i ainiyiwannian.wav -filter_complex "[0:a] pan=stereo|c0=1*c0|c1=1*c1 [a1], [1:a] pan=stereo|c0=1*c0|c1=1*c1 [a2],[a1][a2]amix=duration=first,pan=stereo|c0<c0+c1|c1<c2+c3,pan=mono|c0=c0+c1[a]" -map "[a]" -map 0:v -c:v libx264 -c:a aac -strict -2 -ac 2 output.mp4
1
7.将视频去除音频
ffmpeg -y -i source.mp4 -an -vcodec copy output.mp4
1
8.设置视频的音量
-vol 设置视频的音量,是以%为单位,500表示500%
ffmpeg -y -i source.mp4 -vol 500 -strict -2 -vcodec copy output.mp4
1
9.视频转码
-vcodec 指定视频编码器,-acodec 指定音频编码器
ffmpeg -y -i input.mp4 -vcodec libx264 -acodec copy output.mp4
音频处理
1.从视频中提取音频
ffmpeg -y -i source.mp4 -vn output.wav
2.将音频用lpcm格式重新编码,指定采样率
ffmpeg -y -i source.wav -acodec pcm_s16le -ar 44100 output.wav
目录:
1. FFmpeg简介 FFmpeg编码流程 FFmpeg混淆概念
2.FFmpeg操作参数
3.FFmpeg常用操作
参考
- ^FFmpeg操作参数: https://blog.csdn.net/leixiaohua1020/article/details/12751349
- ^FFmpeg操作参数: https://blog.csdn.net/z2066411585/article/details/81237583
- ^FFmpeg操作参数: https://www.cnblogs.com/yongfengnice/p/6778019.html
- ^操作命令 https://www.cnblogs.com/dwdxdy/p/3240167.html
- ^其他操作 https://blog.csdn.net/baohonglai/java/article/details/50535955