FFMPEG进阶系列02-ffmpeg命令详解3

2023-11-20

ffmpeg 的封装转换

FFmpeg的封装转换部分,主要是通过libavformat这部分来完成的功能,通过libavformat库进行mux和demux操作,多媒体文件的格式有很多种,但是还是有好多demux与mux的操作参数是公用的,下面来详细介绍一下这些公用的参数:
通过查看ffmpeg的help full参数,找到AVFormatContext参数部分,在这个参数下面的所有的参数均为封装转换可使用的参数

  • avioflags: format的缓冲设置,默认为0,就是有缓冲:
  • direct: 无缓冲状态;
  • probesize: 获得文件内容的大小;
  • formatprobesiz: 设置一个获得文件内容的大小来解析文件的format;
  • fflags: 设置读取或者写出的格式的形式的标签,分为多种方式:-flush_packets,ignidx,genpts,nofillin,noparse,igndts,discardcorrupt,sortdts,keepside,fastseek,latm,nobuffer,bitexact,下面针对这些format读写方式进行一一详解;
    • flush_packets: 立即将packets数据刷新入文件中;
    • genpts: 输出是产生pts;
    • nofillin: 不填写可以精确计算缺失的值;
    • igndts: 忽略dts;
    • discardcorrupt: 丢弃损坏的帧;
    • sortdts: 尝试以dts的顺序为准输出;
    • fastseek: 快速seek,但是不够精确;
    • latm: 设置RTP MP4_LATM 生效;
    • nobuffer: 直接读取或者写出,不存buffer;
    • bitexact: 不写入随机或者不稳定的数据;
  • seek2any: 支持随意seek,这个seek可以不以keyframe为参考;
  • analyzeduration: 指定解析媒体所需要花销的时间,这里设置的值越高,解析的越准确,如果在直播中为了降低延迟,这个可以设置得低一些
  • codec_whitelist: 设置可以解析的codec的白名单;
  • format_whitelist: 设置可以解析的format的白名单;

ffmpeg的编转码

FFmpeg的编解码部分主要是通过libavcodec这个库来完成的功能,通过libavcodec库进行encode与decode操作,多媒体的编码格式种类很多,但是还是有好多基本的操作参数是共同可以设置的,下面来详细介绍一下这些公用的参数:
通过查看ffmpeg的help full参数可以看到AVCodecContext AVOptions,在这个选项下面的所有参数均为编解码可以使用的参数:

  • b: 设置音频与视频码率,可以认为是音视频加起来的码率,默认为200k;
    使用这个参数可以根据b:v设置视频码率,b:a设置音频码率;
  • ab: 设置音频的码率,默认是128k;
  • g: 设置视频GOP大小,关键帧间隔,默认是12帧一个gop
  • ar: 设置音频采样率,默认为0
  • ac: 设置音频通道数,默认为0
  • bf: 设置非B帧之间的B帧个数,默认为0
  • maxrate:最大码率设置,与bufsize一同使用即可,默认为0
  • minrate: 最小码率设置,配合maxrate与bufsize可以设置为CBR模式,平时基本没用,默认为0
  • bufsize:设置控制码率的buffer的大小,默认为0
  • keyint_min: 设置最小IDR帧间隔,默认为25
  • sc_threshold: 设置场景切换支持,默认为0
  • me_threshold: 设置运动估计阀值,默认为0
  • mb_threshold: 设置宏块阀值,默认为0
  • profile: 设置音视频的profile,默认为-99
  • level: 设置音视频的level,默认为-99
  • timecode_frame_start: 设置GOP帧的开始时间,需要在non-drop-frame默认情况下使用
  • channel_layout: 设置音频通道的布局格式
  • threads: 设置编解码等工作的线程数

ffmpeg 的基本编转码原理

ffmpeg工具主要用途为编码、解码、转码,常用ffmpeg做的为转码操作,使用ffmpeg转码主要原理为:
转码原理

通过前两节介绍的参数,可以设置转码的相关参数,如果转码操作则涉及到封装的改变,从而可以通过设置AVCodec与AVFormat的操作参数进行封装与编码的改变,下面举一个例子:ffmpeg.exe -i test.mp4 -vcodec mpeg4 -b:v 1000k -r 15 -acodec copy output.mp4
编码为mpeg4 视频码流为1000k,帧率为15,音频不变

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isom
    creation_time   : 2015-05-06T01:12:21.000000Z
    encoder         : FormatFactory : www.pcfreetime.com
  Duration: 00:00:11.01, start: 0.000000, bitrate: 2364 kb/s
    Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 968x544 [SAR 1:1 DAR 121:68], 2252 kb/
s, 25 fps, 25 tbr, 25k tbn, 25 tbc (default)
    Metadata:
      creation_time   : 2015-05-06T01:12:21.000000Z
      handler_name    : video
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
    Metadata:
      creation_time   : 2015-05-06T01:12:21.000000Z
      handler_name    : sound
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg4 (native) -> mpeg4 (native))
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
Output #0, mp4, to 'output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isom
    encoder         : Lavf58.12.100
    Stream #0:0(und): Video: mpeg4 (mp4v / 0x7634706D), yuv420p, 968x544 [SAR 1:1 DAR 121:68], q=2-31, 1000 kb/s, 15 fps
