ffmpeg 总结

文章目录

  • 结构
    • 简介
    • 术语
    • FFmpeg处理流程
      • 过滤器(Filter)
    • 过滤器链(Filterchain)
    • 过滤器图(Filtergraph)
    • 查看帮助
  • 参数
    • 主要参数
    • 影像参数
    • 声音参数
    • 注意事项##
    • 范例
  • 实例
    • 视频
      • 查看视频格式信息
      • 查看视频有多少帧
      • 格式转换 (将file.avi 转换成output.flv)
      • 将视频video.avi 和音频 audio.mp3 合并成output.avi
      • 从视频里提取视频或图片
      • 图片转成视频
      • 去掉视频中的声音
      • 视频调整为两倍速
      • 视频文件的连接
      • 码率、帧率和文件大小
      • 改变分辨率
      • 裁剪/填充视频
      • 翻转和旋转
      • 模糊,锐化
      • 覆盖(画中画)
      • 删除logo
      • 添加文本
      • 色彩平衡和变换
      • 设置音频视频播放速度
      • 截图
      • 马赛克视频
      • 图像拼接
      • 视频拼接
      • 视频同步播放
      • Logo动态移动
        • linux
        • windows
    • 音频
      • 压缩mp3 文件
      • 录音

结构

简介

FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。

FFmpeg的用户有Google,Facebook,Youtube,优酷,爱奇艺,土豆等。
组成
1、libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库;
2、libavcodec:用于各种类型声音/图像编解码;
3、libavutil:包含一些公共的工具函数;
4、libswscale:用于视频场景比例缩放、色彩映射转换;
5、libpostproc:用于后期效果处理;
6、ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码;
7、ffsever:是一个HTTP多媒体实时广播流服务器,支持时光平移;
8、ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

术语

容器(Container)
容器就是一种文件格式,比如flv,mkv等。包含下面5种流以及文件头信息。
流(Stream)
是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。
帧(Frame)
帧代表一幅静止的图像,分为I帧,P帧,B帧。
编解码器(Codec)
是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode(解码)
复用/解复用(mux/demux)
把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)
把不同的流从某种容器中解析出来,这种行为叫做解复用(demux).

FFmpeg处理流程

过滤器(Filter)

在多媒体处理中,filter的意思是被编码到输出文件之前用来修改输入文件内容的一个软件工具。如:视频翻转,旋转,缩放等。
语法:[input_link_label1][input_link_label2]… filter_name=parameters [output_link_label1][output_link_label2]…
过滤器图link label :是标记过滤器的输入或输出的名称
1.视频过滤器 -vf

  • 如testsrc视频按顺时针方向旋转90度
    ffplay -f lavfi -i testsrc -vf transpose=1
  • 如testsrc视频水平翻转(左右翻转)
    ffplay -f lavfi -i testsrc -vf hflip

2.音频过滤器 -af

  • 实现慢速播放,声音速度是原始速度的50%
    ffplay p629100.mp3 -af atempo=0.5

过滤器链(Filterchain)

  • 基本语法
    Filterchain = 逗号分隔的一组filter
    语法:“filter1,filter2,filter3,…filterN-2,filterN-1,filterN”
    顺时针旋转90度并水平翻转
    ffplay -f lavfi -i testsrc -vf transpose=1,hflip
  • 如何实现水平翻转视频和源视频进行比较? 看过滤器链是如何实现的。
    第一步: 源视频宽度扩大两倍。
    ffmpeg -i jidu.mp4 -t 10 -vf pad=2*iw output.mp4
    第二步:源视频水平翻转
    ffmpeg -i jidu.mp4 -t 10 -vf hflip output2.mp4
    第三步:水平翻转视频覆盖output.mp4
    ffmpeg -i output.mp4 -i output2.mp4 -filter_complex overlay=w compare.mp4
    是不是很复杂?用带有链接标记的过滤器图(Filtergraph)只需一条命令。

