FFMPEG是特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑你的音视频文件。
本文将简要介绍一下 FFMPEG 库的基本目录结构及其功能,然后详细介绍一下我们在日常工作中,如何使用 ffmpeg 提供的工具来处理音视频文件。
在讲解 FFMPEG 命令之前,我们先要介绍一些音视频格式的基要概念。
我们按使用目的可以将 FFMPEG 命令分成以下几类:
然后将编码的数据包传送给解码器(除非为数据流选择了流拷贝,请参阅进一步描述)。 解码器产生未压缩的帧(原始视频/ PCM音频/ ),可以通过滤波进一步处理(见下一节)。 在过滤之后,帧被传递到编码器,编码器并输出编码的数据包。 最后,这些传递给复用器,将编码的数据包写入输出文件。
默认情况下,ffmpeg只包含输入文件中每种类型(视频,音频,字幕)的一个流,并将其添加到每个输出文件中。 它根据以下标准挑选每一个的“最佳”:对于视频,它是具有最高分辨率的流,对于音频,它是具有最多channel的流,对于字幕,是第一个字幕流。 在相同类型的几个流相等的情况下,选择具有最低索引的流。
您可以通过使用-vn / -an / -sn / -dn选项来禁用某些默认设置。 要进行全面的手动控制,请使用-map选项,该选项禁用刚描述的默认设置。
下面我们就来详细介绍一下这些命令。
FFMPEG 可以使用下面的参数进行基本信息查询。例如,想查询一下现在使用的 FFMPEG 都支持哪些 filter,就可以用 ffmpeg -filters 来查询。详细参数说明如下:
接下来介绍的是 FFMPEG 处理音视频时使用的命令格式与参数。
下面是 FFMPEG 的基本命令格式:
ffmpeg 通过 -i 选项读取输任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等,并写入任意数量的输出“文件”。
原则上,每个输入/输出“文件”都可以包含任意数量的不同类型的视频流(视频/音频/字幕/附件/数据)。 流的数量和/或类型是由容器格式来限制。 选择从哪个输入进入到哪个输出将自动完成或使用 -map 选项。
要引用选项中的输入文件,您必须使用它们的索引(从0开始)。 例如。 第一个输入文件是0,第二个输入文件是1,等等。类似地,文件内的流被它们的索引引用。 例如。 2:3是指第三个输入文件中的第四个流。
上面就是 FFMPEG 处理音视频的常用命令,下面是一些常用参数:
-an(输出) 禁用录音。
-acodec编解码器(输入/输出) |设置音频编解码器。这是-codec的别名:a。
-sample_fmt [:stream_specifier] sample_fmt(输出,每个流) |设置音频采样格式。使用-sample_fmts获取支持的样本格式列表。
-af filtergraph(输出) |创建由filtergraph指定的过滤器图,并使用它来过滤流。
了解了这些基本信息后,接下来我们看看 FFMPEG 具体都能干些什么吧。
首先通过下面的命令查看一下 mac 上都有哪些设备。
注意,桌面的输入对帧率没有要求,所以不用限制桌面的帧率。其实限制了也没用。
ffmpeg -f avfoundation -i 1:0 -r 2997 -c:v libx264 -crf 0 -c:a libfdk_aac -profile:a aac_he_v2 -b:a 32k outflv
流拷贝是通过将 copy 参数提供给-codec选项来选择流的模式。它使得ffmpeg省略了指定流的解码和编码步骤,所以它只能进行多路分解和多路复用。 这对于更改容器格式或修改容器级元数据很有用。 在这种情况下,上图将简化为:
由于没有解码或编码,速度非常快,没有质量损失。 但是,由于许多因素,在某些情况下可能无法正常工作。 应用过滤器显然也是不可能的,因为过滤器处理未压缩的数据。
上面的命令表式的是音频、视频都直接 copy,只是将 mp4 的封装格式转成了flv。
在编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。 几个链式过滤器形成一个过滤器图形。 ffmpeg区分两种类型的过滤器图形:简单和复杂。
简单的过滤器图是那些只有一个输入和输出,都是相同的类型。 在上面的图中,它们可以通过在解码和编码之间插入一个额外的步骤来表示:
简单的filtergraphs配置了per-stream-filter选项(分别为视频和音频使用-vf和-af别名)。 一个简单的视频filtergraph可以看起来像这样的例子:
请注意,某些滤镜会更改帧属性,但不会改变帧内容。 例如。 上例中的fps过滤器会改变帧数,但不会触及帧内容。 另一个例子是setpts过滤器,它只设置时间戳,否则不改变帧。
复杂的过滤器图是那些不能简单描述为应用于一个流的线性处理链的过滤器图。 例如,当图形有多个输入和/或输出,或者当输出流类型与输入不同时,就是这种情况。
复杂的过滤器图使用-filter_complex选项进行配置。 请注意,此选项是全局性的,因为复杂的过滤器图形本质上不能与单个流或文件明确关联。
-lavfi选项等同于-filter_complex。
一个复杂的过滤器图的一个简单的例子是覆盖过滤器,它有两个视频输入和一个视频输出,包含一个视频叠加在另一个上面。 它的音频对应是amix滤波器。
先通过 ffplay 找到要删除 LOGO 的位置
使用 delogo 滤镜删除 LOGO
crop 格式:crop=out_w:out_h:x:y
如果要修改为垂直翻转可以用vflip。
首先创建一个 inputstxt 文件,文件内容如下:
file '1flv'
file '2flv'
file '3flv'
然后执行下面的命令:
一、FFmpeg推RTMP流准备工作
首先确保自已已经安装了nginx + rtmp服务器。
打开配置文件nginxconf
完成如下配置
nginx配置1
如果没有nginx + rtmp服务器,请阅读我的另一篇文章
Mac搭建nginx+rtmp服务器
二、FFmpeg推流
1推流MP4文件
视频文件地址:/Users/xu/Desktop/bangbangbangmp4
推流拉流地址:rtmp://localhost:1935/rtmplive/home
acc:RTMP的音频格式
flv: RTMP的视频格式
ffmpeg -re -i /Users/xu/Desktop/bangbangbangmp4-vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/home
设置推流2
输入命令行后,暂时先不要点回车,等设置好本地拉流后,再进行推流。
2本地拉流MP4文件
打开VLC播放器
VLC3
设置播放地址
设置播放地址4
设置拉流地址
rtmp://localhost:1935/rtmplive/home
拉流地址5
开始推流,点击open后开始播放。
FFmpeg推流成功6
推流成功!
三、用ffmpeg推流桌面以及推流摄像头进行直播
1如果希望将桌面录制或者分享,可以使用命令行如下:
ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://localhost:1935/rtmplive/home
这个只能够推桌面。
2如果需要桌面+麦克风,比如一般做远程教育分享 命令行如下:
ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/rtmplive/home
这个可以推桌面+麦克风。
3如果需要桌面+麦克风,并且还要摄像头拍摄到自己,比如一般用于互动主播,游戏主播,命令行如下
ffmpeg -f avfoundation -framerate 30 -i "1:0" \-f avfoundation -framerate 30 -video_size 640x480 -i "0" \-c:v libx264 -preset ultrafast \-filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/rtmplive/home
这个可以推桌面+麦克风,并且摄像头把人头放在界面下面
Snip20160713_12png
四、FFmpeg常用基本命令
1分离视频音频流
ffmpeg -i input_file -vcodeccopy-an output_file_video//分离视频流ffmpeg -i input_file -acodeccopy-vn output_file_audio//分离音频流
2视频解复用
ffmpeg–itestmp4 –vcodeccopy–an–fm4vtest264ffmpeg –itestavi –vcodeccopy–an–fm4vtest264
3视频转码
ffmpeg –i testmp4 –vcodec h264 –s352278–an –f m4v test264//转码为码流原始文件ffmpeg –i testmp4 –vcodec h264 –bf0–g25–s352278–an –f m4v test264//转码为码流原始文件
ffmpeg –i testavi -vcodec mpeg4 –vtag xvid –qsame test_xvidavi//转码为封装文件
-bf B帧数目控制
-g 关键帧间隔控制
-s 分辨率控制
4视频封装
ffmpeg –i video_file –i audio_file –vcodeccopy–acodeccopyoutput_file
5视频剪切
ffmpeg –i testavi –r1–f image2 image-%3djpeg//提取ffmpeg -ss0:1:30-t0:0:20-i inputavi -vcodec copy -acodec copy outputavi//剪切视频
-r 提取图像的频率
-ss 开始时间
-t 持续时间
6视频录制
ffmpeg –i rtsp://1921683205:5555/test –vcodec copy outavi
7YUV序列播放
ffplay -f rawvideo -video_size1920x1080 inputyuv
8YUV序列转AVI
ffmpeg–swh–pix_fmtyuv420p–iinputyuv –vcodecmpeg4outputavi
9常用参数说明:
主要参数:
i 设定输入流
f 设定输出格式
ss 开始时间
视频参数:
b 设定视频流量,默认为200Kbit/s-r 设定帧速率,默认为25
s 设定画面的宽与高-aspect 设定画面的比例
vn 不处理视频-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:
ar 设定采样率
ac 设定声音的Channel数
acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器an 不处理音频
以上就是关于ffmpeg 常用命令全部的内容,包括:ffmpeg 常用命令、FFmpeg常用推流命令、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)