, 15360 tbn, 15 tbc (default)
    Metadata:
      creation_time   : 2015-05-06T01:12:21.000000Z
      handler_name    : video
      encoder         : Lavc58.18.100 mpeg4
    Side data:
      cpb: bitrate max/min/avg: 0/0/1000000 buffer size: 0 vbv_delay: -1
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
    Metadata:
      creation_time   : 2015-05-06T01:12:21.000000Z
      handler_name    : sound
Past duration 0.799995 too large
frame=  166 fps=0.0 q=1.6 Lsize=    1585kB time=00:00:11.00 bitrate=1180.4kbits/s dup=0 drop=107 speed=22.9x
video:1410kB audio:169kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.361811%

左边为原视频,右边为转码后的视频
如果视频转码为h264,命令使用:ffmpeg.exe -i test.mp4 -vcodec mpeg4 -b:v 1000k -r 15 -acodec copy output.mp4
mpeg4和h264对比

过滤器链(filter chain)

语法:filter chain=逗号分隔的一组filter

  • 如何实现水平翻转视频和原视频进行比较?
  1. 第一步:源视频宽带扩大两倍
    ffmpeg -i test.mp4 -t 10 -vf pad=2*iw output.mp4
    output.mp4播放效果
  2. 第二步:源视频水平翻转
    ffmpeg -i test.mp4 -t 10 -vf hflip output2.mp4
    output2.mp4水平翻转
  3. 第三步:水平翻转视频覆盖output.mp4
    ffmpeg -i output.mp4 -i output2.mp4 -filter_complex overlay=w compare.mp4
    compare.mp4效果

码率/帧率和文件大小

  • 码率和帧率是视频文件的最重要的基本特征,对于他们的特有设置会决定视频质量。如果我们知道码率和时长那么可以很容易计算出输出文件的大小。
  • 帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数。
  • 码率:比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。

帧率

  1. 用-r参数设置帧率
    格式:ffmpeg -i input -r fps output
    范例:ffmpeg-i test.mp4 -r 15 output.mp4
  2. 用fps filter设置帧率
    格式:ffmpeg -r input -vf fps=
    范例:ffmpeg.exe -i test.mp4 -vf fps=fps=25 output.mp4
  3. 帧率的预定义值:
‘ntsc’
30000/1001 
‘pal’
25/1 
‘qntsc’
30000/1001 
‘qpal’
25/1 
‘sntsc’
30000/1001 
‘spal’
25/1 
‘film’
24/1 
‘ntsc-film’
24000/1001 
  • 例如设置码率为29.97fps,下面三种方式具有相同的结果:
ffmpeg -i test.mp4 -r 29.97 output.mp4
ffmpeg -i test.mp4 -r 3000/1001 output.mp4
ffmpeg -i test.mp4 -r ntsc output.mp4

帧率和文件大小

  1. 设置码率-b参数
  • b 码率(缺省为b:v)
    ffmpeg -i test.mp4 -b 1.5M output.mp4
  • 指明 音频:-b:a 视频:-b:v
    ffmpeg -i test.mp4 -b:v 1.5M output2.mp4
    ffmpeg -i test.mp4 -b:v 1.5M -b:a 192k output2.mp4
  1. 控制输出文件大小
  • -fs(file size首字母缩写) (作用不明显,基本可以说没用)
  • ffmpeg -i test.mp4 -fs 1M output.mp4
  1. 计算输出文件大小
  • (视频码率+音频码率)*时长/8 = 文件大小

调整视频分辨率

调整视频分辨率

  1. 用-s 或**-video_size**参数设置视频分辨率,参数值WxH, W宽度单位是像素,H高度单位是像素
    ffmpeg -i test.mp4 -s 320x240 output.mp4
  2. 预定义的视频尺寸
  • 下面两条命令具有相同效果
    ffmpeg -i test.mp4 -s 640x480 output.mp4
    ffmpeg -i test.mp4 -s vga output.mp4
  • 下面列出了所有的预定义尺寸
‘ntsc’
720x480 
‘pal’
720x576 
‘qntsc’
352x240 
‘qpal’
352x288 
‘sntsc’
640x480 
‘spal’
768x576 
‘film’
352x240 
‘ntsc-film’
352x240 
‘sqcif’
128x96 
‘qcif’
176x144 
‘cif’
352x288 
‘4cif’
704x576 
‘16cif’
1408x1152 
‘qqvga’
160x120 
‘qvga’
320x240 
‘vga’
640x480 
‘svga’
800x600 
‘xga’
1024x768 
‘uxga’
1600x1200 
‘qxga’
2048x1536 
‘sxga’
1280x1024 
‘qsxga’
2560x2048 
‘hsxga’
5120x4096 
‘wvga’
852x480 
‘wxga’
1366x768 
‘wsxga’
1600x1024 
‘wuxga’
1920x1200 
‘woxga’
2560x1600 
‘wqsxga’
3200x2048 
‘wquxga’
3840x2400 
‘whsxga’
6400x4096 
‘whuxga’
7680x4800 
‘cga’
320x200 
‘ega’
640x350 
‘hd480’
852x480 
‘hd720’
1280x720 
‘hd1080’
1920x1080 
‘2k’
2048x1080 
‘2kflat’
1998x1080 
‘2kscope’
2048x858 
‘4k’
4096x2160 
‘4kflat’
3996x2160 
‘4kscope’
4096x1716 
‘nhd’
640x360 
‘hqvga’
240x160 
‘wqvga’
400x240 
‘fwqvga’
432x240 
‘hvga’
480x320 
‘qhd’
960x540 
‘2kdci’
2048x1080 
‘4kdci’
4096x2160 
‘uhd2160’
3840x2160 
‘uhd4320’
7680x4320 