过滤器图(Filtergraph)

  • 基本语法
    Filtergraph = 分号分隔的一组filterchain
    “filterchain1;filterchain2;…filterchainN-1;filterchainN”
  • Filtergraph的分类
    1、简单(simple) 一对一
    2、复杂(complex)多对一, 多对多
    简单过滤器图处理流程:
    simple filter graph
    复杂过滤器图处理流程:
    complex filter graph
    从图中可以发现复杂过滤器图比简单过滤器图少2个步骤,效率比简单高,ffmpeg建议尽量使用复杂过滤器图。

回答上面提的问题,实现水平翻转视频和源视频进行比较:
用ffplay直接观看结果:
ffplay -f lavfi -i testsrc -vf split[a][b];[a]pad=2*iw[F1: split过滤器创建两个输入文件的拷贝并标记为[a],[b]
F2: [a]作为pad过滤器的输入,pad过滤器产生2倍宽度并输出到[1].
F3: [b]作为hflip过滤器的输入,vflip过滤器水平翻转视频并输出到[2].
F4: 用overlay过滤器把 [2]覆盖到[1]的旁边.1];[b]hflip[2];[1][2]overlay=w
##选择媒体流##
一些多媒体容器比如AVI,mkv,mp4等,可以包含不同种类的多个流,如何从容器中抽取各种流呢?
语法:
-map file_number:stream_type[:stream_number]

这有一些特别流符号的说明:
1、-map 0 选择第一个文件的所有流
2、-map i:v 从文件序号i(index)中获取所有视频流, -map i:a 获取所有音频流,-map i:s 获取所有字幕流等等。
3、特殊参数-an,-vn,-sn分别排除所有的音频,视频,字幕流。
ffmpeg 总结_第1张图片

查看帮助

FFmpeg工具有一个巨大的控制台帮助。下表描述了可用的一些选项,斜体字表示要被替换的项,ffplay和ffprobe也有一些类似的选项。

帮助
可用的bit流 :ffmpeg –bsfs
可用的编解码器:ffmpeg –codecs
可用的解码器:ffmpeg –decoders
可用的编码器:ffmpeg –encoders
可用的过滤器:ffmpeg –filters
可用的视频格式:ffmpeg –formats
可用的声道布局:ffmpeg –layouts
可用的license:ffmpeg –L
可用的像素格式:ffmpeg –pix_fmts
可用的协议:ffmpeg -protocals
ffmpeg 总结_第2张图片

参数

FFmpeg可使用众多参数,参数内容会根据ffmpeg版本而有差异,使用前建议先参考参数及编解码器的叙述。此外,参数明细可用 ffmpeg -h 显示;编解码器名称等明细可用 ffmpeg -formats 显示。

下列为较常使用的参数。

主要参数

-i 设定输入档名。
-f 设定输出格式。
-y 若输出档案已存在时则覆盖档案。
-fs 固定大小(fixed size),超过指定的档案大小时则结束转换。
-ss 从指定时间开始转换。
-t 录制时间
-title 设定标题。
-timestamp 设定时间戳。
-vsync 增减Frame使影音同步。

影像参数

-b 设定影像流量,默认为200Kbit/秒。
-qscale <数值> 以<数值>质量为基础的VBR,取值0.01-255,越小质量越好。较新版本中修改为 -q:v <数值>. 例如 -q:v 0 则指定输出与输入是相同的quality.
-qmin <数值> 设定最小质量,与-qmax(设定最大质量)共用,比如-qmin 10 -qmax 31
-sameq 使用和源同样的质量
-r 设定FrameRate值,默认为25。
-s 设定画面的宽与高。
-aspect 设定画面的比例。
-vn 不处理影像,于仅针对声音做处理时使用。
-vcodec 设定影像影像编解码器,未设定时则使用与输入档案相同之编解码器。较新版本中修改为**-c:v <编解码器名>**。例如 -c:v libx264 指定编解码器为libx264.

声音参数

-ab 设定每Channel (最近的SVN 版为所有Channel的总合)的流量。( 单位 请参照下方注意事项 )
-ar 设定采样率。
-ac 设定声音的Channel数。
-acodec 设定声音编解码器,未设定时与影像相同,使用与输入档案相同之编解码器。
-an 不处理声音,于仅针对影像做处理时使用。
-vol 设定音量大小,256为标准音量。(要设定成两倍音量时则输入512,依此类推。)

