1.获取信息
获取到视频宽高, 时长,码率, 帧率, 编码类型, 颜色格式, 总帧数,是否有B帧,音频通道数,采样率,码率, 音频编码器名字.
ffprobe input.mp4
ffprobe -show_data input.mp4
ffprobe -show_packets input.mp4
ffprobe -show_format input.mp4
ffprobe -show_frames input.mp4
ffprobe -show_streams input.mp4
//打印帧数
ffprobe -v error -count_frames -select_streams v:0
-show_entries stream=nb_read_frames
-of default=nokey=1:noprint_wrappers=1 input.mp4
-v error这隐藏了“info”输出(版本信息等),使解析更容易。
-count_frames计算每个流的帧数,并在相应的流部分中报告。
-select_streams v:0仅选择视频流中第一条流。
-show_entries stream = nb_read_frames只显示读取的帧数。
-of default = nokey = 1:noprint_wrappers = 1将输出格式设置为默认值,不打印每个字段的键(nokey = 1),不打印节头和页脚(noprint_wrappers = 1)。
ffprobe -print_format json -show_streams input.mp4
(1)-print_format json 以json格式打印
(2)-show_streams 打印所有的流信息
2.提取音频/视频
从MP4中获取音频或视频轨道, 得到只有音频或视频的文件.
ffmpeg -i input.mp4 -an -acodec copy output.mp3
ffmpeg -i input.mp4 -vn -vcodec copy output.mp4
3.合并音频视频
把一个视频和一个音频文件合并在一起, 给视频增加上声音.
ffmpeg -i input.mp4 -i output.mp3 -map 0:v -map 1:a -shortest output.mp4
4.增加背景音乐
给视频增加一个额外的背景音乐, 可以是mp3, m4a, wav格式, 并可分别调节视频原声音和背景音乐的音量
ffmpeg -i input.avi -i input.mp3 -filter_complex
"[0:a][1:a]amerge=inputs=2[a]" -map 0:v -map "[a]"
-c:v copy -c:a libvorbis -ac 2 output.mp4
视频和音频都需要重新编码 -c:v copy -c:a libvorbis,不写使用默认编码
-c:v copy指定编码时,会报以下错误,使用默认编码不会报错,修改方式如下
[mp4 @ 00000000004f1c80] Timestamps are unset in a packet for stream 0. This is
deprecated and will stop working in the future. Fix your code to set the timesta
mps properly
[mp4 @ 00000000004f1c80] pts has no value
ffmpeg -i input.mp4 -i input.mp3 -filter_complex
"[0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,
volume=-30dB[a0];
[1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,
volume=30dB[a1];
[a0][a1]amerge=inputs=2,pan=stereo|c0<c0+c2|c1<c1+c3[outa];
[0:v]setpts=PTS-STARTPTS[outv]"
-map "[outv]" -map "[outa]" -c:a aac output.mp4
(1)amerge 合并成多声道流
(2)必须要相同数据格式aformat,相同采样率;设置channel_layouts,不然可能有警告
(3)pan过滤器
一般格式
output channel layout or number of channels | outdef | outdef
(4)c0 第一个输入的左声道,c3 第二个输入的右声道,是声道号
(5) < 表示不是去除噪音, = 会
If the ‘=’ in a channel specification is replaced by ‘<’, then the gains for that specification will be renormalized so that the total is 1, thus avoiding clipping noise.
(6) outdef 中声道号或声道名前的系数表示截取的音量
(7)默认shortest
ffmpeg -i 9.ts -i zai.mp3 -filter_complex
"[0:v]setpts=PTS-STARTPTS[outv];
[0:a]volume=-30dB[a0];
[1:a]volume=30dB[a1];
[a0][a1]amix=inputs=2:duration=shortest[outa]"
-map "[outv]" -map "[outa]" -ac 2 output.mp4
(1)amix如果都是整数采样率, 自动帮转浮点采样
Note that this filter only supports float samples (the amerge and pan audio filters
support many formats). If the amix input has integer samples then aresample will be automatically inserted to perform the conversion to float samples.
(2)支持多种参数
音量设置:
(1)在转码时设置
-vol 设置音量大小,256为标准音量。(要设置成两倍音量时则输入512,依此类推。)
(2)使用过滤器设置 -af
查看音量level:
ffmpeg -i input.mp3 -af "volumedetect" -f null /dev/null
不指定输出格式,没有输出文件
原音量
[Parsed_volumedetect_0 @ 0000000002bddd00] n_samples: 1320192
[Parsed_volumedetect_0 @ 0000000002bddd00] mean_volume: -33.9 dB
[Parsed_volumedetect_0 @ 0000000002bddd00] max_volume: -12.0 dB
[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_12db: 9
[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_13db: 6
[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_14db: 57
[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_15db: 189
[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_16db: 311
[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_17db: 603
[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_18db: 1092
2倍音量
ffmpeg -i input.mp4 i -af volume=2 output.mp4
[Parsed_volumedetect_0 @ 0000000002af45c0] n_samples: 1320960
[Parsed_volumedetect_0 @ 0000000002af45c0] mean_volume: -27.9 dB
[Parsed_volumedetect_0 @ 0000000002af45c0] max_volume: -6.2 dB
[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_6db: 9
[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_7db: 6
[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_8db: 52
[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_9db: 164
[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_10db: 346
[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_11db: 582
[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_12db: 1074
5.裁剪视频
裁剪视频的某个时间段, 可以精确裁剪和极速裁剪; 极速裁剪是根据视频的IDR帧来调节,如果视频中的IDR间距过长,则可能有很大误差, 如果IDR是一秒钟一个,你裁剪时间段的最小单位是秒, 则几乎是精确的. 精确裁剪是对视频重新编码, 精确但需要重新执行一遍.
快速裁剪
ffmpeg -ss 20 -input.mp4 -t 40 -c copy output.mp4
-ss参数在-i之前
很难做到精确裁剪,指定的开始/结束的时间戳处不是关键帧,会自动寻找最近的关键帧进行裁剪,导致裁剪的起止时间,和持续时间不精确
精确裁剪
ffmpeg -ss 10 -t 15 -accurate_seek -i input.mp4 -avoid_negative_ts 1 output.mp4
(1)精准裁剪需要重新编码 -accurate_seek 会对原视频和音频重新编码
(2)不能使用-codec copy
(3)-avoid_negative_ts 1 避免时间戳中的负数,如果要使用concat demuxer拼接视频时,加上该参数
(4) -accurate_seek速度较快,对原编码格式修改较少
ffmpeg -ss 10 -t 15 -i input.mp4 -vcodec libx264 output.mp4
或直接指定编码格式,对原视频重新编码
6.裁剪音频
裁剪音频的某个时间段, 生成新的音频文件
ffmpeg -i input.mp3 -ss 00:01:12 -t 00:01:42 -acodec copy output.mp3
7.拼接视频
把多个视频文件拼接在一起.比如有4个视频ABCD,则拼接后先播放A,然后B-C-D. 基本版本的拼接视频要分辨率一致, 专业版可以任意一个视频. 专业版可以给视频增加背景和Logo, 可以调节每个音频的音量, 是否静音,同时增加背景音乐,并设置多个视频在拼接时的转场动画等.
(1)对于非 MPEG 格式容器,但是是 MPEG 编码器(H.264、DivX、XviD、MPEG4、MPEG2、AAC、MP2、MP3 等)
All files must have the same streams (same codecs, same time base, etc.) but can be wrapped in different container formats.
file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'
ffmpeg.exe -f concat -safe 0 -i filelist.txt -c copy output.mp4
(2)If you have MP4 files, these could be losslessly concatenated by first transcoding them to MPEG-2 transport streams. With H.264 video and AAC audio, the following can be used:
ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4
All MPEG codecs (MPEG-4 Part 10 / AVC, MPEG-4 Part 2, MPEG-2 Video, MPEG-1 Audio Layer II, MPEG-2 Audio Layer III (MP3), MPEG-4 Part III (AAC)) are supported in the MPEG-TS container format, although the commands above would require some alteration (e.g., the -bsf bitstream filters will have to be changed).
(3)-filter_complex
基础版
ffmpeg -i 00.avi -i 00.avi -i 00.avi -filter_complex
"[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] concat=n=3:v=1:a=1 [v] [a]"
-map "[v]" -map "[a]" -c:v libx264 output.mp4
专业版
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex
"[0:v]scale=1080:720,setsar=sar=1[sv0];
[1:v]scale=1080:720,setsar=sar=1[sv1];
[sv0][0:a][sv1][1:a]concat=n=2:v=1:a=1" output.mp4
PAR —— Pixel Aspect Ratio 像素横纵比。表示每个像素的宽度与长度的比值。可以认为每个像素不是正方形的。
DAR —— Display Aspect Ratio 显示横纵比。最终显示的图像在长度单位上的横纵比。
SAR —— Sample Aspect Ratio 采样横纵比。表示横向的像素点数和纵向的像素点数的比值。
16:9和4:3指的是DAR,DAR和SAR之间没有必然联系。
三者之间的关系 PAR x SAR = DAR
ffmpeg
-i input1.avi -i intput2.mp4
-i input.mp3 -loop 1 -framerate 25 -t 45 -i mr.jpg
-filter_complex
"[0:v]scale='if(gt(a*sar,16/9),1280,720*iw*sar/ih)'
:'if(gt(a*sar,16/9),1280*ih/iw/sar,720)',
pad=1280:720:(ow-iw)/2:(oh-ih)/2,
setsar=sar=1,
fade=t=in:st=0:d=3:alpha=1,fade=t=out:st=12:d=3:alpha=1[sv0];
[1:v]scale='if(gt(a*sar,16/9),1280,720*iw*sar/ih)'
:'if(gt(a*sar,16/9),1280*ih/iw/sar,720)',
pad=1280:720:(ow-iw)/2:(oh-ih)/2,
setsar=sar=1,
fade=t=in:st=0:d=5:alpha=1,fade=t=out:st=25:d=5:alpha=1[sv1];
[0:a]volume=0[a0];
[sv0][sv1]concat=n=2:v=1:a=0[tempv];
[a0][1:a]concat=n=2:v=0:a=1[tempa];
[tempa][2:a]amix=inputs=2:duration=shortest[outa];
[3]scale='if(gt(a*sar,16/9),1280,720*iw*sar/ih)'
:'if(gt(a*sar,16/9),1280*ih/iw/sar,720)',
pad=1280:720:(ow-iw)/2:(oh-ih)/2,
setsar=sar=1[img];
[img][tempv]overlay=shortest=1:x=0:y=0[outv]"
-map "[outv]" -map "[outa]" output.mp4
(1)设置分辨率,scale=1080:720,setsar=sar=1,有些原视频sar!=1,任意设置分辨率会报错
(2)调节每个音频的音量, 是否静音,volume=0,设置音量,或静音
(3)增加背景音乐,需要将原音频都抽取出来拼接,再使用amix添加背景音乐,并防止背景音乐时间过长duration=shortest
(4)多个视频在拼接时的转场动画,转场是淡入淡出fade=t=in:st=0:d=5:alpha=1,fade=t=out:st=25:d=5:alpha=1(t类型,st开始时间,d持续时间,alpha设置alpha通道,可以看到背景)
(5)视频增加背景和Logo,背景图片的输入-i input.mp3 -loop 1 -framerate 25 -t 45 -i mr.jpg 必须设置循环加载和持续时间,将视频覆盖在背景之上[img][tempv]overlay=shortest=1:x=0:y=0[outv],必选设置shortest=1,背景图片是循环加载的,不然没有结束;图片缩放也要加setsar=sar=1
8.拼接音频
多个音频文件的拼接. 可以是不同的采样率的音频文件.
ffmpeg.exe -f concat -safe 0 -i filelist.txt -c copy output.mp3
ffmpeg -i "concat:input1.mp3|input2.mp3" -vcodec copy output.mp3
(1)concat可以支持不同采样率,会提高采样率
(2)很多mp3有封面,需要-vcodec copy
ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex
"[0:0] [1:0] concat=n=2:v=0:a=1 [a]" -map "[a]" output.mp3
会重新编码,速度较慢
9.裁剪画面
裁剪视频画面的某个区域, 视频的最上角是0.0; 然后设置大小后, 即可裁剪.
ffmpeg -i input.mp4 -vf crop=iw/3:ih:iw/3*2:0 -c:a copy output.mp4
10.拼接画面
多个视频画面拼接在一起。比如有abcd四个视频,可以a放左上角,b放右上角,c放左下角,d放右下角处理后的视频同时播放,可以设置每个视频的坐标,宽高,可以重叠,可以增加背景图片等
ffmpeg -i input1.ts -i input2.avi -i input3.mkv -i input4.mp4 -filter_complex
"[0:v]scale='if(gt(a*sar,16/9),960,540*iw*sar/ih)'
:'if(gt(a*sar,16/9),960*ih/iw/sar,540)',
pad=960:540:(ow-iw)/2:(oh-ih)/2,
setsar=sar=1[sv0];
[sv0]pad=1920:1080[pad0];
[1:v]scale=960:540[sv1];[pad0][sv1]overlay=960[over1];
[2:v]scale=960:540[sv2];[over1][sv2]overlay=0:540[over2];
[3:v]scale=960:540[sv3];[over2][sv3]overlay=960:540" out.mp4
11.提取视频图片
提取视频中的图片, 可以只提取第一帧, 可以间隔提取多少帧, 可以读取视频的所有帧
(1)提取第一帧
ffmpeg -i 9.ts -vf "select=between(n\,0\,0)" image.jpg
ffmpeg -i 9.ts -vf "select=between(n\,1\,10)*not(mod(n\,4))" image%03d.jpg
between(n,1,10) 在第几-第几帧之间
not(mod(n,4)) 间隔多少帧
ffmpeg -i 9.ts -ss 1 -t 5 -f image2 -vframes 40 -s 352x240 image%03d.jpg
-f 强制选择格式
-ss 从多少秒开始 支持00:00:01
-t 持续多少秒
-vframes 提取多少帧
-s 提取帧的宽高
(2)间隔提取帧
ffmpeg -i 9.ts -f image2 -vf fps=1/2 image%03d.jpeg
-vf fps 每秒取多少帧 =1 每秒取一帧 =1/2 2秒取一帧
(3)读取视频的所有帧
ffmpeg -i 9.ts -f image2 image%03d.jpeg
12.图片转视频
可以一张图片转视频, 也可以是多张图片. 设置视频的总长度, 帧率,码率. 如果是多张图片,可以设置多张图片的切换间隔.
(1)单张图片
ffmpeg -loop 1 -i input.jpg -vcodec libx264 -r 25 -b:v 300k -t 10 test.mp4
-loop 1循环读输入 0读完就不读了
(2)多张图片
ffmpeg -framerate 0.2 -r 27 -i image%03d.jpeg test.mp4
-framerate 帧率 0.2,相当于5秒显示一张图片
13.增加水印
在视频画面上叠加一张图片, 可以指定位置, 图片从左上角开始叠加到视频中,以原始大小呈现.比如APP-LOGO
//movie容器
ffmpeg -i input.mp4 -vf
"movie=watermark.png[watermark];
[in] [watermark] overlay=30:10" output.mp4
//-filter_complex
ffmpeg -i input.mp4 -i logo.png -filter_complex 'overlay=10:main_h-overlay_h-10' output.mp4
//跑马灯水印
ffmpeg -i input.mp4 -i biu.png -filter_complex
"overlay='if(gte(t,1), -w+(t-1)*200, NAN)'
:(main_h-overlay_h)/2[v]" -map "[v]" -map 0:a -c:a copy out.mp4
movie容器
ffmpeg -i input1.mp4 -vf "movie=input2.mp4:seek_point=5,
scale=500:-1, setpts=PTS-STARTPTS [over];
[in] setpts=PTS-STARTPTS [main];
[main][over]overlay=160:160" output.mp4
(1)movie容器指向 input2.mp4
(2)seek_point=5 跳转到5秒,movie 还有选择流的参数等,loop默认1
参数:https://ffmpeg.org/ffmpeg-filters.html#movie-1
(3)setpts=PTS-STARTPTS 跳转到5秒后,设置开始时间为0
(4) [in] 表示input1.mp4,不一定起名是in
14.删除水印
准确的讲是:模糊视频的某个区域, 最多可以模糊视频的4个区域, 当用户在界面上选中某个区域后, 有坐标和宽高,则用VideoEditor中的模糊方法即可模糊该区域.比如APP-LOGO
模糊单个区域
ffmpeg -i 9.ts -filter_complex
"[0:v]crop=200:45:(iw-345):90,boxblur=9[fg];[0:v][fg]overlay=(W-345):90" output.mp4
模糊多个区域
ffmpeg -i 9.ts -filter_complex
"[0:v]crop=200:45:(iw-345):90,boxblur=9[b0];
[0:v]crop=320:180:1260:845,boxblur=9[b1];
[0:v][b0]overlay=(W-345):90[over0];
[over0][b1]overlay=1260:845" output.mp4
特定区域不模糊
ffmpeg -i 9.ts -filter_complex
"[0:v]boxblur=10[bg];[0:v]crop=1500:800:210:110[fg];[bg][fg]overlay=210:110" output.mp4
15.指定时间段增加图片
你可以设置一个时间段来显示图片, 比如要在视频的第一帧显示特定的一张图片,则时间段是0--0.03秒.
ffmpeg -i input.mp4 -loop 1 -i zt.jpg -i mr.jpg -filter_complex
"[0][1]overlay=enable='bewteen(t,3,8)':shortest=1[v1];
[v1][2]overlay=enable='bewteen(t,10,18)'[v]"
-map "[v]" -map 0:a -c:a copy output.mp4
在第3-8秒添加图片zt.jpg,在第10-18秒添加图片mr.jpg
-loop 1 图片是循环添加
:shortest=1 输出视频与输入视频时长保持一致,不然图片-loop 1循环输入,将是一个死循环
设置时间段bewteen(t,0,0.03),不一定添加成功,可以设置bewteen(t,0,0.04),就可能是前两帧。
设置帧index eq(n,0),不一定添加成功,可以设置eq(n,1),也有可能是前两帧。
16.增加文字
直接给视频增加文字,但因文字需字体,我们建议先把文字转换为图片,然后叠加图片来实现,从而省去设置字体的麻烦.
ffmpeg -i input.mp4 -vf
"drawtext=fontfile=simsun.ttc
:text='国境之南':x=100:y=100:fontsize=28
:fontcolor=green:shadowy=2" output.mp4
17.缩放视频
缩放视频大小, 可以放大,或缩小.
ffmpeg -i input.mpg -s 320x240 output.mp4
-s:scale filter 后跟 宽x高
ffmpeg -i input.mpg -vf scale=320:240 output.mp4
-vf:video filter
18.压缩视频
手机里的视频一般码率很大,比如30M, 50M这样的,从而文件也就很大, 不利于上传, 我们会重新对视频编码, 调整码率,从而使视频文件大小降低很多, 此方法不建议单独使用,因为你在做其他方法带有编码的功能时候,我们会自动调整码率, 从而附带压缩的效果.
(1) -b
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M output.mp4
bitrate模式
即为固定目标码率模式(固定目标比特率模式),x264会试图让最终文件的整体码率与给定的码率相等,这会使最终文件的大小是确定的,适用于精确控制体积,但由于这是一次编码,所以画质上不如同等体积的crf,故一般配合pass参数使用。
ffmpeg -y -i input -c:v libx264 -b:v 2600k -pass 1 -c:a aac -b:a 128k -f mp4 /dev/null && \
ffmpeg -i input -c:v libx264 -b:v 2600k -pass 2 -c:a aac -b:a 128k output.mp4
//如果是 Windows 环境, /dev/null 换为 NUL,\ 换为 ^
(2) -crf
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
即 Constant Rate Factor模式,如果说QP是固定量化器,bitrate是固定文件最终大小,那么crf则是则是固定“肉眼质量”,crf可以提供跟QP一样的视觉的质量,但是文件更小。
crf是通过降低那些“不那么重要”的帧的质量做到这一切的~,“不那么重要”意思是过于耗费码率又难以用肉眼察觉的帧。省下来的码率会用在其它更有效的帧里。
(3) -qp
ffmpeg -i input.mp4 -c:v libx264 -qp 23 output.mp4
qp模式
即为固定量化值(Constant Quantizer)模式来编码视频..需要注意的是这里的量化参值为P帧的量化值..I 帧(IDR帧)和B帧的量化值又由ipratio和bpratio参数来确定..不过通常这两个参数无需手动设置。
简单点说qp模式就是:相对于压缩前的原视频来说每一个 P 帧 I 帧 B帧都会固定的损失一部分质量..损失判定是固定的.但由于I P B帧的插入是不确定的。所以最终文件的大小是无法确定的。相同视觉质量时qp模式压出的视频文件比crf模式大。
19.旋转视频
旋转视频角度, 90度, 180度, 270, 等, 也可以设置视频的元数据, 视频本身不旋转, 让在播放的时候, 旋转画面播放.
(1)画面旋转
//顺时针旋转画面90度
ffmpeg -i test.mp4 -vf "transpose=1" out.mp4
//逆时针旋转画面90度
ffmpeg -i test.mp4 -vf "transpose=2" out.mp4
//顺时针旋转画面90度再水平翻转
ffmpeg -i test.mp4 -vf "transpose=3" out.mp4
//逆时针旋转画面90度水平翻转
ffmpeg -i test.mp4 -vf "transpose=0" out.mp4
//水平翻转视频画面
ffmpeg -i test.mp4 -vf hflip out.mp4
//垂直翻转视频画面
ffmpeg -i test.mp4 -vf vflip out.mp4
transpose可以旋转,但是不能用-c:v copy,必须要重新转码
(2)元数据旋转
ffmpeg -i input.mp4 -metadata:s:v:0 rotate=90 -codec copy output.mp4
要加-codec copy,不然不生效
20.倒序
把视频从后到前处理.这样处理后的视频, 在播放的时候,就是倒序播放.
1.视频倒放,无音频
ffmpeg -i input.mp4 -filter_complex
"[0:v]reverse[v]" -map [v] -preset superfast reversed.mp4
2.视频倒放,音频不变
ffmpeg -i input.mp4 -vf reverse reversed.mp4
3.音频倒放,视频不变
ffmpeg -i input.mp4 -c:v copy -af areverse reversed_audio.mp4
4.音视频同时倒放
ffmpeg -i input.mp4 -vf reverse -af areverse -preset superfast reversed.mp4
21.加减速
把整个视频加减速处理, 比如降低一倍, 速度值的范围是0.5---2.0 ; 0.5是降低一倍, 2.0是加速播放两倍.
//减速到0.5倍
ffmpeg -i input.mp4 -filter_complex
"[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" output.mp4
//加速到2倍
fmpeg -i input.mp4 -filter_complex
"[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4
22.调整视频帧率
调节视频的帧率, 比如把本身是60帧每秒的视频, 降低到30帧.
(1)-r
ffmpeg -i input.mp4 -r 30 output.mp4
(2)-vf fps=
ffmpeg -i input.mp4 -vf fps=30 output.mp4
23.镜像视频
把视频的左边视频,镜像到右边; 或者把上半部分的视频, 镜像到下半部分.
(1)左右镜像
ffmpeg -i input.mp4 -filter_complex
"[0:v]pad=w=2*iw[main];
[0:v]hflip[overlay];
[main][overlay]overlay=x=w" output.mp4
(2)上下镜像
ffmpeg -i input.mp4 -filter_complex
"[0:v]pad=0:h=2*ih[main];
[0:v]vflip[overlay];[main][overlay]overlay=y=h" out.mp4
24.视频转码
设置视频的码率 转换编码, 或者把编码格式转换, 比如特定电子设备的视频编码是PCM+mjpeg格式, 转换为AAC+H264的格式,
ffmpeg -i input.mp4 -vcodec h264 -acodec aac -b:v 2600k -b:a 300k output.mp4
25.视频转Gif
把视频转换为gif格式的动画, 支持间隔几帧读取, 支持速度调节,缩放视频画面
(1)一般用法
ffmpeg -i input.mp4 -r 15 -vf scale = 640:-1 -f gif output.gif
(2)每一帧使用一个调色板
ffmpeg -i input.mov -filter_complex
"[0:v]fps = 15,scale = w = 640:h = -1,split [a] [b];
[a] palettegen = stats_mode = single [p];
[b] [p] paletteuse = new = 1" output.gif
文件大小最大,画面质量最好
(3)使用全局调色板
ffmpeg -i input.mp4 -filter_complex
"[0:v] fps = 15,scale = w = 640:h = -1,
setpts=0.5*PTS,select='not(mod(n,\4))',split [a] [b];
[a] palettegen = stats_mode = diff [p];
[b] [p] paletteuse = dither = floyd_steinberg" output.gif
(1)scale = w = 640:h = -1 宽=640,画面保持原始比例
(2)select='not(mod(n,\4))' 每4帧中取一帧
(3)setpts=0.5*PTS 对视频加减速来调节gif速度
(4)palettegen = stats_mode = diff
默认是full, diff模式对比与前一帧的差异,对画面中移动的物体支持较好
(5)paletteuse = dither = floyd_steinberg,
dither可以为
floyd_steinberg :最常用
sierra2_4a :默认
sierra2 :sierra2_4a的改进,速度较快,大小较小
none
bayer
heckbert
gif参考:
http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html
https://qiita.com/yusuga/items/ba7b5c2cac3f2928f040
26.MP4附带文字
在mp4文件里增加一些文字说明, 这些书名捆绑在mp4文件中, 拿到mp4文件后可以读出这些文字.比如你可以把一些配置,json说明文件, 标记字符串捆绑在mp4文件,这样服务器端或别的地方拿到这个mp4文件后, 就可以直接解析出对应的说明字符串,从而减少传送多个文件的麻烦.
ffmpeg -i input.mp4 -f ffmetadata -i in.txt -c copy -map_metadata 1 out.mp4
-f ffmetadata要写在输入文件-i in.txt之前
ffmetadata 文件格式见:
The ffmetadata format allows you to add chapters to a file.
Have a look at https://ffmpeg.org/ffmpeg-formats.html#Metadata-1 for an example.
27.获取MP4文字
读取mp4中的各种附带的字符串.
ffmpeg -i input.mp4 -f ffmetadata in.txt
ffmpeg -i input.mp4
-map_metadata 0 -map_metadata:s:v 0:s:v -map_metadata:s:a 0:s:a -f ffmetadata out.txt
(1)-map_metadata 0 全局metadata
(2)-map_metadata:s:v s表示选择
28.延迟音频
把声音比视频延后一段时间再播放.
(1)单个视频输入
ffmpeg -itsoffset 10 -i input.mp4 -map 0:v -map 0:a -c:a copy -c:v copy output.mp4
-itsoffset 要写在 -i 输入之前
(2)一个视频、一个音频输入
ffmpeg -i input.mp4 -itsoffset 10 -i audio.mp3 -map 0:v:0 -map 1:a:0 output.mp4
29.m4a转mp3
把AAC编码的m4a文件, 转换为mp3编码格式的音频文件,支持编码,通道,采样率的转换.
ffmpeg -i input.m4a -acodec libmp3lame -ab 128k -ar 48000 -ac 2 -vcodec copy output.mp3
30.mp3转m4a
把mp3格式的音频,转换为AAC编码的m4a音频.支持码率,通道,采样率的转换
ffmpeg -i input.mp3 -acodec aac -ab 128k -ar 48000 -ac 2 -vcodec copy output.m4a
-acodec 编码器
-ab 音频码率
-ac 声道数
-vcodec copy 如果mp3有封面,必须加视频选项,不然报错如下
[ipod @ 00000000003b4540] Could not find tag for codec h264 in stream #0, codec
not currently supported in container
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 0:1 --
Conversion failed!
有封面mp3信息
Input #0, mp3, from 'zai.mp3':
Metadata:
album : 脠录脡脮录脜脛炉隆陇路垄脡脮脠脣脡霉
artist : 脣茂脗露
title : 脭脵露脠脰脴脧脿路锚
Duration: 00:03:29.70, start: 0.000000, bitrate: 128 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 128 kb/s
Stream #0:1: Video: mjpeg (Baseline), yuvj444p(pc, bt470bg/unknown/unknown),
180x180, 90k tbr, 90k tbn, 90k tbc
Metadata:
comment : Cover (front)
31.音频转单通道wav
把m4a ,mp4, mp3中的声音, 转换为wav单通道的音频. (比如一些语音识别的特定格式)
ffmpeg -i input.m4a -f wav -ac 1 output.wav
ffmpeg -i input.mp4 -f wav -ac 1 output.wav
ffmpeg -i input.mp3 -f wav -ac 1 output.wav
32.音频解码为wav
把mp4, m4a ,mp3中的声音转换为wav格式, 支持码率,通道, 采样率的转换.
ffmpeg -i input.m4a -f wav -ab 128k -ar 48000 -ac 1 output.wav
ffmpeg -i input.mp4 -f wav -ab 128k -ar 48000 -ac 1 output.wav
ffmpeg -i input.mp3 -f wav -ab 128k -ar 48000 -ac 1 output.wav
额外命令
1.去除Data stream
libavutil 56. 26.100 / 56. 26.100
libavcodec 58. 48.101 / 58. 48.101
libavformat 58. 27.100 / 58. 27.100
libavdevice 58. 7.100 / 58. 7.100
libavfilter 7. 48.100 / 7. 48.100
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
libpostproc 55. 4.100 / 55. 4.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0000000000633640] Using non-standard frame rate 28/1
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'soul_master.mov':
Metadata:
major_brand : qt
minor_version : 537199360
compatible_brands: qt
creation_time : 2019-05-14T09:29:16.000000Z
Duration: 00:00:22.76, start: 0.000000, bitrate: 69409 kb/s
Stream #0:0(eng): Video: qtrle (rle / 0x20656C72), rgb24(progressive), 720x
450, 67504 kb/s, SAR 1:1 DAR 8:5, 27.51 fps, 27.51 tbr, 27506 tbn, 27506 tbc (default)
Metadata:
creation_time : 2019-05-14T09:29:16.000000Z
handler_name : Apple Video Media Handler
encoder : 脗盲庐脕卯陋
timecode : 00:00:00:00
Stream #0:1(eng): Audio: pcm_s16le (sowt / 0x74776F73), 48000 Hz, stereo, s16, 1536 kb/s (default)
Metadata:
creation_time : 2019-05-14T09:29:16.000000Z
handler_name : Apple Sound Media Handler
timecode : 00:00:00:00
Stream #0:2(eng): Data: none (tmcd / 0x64636D74), 0 kb/s (default)
Metadata:
creation_time : 2019-05-14T09:29:16.000000Z
handler_name : Time Code Media Handler
timecode : 00:00:00:00
Unsupported codec with id 0 for input stream 2
(1) 利用-filter_complex和-map
ffmpeg -i input.mp4 -filter_complex "[0:v]null[video_out];[0:a]anull[audio_out]" \
-map [video_out] -map [audio_out] output.mp4
对stream 2不做-filter_complex和-map
(2) -write_tmcd 0
ffmpeg.exe -i input.mp4 -vcodec copy -write_tmcd 0 output.mp4
如果有格式转换,例如.mov转.mp4格式,视频无法播放