scale filter调整分辨率

  • scale filter的优点是可以使用一些额外的参数
  • 语法: scale=width:height[:interl={1|-1}]
  • 下表列出了常用的额外参数
    常用的额外参数

1.下面两条命令有相同效果
ffmpeg -i input.mp4 -s 320x240 output.mp4
ffmpeg -i input.mp4 -vf scale=320:240 output.mp4
2. 输出视频为源视频的宽高的一半大小
ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4
3. 输出视频为源视频的宽高的90%
ffmpeg -i input.mp4 -vf scale=iw0.9:ih0.9 output.mp4
4. 在未知视频的分辨率时,保证调整的分辨率与源视频有相同的横纵比

  • 例如宽度固定400,高度成比例:
    ffmpeg -i input.mp4 -vf scale=400:400/a
    ffmpeg -i input.mp4 -vf scale=400:-1
  • 相反地,高度固定300,宽度成比例:
    ffmpeg -i input.mp4 -vf scale=300*a:300
    ffmpeg -i input.mp4 -vf scale=-1:300

裁剪/填充视频

裁剪视频crop filter

从输入文件中选取你想要的矩形区域到输出文件中,常见用来去视频黑边。 语法:crop:ow[:oh[:x[:y:[:keep_aspect]]]]   

举例

  • 裁剪输入视频的左三分之一,中间三分之一,右三分之一:
      ffmpeg -i input -vf crop=iw/3:ih:0:0 output
      ffmpeg -i input -vf crop=iw/3:ih:iw/3:0 output
      ffmpeg -i input -vf crop=iw/3:ih:iw/3*2:0 output
      *注意:":"是连续的,没有空格

  • 裁剪帧的中心, 当我们想裁剪区域在帧的中间时,裁剪filter可以跳过输入x和y值,他们的默认值是
    Xdefault = ( input width - output width)/2 ,
    Ydefault = ( input height - output height)/2
    ffmpeg -i input_file -v crop=w:h output_file
    裁剪中间一半区域:
    ffmpeg -i input -vf crop=iw/2:ih/2 output
    裁剪后的示例

  • 比较裁剪后的视频和源视频比较
    ffplay -i input.mp4 -vf split[a][b];[a]drawbox=x=(iw-300)/2:(ih-300)/2:w=300:h=300:c=yellow[A];[A]pad=2iw[C];[b]crop=300:300:(iw-300)/2:(ih-300)/2[B];[C][B]overlay=w2.4:40
    裁剪对比

自动检测裁剪区域

  • cropdetect filter 自动检测黑边区域

ffplay input.mp4 -vf cropdetect

[Parsed_cropdetect_0 @ 12922cc0] x1:0 x2:967 y1:0 y2:543 w:960 h:544 x:4 y:0 pts:2000 t:0.080000 crop=960:544:4:0
[Parsed_cropdetect_0 @ 12922cc0] x1:0 x2:967 y1:0 y2:543 w:960 h:544 x:4 y:0 pts:3000 t:0.120000 crop=960:544:4:0
[Parsed_cropdetect_0 @ 12922cc0] x1:0 x2:967 y1:0 y2:543 w:960 h:544 x:4 y:0 pts:4000 t:0.160000 crop=960:544:4:0
[Parsed_cropdetect_0 @ 12922cc0] x1:0 x2:967 y1:0 y2:543 w:960 h:544 x:4 y:0 pts:5000 t:0.200000 crop=960:544:4:0

得到 crop=960:544:4:0
然后用检测到的值来裁剪视频
ffplay input.mp4 –vf crop=960:544:4:0

填充视频(pad)

说明:在视频帧上增加一快额外额区域,经常用在播放的时候显示不同的横纵比
语法:pad=width[:height:[:x[:y:[:color]]]]

  • 创建一个30个像素的粉色宽度来包围源图片:
    ffmpeg -i input.png -vf pad=iw+60:ih+60:30:30:pink output.png
    图片对比

  • 同理可以制作testsrc视频用30个像素紫色包围视频:  
    ffmpeg -i input.mp4 -vf pad=iw+60:ih+60:30:30:purple output.mp4
    紫色填充

视频纵横比4:3到16:9