注意事项##

  • 以-b及ab参数设定流量时,根据使用的ffmpeg版本,须注意单位会有kbits/sec与bits/sec的不同。(可用ffmpeg -h显示说明来确认单位。)
    例如,单位为bits/sec的情况时,欲指定流量64kbps时需输入‘ -ab 64k ’;单位为kbits/sec的情况时则需输入‘ -ab 64 ’。
  • 以-acodec及-vcodec所指定的编解码器名称,会根据使用的ffmpeg版本而有所不同。例如使用AAC编解码器时,会有输入aac与 libfaac的情况。此外,编解码器有分为仅供解码时使用与仅供编码时使用,因此一定要利用ffmpeg -formats 确 认输入的编解码器是否能运作。

范例

  • 将MPEG-1影片转换成MPEG-4格式之范例

ffmpeg -i inputfile.mpg -f mp4 -acodec libfaac -vcodec mpeg4 -b 256k -ab 64k outputfile.mp4

  • 将MP3声音转换成MPEG-4格式之范例
    ffmpeg -i inputfile.mp3 -f mp4 -acodec libaac -vn -ab 64k outputfile.mp4
  • 将DVD的VOB档转换成VideoCD格式的MPEG-1档之范例

ffmpeg -i inputfile.vob -f mpeg -acodec mp2 -vcodec mpeg1video -s 352x240 -b 1152k -ab 128k outputfile.mpg

  • 将AVI影片转换成H.264格式的M4V档之范例

