FFmpeg基本使用(短视频SDK基本免费功能实现)

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

https://ffmpeg.org/ffmpeg-filters.html#pan-1

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)支持多种参数

https://ffmpeg.org/ffprobe-all.html#amix

音量设置:

(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格式,视频无法播放

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • [TOC] 音视频&流媒体 是什么促使我要写这一篇音视频入门文章?那是因为和一妹子打赌码率的概念,结果输了;对一个...
    AllenWu阅读 4,785评论 1 25
  • ### YUV颜色空间 视频是由一帧一帧的数据连接而成,而一帧视频数据其实就是一张图片。 yuv是一种图片储存格式...
    天使君阅读 3,247评论 0 4
  • 因为正在学习音视频,从当当买了关于FFmpeg的书,在家补充知识。遇到了一些命令行的使用,我把它从书上移到笔记上,...
    请叫我果爸阅读 14,535评论 0 18
  • 最近在学习一些底层逻辑,不管是人生的还是事业的。碰巧有小伙伴推荐了人生算法,很有趣的思考。 上帝不会安排每个人的命...
    杰操哥说阅读 519评论 0 0
  • 这是心灵对话写作小组第13篇文章。 今天的表现自己非常满意,竟然把一个高1米2宽1.4米的大书柜...
    福提之路阅读 515评论 6 1