af音频,如何模拟af音频

  

  去年最火爆的非视频直播,非上百家直播平台莫属。毕竟我自己也是在直播平台上发展起来的,然后写了一篇关于直播的文章。这里只讲流程,不讲具体实现。应该还是可以应付面试的。   

  

  让我们从一个简单的流程图开始:   

  

     

  

  上图是视频直播的流程图。自己开发视频直播软件也不麻烦。现在有很多视频直播SDK,比如腾讯视频云、金山视频云、易观云、7牛视频云等等。使用他们的SDK可以快速开发自己的视频直播软件。个人推荐使用易观云定制自己想要的视频直播软件。上面的流程图只是表面的流程。这里有一些相关的技术。   

  

  不管用哪个视频云sdk,都是用ffmpeg开源的这个库。这个库很强大,强大到无所不能。无论是android、ios还是pc,都是用来编解码音视频的。我来说说使用这个库的编码,也就是音视频数据的压缩过程:   

  

  附上使用FFmpeg的视频编码流程图。利用该流程,不仅可以对H.264视频进行编码,还可以对诸如MPEG4/MPEG2/VP8的各种FFmpeg支持的视频进行编码。   

  

     

  

  简要介绍流程中每个功能的重要性:   

  

  Av_register_all():注册FFmpeg的所有编解码器。   

  

  Av _ alloc _ output _ context2():初始化输出比特流的AVFormatContext。   

  

  Avio_open():打开输出文件。   

  

  Av_new_stream():创建输出流的AVStream。   

  

  Avcodec_find_encoder():查找编码器。   

  

  Avcodec_open2():打开编码器。   

  

  Avformat_write_header():写文件头(有些没有文件头的封装格式不需要这个函数。说MPEG2TS)。   

  

  Avcodec_encode_video2():对一帧视频进行编码。即AVFrame(存储YUV像素数据)编码成AVPacket(存储H.264等格式的码流数据)。   

  

  Av_write_frame():将编码后的视频码流写入一个文件。   

  

  Flush_encoder():这个函数在输入像素数据被读取后被调用。用于输出编码器中剩余的AVPacket。   

  

  Av_write_trailer():写入文件结尾(有些没有文件头的封装格式不需要这个函数。说MPEG2TS)   

  

  下面说一下音视频的解码(解压缩)的流程:   

  

     

  

  Ffmpeg概要结构   

  

  简介   

  

  FFmpeg的名字来源于mpeg视频编码标准,前面的“FF”代表“快进”。FFmpeg是一个开源的计算机程序,可用于记录、转换数字音频和视频,并将其转换为流。它可以很容易地实现各种视频格式之间的相互转换。   

  

  FFmpeg的用户包括谷歌、脸书、Youtube、优酷、爱奇艺、土豆等。   

  

  形式   

  

  1.libavformat:用于各种音视频打包格式的生成和解析,包括获取解码所需信息生成解码上下文结构和读取音视频帧的功能,包括demuxers和muxer库;   

  

  2.libavcodec:用于各种类型的声音/图像编解码;   

  

  3.libavutil:包含一些公共实用工具函数;   

  

  4.libswscale:用于视频场景的缩放和颜色映射转换;   

  

  5.libpostproc:用于后期效果处理;   

  

  6.ffmpeg:是一个命令行工具,用来转换视频文件的格式,也支持电视卡的实时编码;   

  

  7.ffsever:是HTTP多媒体实时广播流媒体服务器,支持时移;   

  

  8.ffplay:是一个简单的播放器,由ffmpeg库解析解码,SDL显示;   

  

  学期   

  

  容器(集装箱)   

  

  容器是一种文件格式,如flv、mkv等。它包含以下五种流和报头信息。   

  

  溪流(溪流)   

  

  它是一种视频数据信息的传输方式,有音频、视频、字幕、附件、数据五个流。   

  

  框架(框架)   

  

  帧表示静止图像,并被分为I帧、P帧和B帧。   

  

  编解码器(编解码器)   

  

  是压缩还是解压视频,编解码器=COde DECode。   

  

  复用/解复用(mux/demux)   

  

  根据容器的规则将不同的流放入容器中称为多路复用(mux)。   