ffmpeg -i inputfile.avi -f mp4 -acodec libfaac -vcodec libx264 -b 512k -ab 320k outputfile.m4v

  • 连接复数的AVI影片档之范例(在此范例中须一度暂时将AVI档转换成MPEG-1档(MPEG-1, MPEG-2 PSDV格式亦可连接)、

ffmpeg -i input1.avi -sameq inputfile_01.mpg
ffmpeg -i input2.avi -sameq inputfile_02.mpg
cat inputfile_01.mpg inputfile_02.mpg > inputfile_all.mpg
ffmpeg -i inputfile_all.mpg -sameq outputfile.avi

实例

视频

查看视频格式信息

ffmpeg -i  file.avi

查看视频有多少帧

ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4

注意不是所有格式都可以用这种方法,这需要container(这里是mp4)支持。

格式转换 (将file.avi 转换成output.flv)

 ffmpeg -i  file.avi   output.flv
   -i 表示输入文件 

将视频video.avi 和音频 audio.mp3 合并成output.avi

ffmpeg -i video.avi -vcodec copy -an video2.avi   
ffmpeg -i video2.avi -i audio.mp3 -vcodec copy -acodec copy output.avi

-vcodec copy 表示 force video codec (‘copy’ to copy stream) 这个不知怎么译 ,估计是直接copy

方法2. 好像可以直接指定两个输入文件:

ffmpeg -i /tmp/a.wav -i /tmp/a.avi /tmp/a.avi

两个文件的顺序很重要。

从视频里提取视频或图片

ffmpeg -i test.avi -f image2 -ss 8 -t 0.001 -s 350x240 -vf format=gray test.jpg

第8秒处 截一张灰度图。该命令也可以截取视频,只需要把时间参数-t改成具体的秒数即可。例如从第3分35秒片截取15秒的视频,可以这样这样写

ffmpeg -i test.avi -ss 3:35 -t 15 out.mp4

图片转成视频

ffmpeg -r 60 -f image2 -s 1920x1080 -start_number 1 -i pic%04d.png -vframes 1000 -vcodec libx264 -crf 25 -pix_fmt yuv420p test.mp4
ffmpeg -i pic%04d.png -vcodec libx264 -preset veryslow -crf 0 output.avi # lossless compression

  • -r is the framerate (fps)
  • -crf is the quality, lower means better quality, 15-25 is usually good. 当crf为0时,表示无损压缩。
  • -preset 压缩模式,有两种选项:veryslow, extrafast。不影响压缩的质量,只影响压缩文件大小。
  • -s is the resolution
  • -pix_fmt yuv420p specifies the pixel format, change this as needed
  • -start_number specifies what image to start at
  • -vframes 1000 specifies the number frames/images in the video

去掉视频中的声音

ffmpeg -i example.mkv -c copy -an example-nosound.mkv

视频调整为两倍速

ffmpeg -i input.mkv -filter:v “setpts=0.5*PTS” output.mkv

视频文件的连接

如两个flv 文件连接成一个。好像必须先将文件 转成mpg ,dv 等格式的文件后才能进行连接。

  • 连接复数的AVI影片档之范例(在此范例中须一度暂时将AVI档转换成MPEG-1档(MPEG-1, MPEG-2 PS, DV格式亦可连接))
    ffmpeg -i input1.avi -sameq inputfile_01.mpg -r 20
    ffmpeg -i input2.avi -sameq inputfile_02.mpg -r 20
    cat inputfile_01.mpg inputfile_02.mpg > inputfile_all.mpg
    ffmpeg -i inputfile_all.mpg -sameq outputfile.avi
    上面-sameq 表示 相同的质量

码率、帧率和文件大小

帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。
码率:比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。

  • 帧率
  1. 用 -r 参数设置帧率
    ffmpeg –i input –r fps output
  2. 用fps filter设置帧率
    ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm

例如设置码率为29.97fps,下面三种方式具有相同的结果:
ffmpeg -i input.avi -r 29.97 output.mpg
ffmpeg -i input.avi -r 30000/1001 output.mpg
ffmpeg -i input.avi -r netsc output.mpg

  • 设置码率 –b 参数
    ffmpeg -i film.avi -b 1.5M film.mp4
  • 音频:-b:a 视频: - b:v
    设置视频码率为1500kbps
    ffmpeg -i input.avi -b:v 1500k output.mp4
  • 控制输出文件大小
    -fs (file size首字母缩写)
    ffmpeg -i input.avi -fs 1024K output.mp4

改变分辨率

  • 将输入视频的分辨率改成640x480
    ffmpeg -i input.avi -vf scale=640:480 output_half_width.avi
  • 在未知视频的分辨率时,保证调整的分辨率与源视频有相同的横纵比。宽度固定400,高度成比例:
    ffmpeg -i input.avi -vf scale=400:400/a
    ffmpeg -i input.avi -vf scale=400:-1
  • 将输入视频的分辨率减半
    ffmpeg -i input.avi -vf scale = iw/2:ih/2 output_half_width.avi

裁剪/填充视频

  • 裁剪视频crop filter
    从输入文件中选取你想要的矩形区域到输出文件中,常见用来去视频黑边。(x,y以左上角为零点)
    语法:crop:ow[:oh[:x[:y:[:keep_aspect]]]]
  • 比较裁剪后的视频和源视频比较
    ffplay -i jidu.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 自动检测黑边区域,然后把检测出来的参数填入crop filter
    ffplay jidu.mp4 -vf cropdetect
  • 填充视频(pad)
    在视频帧上增加一快额外额区域,经常用在播放的时候显示不同的横纵比
    语法:pad=width[:height:[:x[:y:[:color]]]]
    – 创建一个30个像素的粉色宽度来包围一个SVGA尺寸的图片:
    ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg
    – 同理可以制作testsrc视频用30个像素粉色包围视频
    ffplay -f lavfi -i testsrc -vf pad=iw+60:ih+60:30:30:pink

翻转和旋转

  • 翻转
    – 水平翻转语法: -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°然后水平翻转

模糊,锐化

  • 模糊
    语法:boxblur=luma_r:luma_p[:chroma_r:chram_p[:alpha_r:alpha_p]]
    ffplay -f lavfi -i testsrc -vf boxblur=1:10:4:10
    注意: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
    ffmpeg -i input -vf unsharp output.mp4
    – 高斯模糊效果(比较强的模糊):
    ffplay -f lavfi -i testsrc -vf unsharp=13:13:-2

覆盖(画中画)

  • 覆盖
    语法:overlay[=x[:y]
    所有的参数都是可选,默认值都是0
    ffmpeg 总结_第3张图片
    举例
    – Logo在左上角
    ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.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[:t[:show]]
x:y 离左上角的坐标
w:h logo的宽和高
t: 矩形边缘的厚度默认值4
show:若设置为1有一个绿色的矩形,默认值0.
ffplay -i jidu.mp4 -vf delogo=50:51:60:600

添加文本

语法:
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=white -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 jidu.mp4 -vf drawtext=“fontfile=arial.ttf:text=‘Dynamic RTL text’:x=w-t*50:fontcolor=darkorange:fontsize=30”
  2. 底部水平滚动
    ffplay -i jidu.mp4 -vf drawtext=“fontfile=arial.ttf:textfile=textfile.txt:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30”
  3. 垂直从下往上滚动
    ffplay jidu.mp4 -vf drawtext="textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30“
  • 想实现右上角显示当前时间?
  1. 在右上角显示当前时间 localtime
    ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text=’%{localtime:%H\:%M\:%S}’“
  2. 每隔3秒显示一次当前时间
    ffplay jidu.mp4 -vf drawtext=“fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text=’%{localtime:%H\:%M\:%S}’:enable=lt(mod(t,3),1)”

色彩平衡和变换

  • 色彩平衡
    ffplay -i jidu.mp4 -vf curves=vintage
  • 色彩变幻
    ffplay -i jidu.mp4 -vf hue="H=2PIt: s=sin(2PIt)+1“
  • 彩色转换黑白
    ffplay -i jidu.mp4 -vf lutyuv=“u=128:v=128”

设置音频视频播放速度

  • 3倍视频播放视频
    ffplay -i jidu.mp4 -vf setpts=PTS/3
  • 3/4速度播放视频
    ffplay -i jidu.mp4 -vf setpts=PTS/(3/4)
  • 2倍速度播放音频
    ffplay -i speech.mp3 -af atempo=2

截图

  • 每隔一秒截一张图
    ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png
  • 每隔20秒截一张图
    ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png
  • 多张截图合并到一个文件里(2x3) ?每隔一千帧(秒数=1000/fps25)即40s截一张图
    ffmpeg? -i jidu.mp4 -frames 3 -vf “select=not(mod(n,1000)),scale=320:240,tile=2x3” out.png

马赛克视频

用多个输入文件创建一个马赛克视频:
ffmpeg -i jidu.mp4 -i jidu.flv -i “Day By Day SBS.mp4” -i “Dangerous.mp4” -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

图像拼接

两张图像im0.png (30像素高)和im1.jpg (20像素高)上下拼接:

ffmpeg -i im0.png -i im1.jpg -filter_complex “[0:v] pad=iw:50 [top]; [1:v] copy [down]; [top][down] overlay=0:30” im3.png

视频拼接

需要将需要拼接的视频文件按以下格式保存在一个列表 list.txt 中:

file ‘/path/to/file1’
file ‘/path/to/file2’
file ‘/path/to/file3’

相应的命令为:
ffmpeg -f concat -i list.txt -c copy output.mp4

视频同步播放

将下面这行保存为ffplay2.bat,运行时输入:ffplay2 video1.mp4 video2.mp4,即可实现左右同步播放。

ffplay -f lavfi “movie=%1,scale=iw/2:ih[v0];movie=%2,scale=iw/2:ih[v1];[v0][v1] hstack”

还可以输入更多的参数,比如缩小系数、堆叠方式。例如:ffplay2 video1.mp4 video2.mp4 2 vstack 可以将两个视频缩小2倍、竖起方向堆叠同步播放。

ffplay -f lavfi “movie=%1,scale=iw/%3:ih/%3[v0];movie=%2,scale=iw/%3:ih/%3[v1];[v0][v1] %4”

Logo动态移动

  1. 2秒后logo从左到右移动:
    ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x=‘if(gte(t,2),((t-2)*80)-w,NAN)’:y=0
  2. 2秒后logo从左到右移动后停止在左上角
    ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x=‘if(gte(((t-2)*80)-w,W),0,((t-2)*80)-w)’:y=0
  3. 每隔10秒交替出现logo。
    ffmpeg -y -t 60 -i jidu.mp4 -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
    ###屏幕录像###

linux

ffmpeg -f x11grab -s xga -r 10 -i :0.0+0+0 wheer.avi
ffmpeg -f x11grab -s 320x240 -r 10 -i :0.0+100+200 wheer.avi
:0:0 表示屏幕(个人理解,因为系统变量$DISPLAY值就是:0.0) 而100,表示距左端100象素,200表示距上端200
-r 10 设置频率

ffmpeg -f x11grab -s xga -qscale 5 -r 10 -i :0.0+0+0 wheer.avi
-qscale 8 设定画面质量,值越小越好

windows

ffmpeg在Linux下用X11grab进行屏幕录像,在Windows下用DirectShow滤镜

首先需要安装一个软件,screen capture recorder
编译好的下载地址是:
http://sourceforge.net/projects/screencapturer/files/
源码地址是:
https://github.com/rdp/screen-capture-recorder-to-video-windows-free

安装完了之后,在命令行执行:

ffmpeg -list_devices true -f dshow -i dummy

可查看新的Direct Show设备。
然后就可以用FFMPEG来进行录像了

ffmpeg -f dshow -i video=“screen-capture-recorder” -f dshow -i audio=“virtual-audio-capturer” -pix_fmt yuv420p -vcodec libx264 -acodec libvo_aacenc -s 1280x720 -r 25 -q 10 -ar 44100 -ac 2 -tune zerolatency -preset ultrafast -f mpegts - | ffmpeg -f mpegts -i - -c copy -bsf:a aac_adtstoasc -f flv temp.flv

ffmpeg -f dshow -i video=“screen-capture-recorder” -pix_fmt yuv420p -vcodec libx264 -s 1280x720 -r 25 -q 2 -f flv temp.flv
###屏幕录像,同时录音###
ffmpeg -f oss -i /dev/dsp -f x11grab -r 30 -s 1024x768 -i :0.0 output.mkv
ffmpeg -ac 2 -f oss -i /dev/dsp -f x11grab -r 30 -s 1024x768 -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0 output.mkv

看到这,你会发现这个命令有多强大。

如果我屏幕上打开了一个窗口,我只想录这个窗口的内容,如何确定这个窗口的坐标位置呢?可以用另外一个命令xwininfo 输入这个命令后,用鼠标点选目标窗口,就会出现目标窗口的坐标,宽高等一系列信息。

音频

压缩mp3 文件

如果你觉得mp3 文件 有点大,想变小一点那么可以通过-ab 选项改变音频的比特率 (bitrate)

ffmpeg -i input.mp3 -ab 128 output.mp3 //这里将比特率设为128

你可以用file 命令查看一下源文件 的信息

录音

(要有可用的麦克风,并且如果用alsa 的话,好像得安alsa-oss,重启)

ffmpeg -f oss -i /dev/dsp out.avi (should hava oss or alsa-oss)
ffmpeg -f alsa -ac 2 -i hw:0, 0 out.avi (should )
ffmpeg -f alsa -ac 2 -i pulse (should hava PulseAudio)

在alsa 体系中声卡(也可能是麦克风)叫hw:0,0 而在oss 体系中叫/dev/dsp (用词可能不太专业) 。Linux在安装了声卡后,会有一些设备文件生成,采集数字样本的/dev/dsp文件,针对混音器的/dev/mixer文件,用于音序器的/dev/sequencer,/dev/audio文件一个基于兼容性考虑的声音设备文件。只要向/dev/audio中输入wav文件就能发出声音。而对/dev/dsp文件读取就能得到WAV文件格式的声音文件。

参考:http://blog.csdn.net/jixiuffff/article/details/5709976

你可能感兴趣的:(C++,杂)