1. 4:3到16:9

  • 一些设备只能播放16:9的横纵比,4:3的横纵比必须在水平方向的两边填充成16:9,高度被保持,宽度等于高度乘以16/9,x(输入文件水平位移)值由表达式(output_width - input_width)/2来计算。
  • 4:3到16:9的通用命令是:  
    ffmpeg -i input -vf pad=ih*16/9:ih :(ow-iw)/2:0:color output
  • 举例,对比以下两条命令:
    ffplay -f lavfi -i testsrc
    ffplay -f lavfi -i testsrc -vf pad=ih*16/9:ih:(ow-iw)/2:0:pink 对比结果

2. 16:9到4:3

  • 为了用4:3的横纵比来显示16:9的横纵比,填充输入文件的垂直两边,宽度保持不变,高度是宽度的3/4,y值(输入文件的垂直偏移量)是由一个表达式(output_height-input_height)/2计算出来的。
  • 16:9到4:3的通用命令:  
    ffmpeg -i input -vf pad=iw :iw*3/4:0:(oh-ih)/2:color output
  • 举例:
    ffplay Titanic.ts -vf pad=iw:iw*3/4:0:(oh-ih)/2:pink 4:3填充

翻转和旋转

翻转

  • 水平翻转语法: -vf hflip:  
    ffplay -f lavfi -i testsrc -vf hflip
  • 垂直翻转语法 -vf vflip:  
    ffplay -f lavfi -i testsrc -vf vflip
    翻转

旋转

  • 语法:transpose={0,1,2,3}
      0:逆时针旋转90°然后垂直翻转
      1:顺时针旋转90°
      2:逆时针旋转90°
      3:顺时针旋转90°然后水平翻转
  • 示例
    ffplay -f lavfi -i testsrc -vf transpose=0
    ffplay -f lavfi -i testsrc -vf transpose=1
    ffplay -f lavfi -i testsrc -vf transpose=2
    ffplay -f lavfi -i testsrc -vf transpose=3
    对比

模糊,锐化

模糊

  • 语法:
    boxblur=luma_r:luma_p[:chroma_r:chram_p[:alpha_r:alpha_p]] ,
  • 用例:
    ffplay -f lavfi -i testsrc -vf boxblur=1:10:4:10
    ffplay -f lavfi -i testsrc -vf boxblur=1:1:1:2

注意:luma_r和alpha_r半径取值范围是0~min(w,h)/2, chroma_r半径的取值范围是0~min(cw/ch)/2

锐化

  • 语法:
    -vf unsharp=l_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount,
    所有的参数是可选的,默认值是5:5:1.0:5:5:0.0
      l_msize_x:水平亮度矩阵,取值范围3-13,默认值为5
      l_msize_y:垂直亮度矩阵,取值范围3-13,默认值为5
      l_amount:亮度强度,取值范围-2.0-5.0,负数为模糊效果,默认值1.0
      c_msize_x:水平色彩矩阵,取值范围3-13,默认值5
      c_msize_y:垂直色彩矩阵,取值范围3-13,默认值5
      c_amount:色彩强度,取值范围-2.0-5.0,负数为模糊效果,默认值0.0
  • 举例
    • 使用默认值,亮度矩阵为5x5和亮度值为1.0  
      ffplay -f lavfi -i testsrc -vf unsharp
      锐化

    • 高斯模糊效果(比较强的模糊):  
      ffplay -f lavfi -i testsrc -vf unsharp=13:13:-2
      锐化

覆盖(画中画)

覆盖,

  • 语法:overlay[=x[:y], 所有的参数都是可选,默认值都是0

  • 举例
    Logo在左上角:  
    ffmpeg -i input.mp4 -i logo.png -filter_complex overlay pair1.mp4

ffmpeg -i input.mp4 -i logo.png -filter_complex “[1:v][0:v]scale2ref=(iw/ih)*ih/8/sar:ih/8[wm][base];[base][wm]overlay=10:10” pair11.mp4

ffmpeg -i Titanic.ts -i logo.png -filter_complex “[1:v][0:v]scale2ref=(iw/ih)*ih/8/sar:ih/8[wm][base];[base][wm]overlay=10:10” pair12.mp4

ffmpeg -i Titanic.ts -i logo.png -filter_complex “[1:v][0:v]scale2ref=ih/8/sar:ih/8[wm][base];[base][wm]overlay=10:10” pair13.mp4

右上角:    
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4
左下角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h pair2.mp4
右下角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h pair2.mp4

删除logo

  • 语法:-vf delogo=x:y:w:h[:show]
        x:y 离左上角的坐标
        w:h logo的宽和高
        show:若设置为1有一个绿色的矩形,默认值0.
  • 举例
    ffplay -i pair1.mp4 -vf delogo=5:5:60:60:1

ffplay -i pair1.mp4 -vf delogo=5:5:60:60:0

添加文本

  • 语法:drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]
  • 常用的参数值
    x:离左上角的横坐标
    y: 离左上角的纵坐标  
    fontcolor:字体颜色  
    fontsize:字体大小  
    text:文本内容
    textfile:文本文件  
    t:时间戳,单位秒  
    n:帧数开始位置为0  
    draw/enable:控制文件显示,若值为0不显示,1显示,可以使用函数
  • 简单用法
    1. 在左上角添加Welcome文字
      ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom

    2. 在中央添加Good day
      ffplay -f lavfi -i color=c=pink -vf drawtext=“fontfile=arial.ttf:text=‘Goodday’:x=(w-tw)/2:y=(h-th)/2”

    3. 设置字体颜色和大小
      ffplay -f lavfi -i color=c=white -vf drawtext=“fontfile=arial.ttf:text=‘Happy Holidays’:x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30”