p>把不同的流从某种容器中解析出来,这种行为叫做解复用(demux).

  

FFmpeg处理流程

  

过滤器(Filter)

  

在多媒体处理中,filter的意思是被编码到输出文件之前用来修改输入文件内容的一个软件工具。如:视频翻转,旋转,缩放等。

  

语法:… filter_name=parameters

  

过滤器图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)多对一, 多对多

  

简单过滤器图处理流程:

  

  

从图中可以发现复杂过滤器图比简单过滤器图少2个步骤,效率比简单高,ffmpeg建议尽量使用复杂过滤器图。

  

回答上面提的问题,实现水平翻转视频和源视频进行比较:

  

用ffplay直接观看结果:

  

ffplay -f lavfi -i testsrc -vf split;pad=2*iw,

  

F2: 作为pad过滤器的输入,pad过滤器产生2倍宽度并输出到<1>.

  

F3: 作为hflip过滤器的输入,vflip过滤器水平翻转视频并输出到<2>.

  

F4: 用overlay过滤器把 <2>覆盖到<1>的旁边.1>;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工具有一个巨大的控制台帮助。下表描述了可用的一些选项,斜体字表示要被替换的项,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可使用众多参数,参数内容会根据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

  

实例

  

视频

  

查看视频格式信息

  

  

查看视频有多少帧ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp注意不是所有格式都可以用这种方法,这需要container(这里是mp4)支持。

  

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

  

ffmpeg -i file.avi output.flv

  

-i 表示输入文件

  

1

  

2

  

将视频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

  

1

  

2

  

-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

  

  

去掉视频中的声音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来表达。

  

帧率

  

用 -r 参数设置帧率

  

ffmpeg –i input –r fps output

  

用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;drawbox=x=(iw-300)/2:(ih-300)/2:w=300:h=300:c=yellow;pad=2iw;crop=300:300:(iw-300)/2:(ih-300)/2;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

  

  

举例

  

– 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显示,可以使用函数

  

简单用法

  

在左上角添加Welcome文字

  

ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom

  

在中央添加Good day

  

ffplay -f lavfi -i color=c=white -vf drawtext=“fontfile=arial.ttf:text=‘Goodday’:x=(w-tw)/2:y=(h-th)/2”

  

设置字体颜色和大小

  

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 (时间秒)变量实现动态文本

  

顶部水平滚动

  

ffplay -i jidu.mp4 -vf drawtext=“fontfile=arial.ttf:text=‘Dynamic RTL text’:x=w-t*50:fontcolor=darkorange:fontsize=30”

  

底部水平滚动

  

ffplay -i jidu.mp4 -vf drawtext=“fontfile=arial.ttf:textfile=textfile.txt:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30”

  

垂直从下往上滚动

  

ffplay jidu.mp4 -vf drawtext="textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30“

  

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

  

在右上角显示当前时间 localtime

  

ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text=’%{localtime:%H\:%M\:%S}’“

  

每隔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 ; <0:v> setpts=PTS-STARTPTS, scale=320x240 ; <1:v> setpts=PTS-STARTPTS, scale=320x240 ; <2:v> setpts=PTS-STARTPTS, scale=320x240 ; <3:v> setpts=PTS-STARTPTS, scale=320x240 ; overlay=shortest=1 ; overlay=shortest=1:x=320 ; overlay=shortest=1:y=240 ; 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 ; <1:v> copy ; 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;movie=%2,scale=iw/2:ih; hstack”

  

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

  

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

  

Logo动态移动

  

2秒后logo从左到右移动:

  

ffplay -i jidu.mp4 -vf movie=logo.png;overlay=x=‘if(gte(t,2),((t-2)*80)-w,NAN)’:y=0

  

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

  

ffplay -i jidu.mp4 -vf movie=logo.png;overlay=x=‘if(gte(((t-2)*80)-w,W),0,((t-2)*80)-w)’:y=0

  

每隔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来进行录像了

  

  

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

  

如果我屏幕上打开了一个窗口,我只想录这个窗口的内容,如何确定这个窗口的坐标位置呢?可以用另外一个命令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文件格式的声音文件。

  

资料内容包括:C/C++,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,WebRTC,ffmpeg 嵌入式 等。需要资料的关注+私信“资料”免费领取

相关文章