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

2023-11-10

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/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

  

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

2.控制输出文件大小

  • -fs(file size首字母缩写) (作用不明显,基本可以说没用)

  • ffmpeg -i test.mp4 -fs 1M output.mp4

3.计算输出文件大小

  • (视频码率+音频码率)*时长/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 splita;[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];Coverlay=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:vscale2ref=(iw/ih)*ih/8/sar:ih/8wm;baseoverlay=10:10" pair11.mp4

ffmpeg -i Titanic.ts -i logo.png -filter_complex "1:vscale2ref=(iw/ih)*ih/8/sar:ih/8wm;baseoverlay=10:10" pair12.mp4

ffmpeg -i Titanic.ts -i logo.png -filter_complex "1:vscale2ref=ih/8/sar:ih/8wm;baseoverlay=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"
    

  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)"

图片处理

图片支持

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

    ffmpeg -f lavfi -i smptebars smpte.png

ffmpeg -i rgb.png -i smpte.png -filter_complex overlay=(W-w)/2:(H-h)/2 rgb_smpte.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];inoverlay=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(mo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 使用 FFMPEG 的 HLS FLAC 流

    我使用以下命令从 FLAC 文件创建了一个 HLS 流 并输出 FLAC ffmpeg i 10 brass in pocket flac map 0 a c a 0 flac f hls hls playlist type vod mas
  • FFMPEG 没有按预期“切割”

    我通过一个简单的 system process 使用 FFMPEG 来自 java 应用程序 并尝试将视频切成块 我正在尝试将其切成 10 秒的增量 我的 FFMPEG 命令如下所示 ffmpeg i SampleVideo mp4 ss
  • 在流 #1 中找不到编解码器 pcm_alaw 的标签,使用 ffmpeg 连接 2 个文件时容器当前不支持编解码器 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试连接两个文件 第一个文件包含音频和视频 第二个文件仅包含视频 我用以下ffmpeg命令 ffmpeg command ffmpe
  • OpenCV 3.0.0 使用 FFMPEG 时出错

    我使用 OpenCV 一段时间了 但是 我最近将系统更改为没有任何管理员权限的集群 问题是这样的 在我的主文件夹中 我安装了 FFMPEG ffmpeg 网站上提供的最新稳定版本 我将它安装在 HOME 中 因此在 HOME lib 中安装
  • 如何使用ijkplayer库

    我要使用 ijkplayergithub链接 https github com bbcallen ijkplayer 我下载了这个 然后通过 文件 gt 导入 gt 常规 gt 现有项目到工作区 将其导入到 eclipse 中 之后我有三个
  • 如何使用ffmpeg从avi生成gif? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试使用以下命令将视频的一部分提取到动画 gif 中 ffmpeg i video avi t 5 out gif 它会生成一个 g
  • 合并来自 ffmpeg 的两个视频

    我想使用 ffmpeg 将两个 mp4 视频组合成一个 mp4 视频 到目前为止我尝试过的是 ffmpeg i input1 mp4 i input2 mp4 output mp4 但是 每次我获取带有第一个输入的视频编解码器的视频而不是另
  • 如何在 PHP 中运行 ffmpeg 命令

    我需要在 PHP 中运行 ffmpeg 命令 但是 php ffmpeg 不再支持最新版本并且已经过时 我可以知道在网络文件中运行 ffmpeg 命令的替代方法吗 PHP Javascript jQuery 我尝试exec and shel
  • 使用 ffmpeg 将 h.264 avi 容器转换为 mp4

    我想使用 ffmpeg 将 h 264 avi 容器转换为 mp4 容器 我发现这个有效 ffmpeg i myfile avi vcodec copy myfile mp4 ffmpeg version N 51169 gcedf276
  • 将 H264 视频转换为原始 YUV 格式

    是否可以使用 ffmpeg 从 H264 编码视频创建原始 YUV 视频 我想用 matlab 打开视频并逐帧访问 Luma Cb 和 Cr 分量 是的 您可以 您只需指定像素格式即可 要获取格式的完整列表 ffmpeg pix fmts
  • 如何使用 ffmpeg 提取时间精确的视频片段?

    这并不是一个特别新的问题领域 但我已经尝试过那里建议的内容 但运气不佳 那么 我的故事 我有一大段 15 秒的直接来自camera mov 视频 我想从中提取特定的块 我可以通过开始时间和停止时间 以秒为单位 来识别该块 我首先尝试执行我称
  • VLC 和 ffmpeg 如何协同工作?

    我从源代码编译了VLC 它运行良好 当我执行 Vlc 时 vlc 运行 我还从源代码编译了 ffmpeg 它也运行良好 当我执行 ffmpeg i f toto flv mp3 vn acodec copy new toto mp3 时 会
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo
  • 适用于 iPhone 和 HTTP 直播的实时视频聊天

    所以一般来说 我想为 iPhone 制作一个具有视频聊天功能的应用程序 但经过多次搜索 我仍然找不到任何成功的结果 是否有任何公共或私有 API 可用于在 iPhone 上执行此操作 如果您的答案是 是 请帮助我 基本上 我想要的是读取连接
  • ffmpeg AVFrame 到 opencv Mat 转换

    我目前正在开发一个使用 ffmpeg 解码接收到的帧的项目 解码后 我想将 AVFrame 转换为 opencv Mat 帧 以便我可以在 imShow 函数上播放它 我拥有的是字节流 我将其读入缓冲区 解码为 AVFrame f fope
  • OpenCV VideoWriter 未写入 Output.avi

    我正在尝试编写一段简单的代码来获取视频 裁剪视频并写入输出文件 系统设置 OS Windows 10 Conda Environment Python Version 3 7 OpenCV Version 3 4 2 ffmpeg Vers
  • Windows 上的 ffmpeg-android ndk

    我正在尝试编译 bash 文件 带有 android ndk 的 ffmpeg 我收到如下错误 arm linux androideabi gcc 无法创建可执行文件 C 编译器测试失败 Makefile 2 config mak 没有这样
  • Ffmpeg 无法正确转换为 ogg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在使用 ffmpeg 在我的网站上转换音频和视频 Ffmpeg 可以正确转换为其他格式 如 mp3 mp4 等 但无法正确转换为 ogg 虽然 f
  • Chromium 中的 MP4 编解码器支持

    我们已将 Chromium 嵌入式框架集成到我们的 Windows 游戏中 以允许我们从应用程序内渲染网页 并且一切正常 除了 MP4 视频 据我所知 由于许可问题 Chromium 不包含此编解码器 但任何人都可以提供有关我们如何添加支持
  • FFMPEG波形透明,背景纯色

    我正在尝试使用 ffmpeg 生成波形 我希望背景为纯色 实际波形为透明 以下部分实现了我想要的 除了有黑色背景 我希望能够将其更改为任何颜色 但波形是透明的 我怎样才能用 ffmepg 实现这个目标 ffmpeg i input mp3

随机推荐

  • docker-compose 运行hadoop

    参考网址 https github com big data europe docker hadoop 下载hadoop镜像 可以在github上自己手动构建hadoop镜像 也可以从dockerhup上下载 dockerhup上已经与该g
  • C语言注释风格(函数、功能、输入、输出、返回)

    C语言编程规范 注释 规则 1 一般情况下 源程序有效注释量必须在20 以上 说明 注释的原则是有助于对程序的阅读理解 在该加的地方都加了 注释不宜太多也不能太少 注释语言必须准确 易懂 简洁 2 说明性文件 如头文件 h文件 inc文件
  • yolov5 FPN 与 PAN的结构与作用

    在卷积神经网络过程中 网络层数越深 目标的特征信息就越强 模型对目标的预测就更好 但同时也会使得目标的位置信息越来越弱 并且在不断的卷积过程中 对小目标的信息容易造成损失 因此 需要进行不同尺度的预测 YOLOv5 采用 FPN 和 PAN
  • adamax参数_Adamax优化器

    Adamax是Adam的一种变体 此方法对学习率的上限提供了一个更简单的范围 更多详细的基本内容 请参照词条Adam 在Adam中 单个权重的更新规则是将其梯度与当前和过去梯度的L 2范数 标量 成反比例缩放 而作者又将基于L 2范数的更新
  • Linux提权备忘录

    如果不是因为真的喜欢你 我纠缠你干嘛 我又何必那么卑微 那么不堪 甚至不停修改自己的底线 到最后变得一文不值 网易云热评 一 判断是否为虚拟机 cat proc scsi scsi dmesg grep i vir w who 查询目前登录
  • Webpack5资源配置(三)

    总述 wepack资源配置了四类资源加载除了js以外的配置资源 分别为asset recource资源 asset inline资源 asset source资源 asset通用资源类型 接下来 将配合前期webpack学习 系统的对以上四
  • MEMCACHE未授权访问漏洞利用及修复

    memcache是国外社区网站Live Journal的开发团队开发的高性能的分布式内存缓存服务器 一般的使用目的是 通过缓存数据库查询结果 减少数据库访问次数 以提高动态Web应用的速度 提高扩展性 memcache的默认端口是11211
  • LeeCode精选100题-【两数相加】-1

    这里写自定义目录标题 题干 思路 1 暴力枚举 这种没啥好说的 直接双层循环就可以 时间复杂度为O n 2 空间复杂度为O n 2 借助HashMap 两数想相加 题干 给定一个整数数组 nums 和一个整数目标值 target 请你在该数
  • Nginx 各种反向代理方式

    Nginx 反向代理 代理 http 实现负载均衡 nginx 代理 https nginx 代理tcp nginx 平滑升级 代理 http 本次实验后端为 geoserver 如下就可以实现基础的http反向代理 server list
  • 刷脸支付是一套完整解决商户方案的大数据

    支付宝刷脸支付服务还可以使用微信刷你的脸 支付宝刷脸支付服务接受第三方支付 因此它了面部识别支付的权利和产品的开发 对于用户来说 脸刷支付不但是一种收集功能 而且是一套完整解决方案的大数据 支付宝刷脸支付服务商不但解决了现金收集的问题 而且
  • Fiddler抓取HTTP请求详解

    Fiddler抓取HTTP请求 抓包是Fiddler的最基本的应用 以本博客为例 启动Fiddler之后 在浏览器中输入http baidu com 键入回车之后 在Fiddler的web session界面捕获到的HTTP请求如下图所示
  • ES6 迭代器Iterator

    Iterator是一种新的遍历机制 两个核心 1 迭代器是一个接口 能快捷的访问数据 通过Symbol iterator来创建迭代器 通过迭代器的next 方法 获取数据 2 迭代器是用于遍历数据结构的指针 类似于数据库的游标 const
  • Tomcat运行startup一闪而过

    右击startup bat选择用记事本打开 在最后加一个PAUSE 这样可以暂停住窗口 end PAUSE 一般是因为没有配置JAVA HOME这个环境变量导致的 只需要在系统环境变量里新加一个JAVA HOME 变量值填你的jdk安装路径
  • 计组

    目录 一 知识点 二 习题 参考文献 一 知识点 不同机器有不同的指令系统从计算机指令系统设计角度 可将计算机分为复杂指令系统计算机CISC Complex InstrucTIon Set Computer 和精简指令系统计算机RISC R
  • 匿名内部类

    关于匿名内部类还有如下两条规则 1 匿名内部类不能是抽象类 因为系统在创建匿名内部类的时候 会立即创建内部类的对象 因此不允许将匿名内部类 定义成抽象类 2 匿名内部类不等定义构造器 因为匿名内部类没有类名 所以无法定义构造器 但匿名内部类
  • java正则表达式匹配所有数字,包括带小数点的数字

    用于匹配的正则表达式为 1 9 d d 0 d 1 9 1 9 匹配1 9的数字 d 匹配数字 包括0 9 紧跟在 d 之后 表明可以匹配零个及多个数字 匹配小数点 紧跟在 之后 表明可以匹配零个或一个小数点 0 匹配一个数字0 其中的 1
  • 百度网盘提取码_百度网盘提取码查询工具,老菜建议大家收藏备用!

    APP菜园 打造属于我们自己的APP帝国 1 打开支付宝app 首页搜索 8221050 然后点击快捷功能 天天领红包 2 软件领取流程 1 认真阅读下软件介绍 2 找到图片下方的 获取链接 复制 3 打开手机上的浏览器粘贴链接搜索 百度云
  • Unity学习笔记(一)结构体的简单理解与应用

    Unity中的结构体的简介与使用 一 Unity中的结构体是什么 二 结构体与类的不同 一 Unity中的结构体是什么 简单来说 在 C 中 结构体是值类型数据结构 它使得一个单一变量可以存储各种数据类型的相关数据 例如我定义了一个结构体
  • Mybatis使用IN语句查询

    一 简介 在SQL语法中如果我们想使用in的话直接可以像如下一样使用 select from HealthCoupon where useType in 4 3 但是如果在MyBatis中的使用in的话 像如下去做的话 肯定会报错 Map
  • FFMPEG进阶系列02-ffmpeg命令详解3

    ffmpeg 的封装转换 FFmpeg的封装转换部分 主要是通过libavformat这部分来完成的功能 通过libavformat库进行mux和demux操作 多媒体文件的格式有很多种 但是还是有好多demux与mux的操作参数是公用的