动态文本

用 t (时间秒)变量实现动态文本

  1. 顶部水平滚动
    ffplay -i input.mp4 -vf drawtext=“fontfile=arial.ttf:text=‘Dynamic RTL text’:x=w-t*50:fontcolor=darkorange:fontsize=30” image.png

  2. 底部水平滚动
    ffplay -i input.mp4 -vf drawtext=“fontfile=arial.ttf:text=‘Dynamic RTL text’:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30”

  3. 垂直从下往上滚动
    ffplay input.mp4 -vf drawtext=“fontfile=arial.ttf:text=‘Dynamic RTL text’:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30”

  4. 实现右上角显示当前时间?

    • 动态文本 在右上角显示当前时间 localtime
      ffplay input.mp4 -vf drawtext=“fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text=’%{localtime:%H\:%M\:%S}’”

    • 每隔3秒显示一次当前时间
      ffplay input.mp4 -vf drawtext=“fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text=’%{localtime:%H\:%M\:%S}’:enable=lt(mod(t,3),1)” image.png

图片处理

图片支持

FFmpeg支持绝大多数图片处理, 除LJPEG(无损JPEG)之外,其他都能被解码,除了EXR,PIC,PTX之外,所有的都能被编码。

  • 截取一张图片使用 -ss(seek from start)参数:  
    ffmpeg -i input.mp4 -ss 00:00:02 image.jpg

  • 从视频中生成GIF图片
    ffmpeg -i input.mp4 -t 2 -pix_fmt rgb24 test.gif test.gif

  • 转换视频为图片(每帧一张图):  
    ffmpeg -i input.mp4 frame%4d.jpg

  • 图片转换为视频:  
    ffmpeg -f image2 -i frame%4d.jpg -r 25 video.mp4

  • 裁剪:  
    ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rg.png

  • 填充:  
    ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg

  • 翻转:  
    ffmpeg -i orange.jpg -vf hflip orange_hfilp.jpg
    ffmpeg -i orange.jpg -vf vflip orange_vfilp.jpg

  • 旋转:  
    ffmpeg -i image.png -vf transpose=1 image_rotated.png
    覆盖:  
    ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb.png image.png

ffmpeg -f lavfi -i smptebars smpte.png image.png

ffmpeg -i rgb.png -i smpte.png -filter_complex overlay=(W-w)/2:(H-h)/2 rgb_smpte.png image.png

其他高级技巧

屏幕录像

  • 显示设备名称
    ffmpeg -list_devices 1 -f dshow -i dummy
[dshow @ 0136d680] DirectShow video devices (some may be both video and audio devices)
[dshow @ 0136d680]  "Integrated Webcam"
[dshow @ 0136d680]     Alternative name "@device_pnp_\\?\usb#vid_0bda&pid_5689&mi_00#6&233dd6c7&0&0000#{65e8773d-8f56-11
d0-a3b9-00a0c9223196}\global"
[dshow @ 0136d680]  "screen-capture-recorder"
[dshow @ 0136d680]     Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}\{4EA6930A-2C8A-4AE6-A561-56E4
B5044439}"
[dshow @ 0136d680] DirectShow audio devices
[dshow @ 0136d680]  "楹﹀厠椋?(Realtek Audio)"
[dshow @ 0136d680]     Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2BC3D9A6-4A74-4179-9DDC
-3E0B44B5FA5E}"
[dshow @ 0136d680]  "virtual-audio-capturer"
[dshow @ 0136d680]     Alternative name "@device_sw_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\{8E14549B-DB61-4309-AFA1-3578
E927E935}"
dummy: Immediate exit requested

获取到摄像头为:“Integrated Webcam”
屏幕录制为:“screen-capture-recorder”

  • 调用摄像头
    ffplay -f dshow -i video=“Integrated Webcam”

  • 保存为文件
    ffmpeg -y -f dshow -s 320x240 -i video=“Integrated Webcam” -r 25 -b:v 800K -vcodec mpeg4 new.mp4 new.mp4

  • 添加字幕subtitles

    • 语法 -vf subtitles=file,  
      ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4
  • 视频颤抖:

ffplay -i input.mp4 -vf crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2+((in_h-out_h)/2)*sin(n/7)
  • 色彩平衡:  
    ffplay -i input.mp4 -vf curves=vintage
  • 色彩变幻:
ffplay -i input.mp4 -vf hue="H=2*PI*t:s=sin(2*PI*t)+1"

  • 速度:
    1. 3倍视频播放视频:
      ffplay -i input.mp4 -vf setpts=PTS/3
    2. 3/4速度播放视频:  
      ffplay -i input.mp4 -vf setpts=PTS/(3/4)
    3. 2倍速度播放音频:  
      ffplay -i input.mp3 -af atempo=2
  • 截图
    1. 每隔一秒截一张图:  
      ffmpeg -i input.mp4 -f image2 -vf fps=fps=1 out%d.png
    2. 每隔20秒截一张图:  
      ffmpeg -i input.mp4 -f image2 -vf fps=fps=1/20 out%d.png
  • 多张截图合并到一个文件里(3_2),每隔一千帧(秒数=1000/fps25)即40s截一张图
      ffmpeg -i input.mp4 -frames 3 -vf “select=not(mod(n,1000)),scale=320:240,tile=3_2” out.png

马赛克视频

  • 用多个输入文件创建一个马赛克视频:
ffmpeg  -i cuc_ieschool.flv -i  input.mp4 -i Titanic.ts -i ds.mov -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240" -c:v libx264 output.mkv

Logo动态移动

  • 2秒后logo从左到右移动:  
    ffplay -i ds.mov -vf movie=logo.png[logo];[in][logo]overlay=x=‘if(gte(t,2),((t-2)*80)-w,NAN)’:y=0

  • 2秒后logo从左到右移动后停止在左上角:

ffplay -i cuc_ieschool.flv  -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(((t-2)*80)-w\,W)\,0\,((t-2)*80)-w)':y=0
  • 每隔10秒两个logo交替出现:
ffmpeg -y -t 60 -i cuc_ieschool.flv -i logo.png -i logo2.png -filter_complex "overlay=x=if(lt(mod(t\,20)\,10)\,10\,NAN):y=10,overlay=x=if(gt(mod(t\,20)\,10)\,W-w-10\,NAN ) :y=10" overlay.mp4

更多资料,更多分享

音视频技术交流群1 已满
音视频技术交流群2 已满
音视频技术交流群3 群号782508536

最新文章请关注以下专栏:
简书专栏:https://www.jianshu.com/nb/29979868
知乎专栏:https://zhuanlan.zhihu.com/multimedia

参考

