七叶笔记 » golang编程 » ffmpeg视频直播编解码流程

ffmpeg视频直播编解码流程

去年最流行的非视频直播莫属,出现了几百家的直播平台,毕竟自己也是在直播平台做开发的,然后就写一篇关于直播的文章。这里只说流程,具体的实现就不说了,应付面试应该还是可以的。

先上一张简单的流程图:

上面这张图就是视频直播的流程图,想要开发一款自己的视频直播软件不麻烦,现在有好多直播sdk,比如腾讯视频云,金山视频云,易视云,7牛视频云,等等,使用它们的sdk能很快的开发一款自己的视频直播软件,个人推荐使用易视云,定制化你想要的视频直播软件,上面流程图只是说的表面流程,下面说一些涉及到的技术上面一些流程。

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

下面附一张使用FFmpeg编码视频的流程图。使用该流程,不仅可以编码H.264的视频,而且可以编码MPEG4/MPEG2/VP8等等各种FFmpeg支持的视频。

简单介绍一下流程中各个函数的意义:

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

avformat_alloc_output_context2():初始化输出码流的AVFormatContext。

AVI o_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”代表“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)多对一, 多对多

简单过滤器图处理流程:

从图中可以发现复杂过滤器图比简单过滤器图少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工具有一个巨大的控制台帮助。下表描述了可用的一些选项,斜体字表示要被替换的项,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

mp 3声音转换成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 352×240 -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 350×240 -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 1920×1080 -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 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

改变分辨率

将输入视频的分辨率改成640×480

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

举例

– 使用默认值,亮度矩阵为5×5和亮度值为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

多张截图合并到一个文件里(2×3) ?每隔一千帧(秒数=1000/fps25)即40s截一张图

ffmpeg? -i jidu.mp4 -frames 3 -vf “select=not(mod(n,1000)),scale=320:240,tile=2×3” out.png

马赛克视频

用多个输入文件创建一个马赛克视频:

ffmpeg -i jidu.mp4 -i jidu.flv -i “Day By Day SBS.mp4” -i “Dangerous.mp4” -filter_complex “nullsrc=size=640×480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320×240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320×240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320×240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320×240 [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动态移动

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秒后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

每隔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 320×240 -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

编译好的下载地址是:

源码地址是:

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

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 嵌入式 等。

需要资料的关注+私信“资料”免费领取

相关文章