[1] ffmpeg:编解码过程,基本用法
[2] http://www.ffmpeg.org/ffmpeg-utils.html
[3] FFmpeg Filters官方文档

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FFMPEG进阶系列02-ffmpeg命令详解3 的相关文章

  • 使用 Ffmpeg 编辑视频元数据

    我想更改视频元数据 原始视频信息 ffmpeg i video mp4 Metadata major brand mp42 minor version 0 compatible brands isomavc1mp42 creation ti
  • ffmpeg:音频样本的字节顺序

    我使用 ffmpeg 的 avcodec 从我的 C 应用程序中的音乐文件中检索原始音频样本 对于我测试的文件 这些文件样本的字节序似乎是小字节序 但我想知道对于我尝试解码的所有文件是否总是如此 即来自 ffmpeg 的实现或至少它的体系结
  • Python 子进程(ffmpeg)仅在我按 Ctrl-C 程序时启动?

    我正在尝试使用 Cygwin 和 Python 2 7 并行运行一些 ffmpeg 命令 这大概是我所拥有的 import subprocess processes set commands ffmpeg i input mp4 outpu
  • 在 macOS 上为 MoviePy 安装 ffmpeg 失败并出现 SSL 错误

    我正在尝试编写一个 Python 程序 在 Mac OS 10 11 16 上使用 MoviePy 将 MP4 文件转换为 GIF 我用 import moviepy editor as mp 我收到一条错误消息 说我需要打电话imagei
  • 从 ffmpeg 获取实时输出以在进度条中使用(PyQt4,stdout)

    我已经查看了很多问题 但仍然无法完全弄清楚 我正在使用 PyQt 并且希望能够运行ffmpeg i file mp4 file avi并获取流式输出 以便我可以创建进度条 我看过这些问题 ffmpeg可以显示进度条吗 https stack
  • Bash 脚本:自动为 mpeg-dash 进行 ffmpeg 编码

    我正在编写一个 bash 文件来创建视频编码和串联 以供 dash 实时流媒体使用 基本上 它读取输入视频文件夹 将所有视频编码为三种分辨率格式 然后将它们连接起来创建三个适应集 DIAGRAM 该脚本检查 fps 一致性 如果输入不是 1
  • 使用 Coldfusion 的 CFFILE 标签监控 FFMpeg 的进度日志

    我想学习如何使用 ColdFusion 中的 CFFILE 标签来读取文本文件的内容 就我而言 该文本文件是 FFMpeg 在对媒体文件进行转码时生成的进度日志 我想编写一个 ColdFusion 脚本 该脚本将定期轮询进度日志 直到日志表
  • 转换为 JPEG 时 HEIC 切片损坏

    我在将 HEIC 图像转换为 jpeg 时遇到问题 HEIC 文件是使用运行最新 iOS 公共测试版的 iPhone 拍摄的图像 我正在使用诺基亚提供的库 https github com nokiatech heif 要解析文件并从 HE
  • 如何在服务器上使用 ffmpeg 从 WebRTC 流获取音频和视频

    我正在尝试从 WebRTC 流获取音频和视频 并在 ubuntu 服务器上使用 ffmpeg 处理它 转码或转储 我天真地期望它能简单地解释 WebRTC 提供的 sdp 但我错了 我怀疑 ffmpeg 无法发回答案 sdp 必须手动完成
  • 如何在 RTMP 流中嵌入 pic_timing SEI 挂钟时间码?

    我需要将我的桌面流式传输到 AWS MediaLive 服务 并且根据要求 我必须在流中包含挂钟时间码 AWS 支持人员善意地通知我 对于 h 264 编码流 我需要提供时间码作为 pic timing SEI 消息 我在 Windows
  • FFmpeg av_read_frame 无法正确读取帧?

    好吧 我已经下载了一些 yuv 格式的原始 UHD 序列 并在 mp4 容器中使用 ffmpeg 对其进行编码 h264 4 4 4 100 质量 25fps 当我使用 ffprobe 找出编码了多少帧时 我得到 600 所以这是 24 秒
  • ffmpeg 配置复杂过滤器时出错

    ffmpeg 命令存在一些问题 也许有人可以指出我正确的方向 我使用此链接来构建我的命令 那么问题 https stackoverflow com questions 7333232 how to concatenate two mp4 f
  • 如何从 ffmpeg 中打开的文件获取流信息?

    我正在尝试使用 ffmpeg 读取视频文件 我有与其旧版本相对应的工作代码 并开始尝试升级到最新的构建版本 将所有这些已弃用的函数替换为其实际的类似函数 但是我遇到了问题 似乎没有检索到任何流 并且视频负载停止在轨道中 这是我正在使用的代码
  • 如何在不指定像素格式的情况下从 AVFrame.data[] 和 AVFrame.linesize[] 获取原始帧数据?

    我的总体想法是frame data 根据视频的像素格式 RGB 或 YUV 进行解释 但是有没有通用的方法可以从帧中获取所有像素数据 我只想计算帧数据的哈希值 而不解释它来显示图像 根据 AVFrame h uint8 t AVFrame
  • 如何将H264封装到mp4容器中?

    我有一个程序生成一堆原始 H264 帧 并希望将其放入 mp4 容器中进行流式传输 有人知道该怎么做吗 我想我会使用 ffmpeg 然而 这需要商业使用 而且 ffmpeg 似乎只能通过它的 x264 库来做到这一点 它使用 GPL 许可证
  • ffmpeg 找不到 vcodec h264

    我是 ffmpeg 的新手 正在 Windows 上使用它 我尝试使用 H 264 vcodec h264 转换 avi 文件 收到此错误 未知编码器 h264 使用 acodec 的 mp3 也会出现 未知编码器 错误 有人可以帮我解决这
  • 输入文件列表以与 Node.js 模块 Fluent-ffmpeg 连接

    版本信息 流利的 ffmpeg 版本 2 1 2 ffmpeg版本 3 4 2 操作系统 Windows 10 要重现的代码 ffmpeg C path to list txt mergeToFile C path to out mp4 C
  • 用于 Windows Phone 开发的 FFmpeg

    我在 ASP Net 基于 Web 的应用程序中使用了 FFmpeg 现在我想用它来进行Windows Phone开发 可以使用吗 如果是 那么如何 Windows Phone 7 根本不支持 FFmpeg 而且据我在网上找到的信息 Win
  • 使用 ImageMagick 有效地将线扫描图像拼接在一起

    我正在寻找线扫描相机的替代品 用于体育计时 或者更确切地说 用于需要确定位置的部分 我发现普通工业相机可以轻松与商业相机解决方案的速度相匹配 每秒 gt 1000 帧 对于我的需求来说 通常计时的准确性并不重要 重要的是运动员的相对位置 我
  • 在 Mac 操作系统上使用 ffmpeg 录制视频

    我想在 mac OS 上使用 ffmpeg 以任何格式录制实时网络摄像头视频 我尝试了很多 但无法找到用于重新编码视频的命令 所以请任何人都可以告诉我 ffmpeg 命令用于使用 Mac 操作系统的网络摄像头捕获视频 提前致谢 对于 Mac

随机推荐

  • 程序员的浪漫—利用Matlab 实现圣诞树动态显示

    一 前言 圣诞节是基督教纪念耶稣诞生的重要节日 亦称耶稣圣诞节 主降生节 天主教亦称耶稣圣诞瞻礼 耶稣诞生的日期 圣经 并无记载 公元336年罗马教会开始在12月25日过此节 12月25日原是罗马帝国规定的太阳神诞辰 有人认为选择这天庆祝圣
  • MES11大标准模块(ISA95)

    1 资源分配及状态管理 ResourceAllocationandStatus 该功能管理机床 工具 人员物料 其它设备以及其它生产实体 满足生产计划的要求对其所作的预定和调度 用以保证生产的正常进行 提供资源使用情况的历史记录和实时状态信
  • vue3手动封装一个点击滚动,左右切换的商品展示效果图,纯js

    展示效果 效果图如下 默认展示第一张图片 只有两边有按钮切换 也可以点击图片切换 点击的图片从第三个开始时居中显示 分析一波 从底部的第三张图片开始到末尾的第八张图片都是居中显示 点击左右要进行切换 也要居中显示 所以我在这里用的的时在X轴
  • Linux Gadget驱动分析

    以下四篇文章需要互相补充 可以理解的较为详细 http blog sina com cn s blog 1519163d30102x2le html https www cnblogs com haoxing990 p 8799133 ht
  • C++:指向类的成员的指针

    引 想必接触过C的朋友们对C语言中指针的概念已经有了深入的了解 如果初步进行了解的朋友可以看一下 C语言基础学习笔记 指针展开来讲的基本知识点包括 指针的概念 指针的定义和初始化及简单使用 指针函数和函数指针 有关指针函数和函数指针的内容上
  • matlab_数据拟合

    多项式拟合 polyfit X Y N 多项式拟合 返回降幂排列的多项式系数 polyval P xi 计算多项式的值 function example x y P polyfit x y 3 xi 0 0 2 10 yi polyval
  • 小波变换详解

    小波变换详解 1 简介 We can use the Fourier Transform to transform a signal from its time domain to its frequency domain The peak
  • 微信聊天记录导出为电脑txt文件教程

    本文的最终目的是将手机微信的聊天记录导出到电脑里 变成txt文本文件 然后对其进行分析 网上有一些工具也可以完成这个功能 但是基本都是付费的 手动操作的话 找了很多的博客 基本没有完全有效的 最终找到一篇很靠谱的教程 小米手机提取微信聊天记
  • Spark Sql之dropDuplicates去重

    文章目录 算子介绍 示例 问题 解决 dropDuplicates和distinct 参考 算子介绍 dropDuplicates去重原则 按数据行的顺序保留每行数据出现的第一条 dropDuplicates 在Spark源码里面提供了以下
  • PCL测试程序(兔子)

    程序 include
  • vue+diff:计算两个时间的差值diff方法momentjs和dayjs

    前言 在项目中计算时间的时候 会遇到一个问题 那就是日期跨天问题 我们的开始时间和结束时间拿到了毫秒 然后时间 比如 11 50 1 50 这个如果按小时来算 就没有到1天 24小时 但是他又是过了一天 所以会需要这个diff计算 具体操作
  • 在聚会中常玩数七的游戏,七的倍数和带有七的数字都不能说,比如14,27,28。请找出1~100的不能说的数字。...

    利用ES5的filter高阶函数来实现 var arr 1 2 3 4 5 6 7 17 27 21 22 28 100 r arr filter function x return x 10 7 x 7 0 alert r 7 14 17
  • 在python中创建excel文件并写入数据

    python的包xlwt和xlsxwriter都是比较方便创建excel文件并写入数据的 工具 python3 0 首先 需要安装好相应的包 pip install xlwt 或pip install xlsxwriter xlwt中 通过
  • 谈谈JS异步处理(Promise、generator、async)

    大家都知道nodejs很快 为什么会这么快呢 原因就是node采用异步回调的方式来处理需要等待的事件 使得代码会继续往下执行不用在某个地方等待着 但是也有一个不好的地方 当我们有很多回调的时候 比如这个回调执行完需要去执行下个回调 然后接着
  • Jira、Confluence 备份 迁移

    Jira 备份 迁移 全量打包文件和数据库 将打包好的文件放到迁移的服务器 创建数据库排序规则为utf8 bin并导入备份脚本 服务器创建jira用户 gt useradd jira jira服务文件夹赋权 gt chown R jira
  • Vue中的import from

    Vue中的import from 大家都知道 import from 是用来引入一些文件的 在vue中 可能有 js文件 json文件 vue文件 在JS和JSON文件引入的时候 往往需要写入一些 例如数组 export const a 例
  • JavaScript string中includes、startsWith和endsWith的使用

    文章目录 前言 一 includes 二 startsWith 三 endsWith 总结 前言 JavaScript string的这三个方法都是根据参数返回true或false 一 includes includes 方法判断一个字符串
  • 3D点云处理:Opencv Pcl实现深度图转点云(附源码)

    文章目录 0 测试效果 1 代码实现 文章目录 3D视觉个人学习目录 0 测试效果 处理结果 1 代码实现 文章中提供的深度图像 深度图像一般以 tiff和 png保存 可以通过Opencv中的 c v i m r
  • docker入门---最全笔记

    前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识 有兴趣的小伙伴可以关注一下 也许一个人独行 可以走的很快 但是一群人结伴而行 才能走的更远 让我们在成长的道路上互相学习 让我们共同进步 欢迎关注 目录 前言 一 D
  • FFMPEG进阶系列02-ffmpeg命令详解3

    文章目录 ffmpeg 的封装转换 ffmpeg的编转码 ffmpeg 的基本编转码原理 过滤器链 filter chain 码率 帧率和文件大小 帧率 帧率和文件大小 调整视频分辨率 调整视频分辨率 scale filter调整分辨率 裁