FFMPEG转码常用命令研究

技术文章 无标签 2018-07-31

fmpeg简介

官网链接是http://www.ffmpeg.org/上有说明,它是音视频的分离,转换,解码的完全解决方案。
其中最重要的就是libavcodec库。它被mplayer或者xine使用作为解码器。还有,国内比较流行的播放器影音风暴或MyMPC的后端ffdshow也是使用ffmpeg的解码库的。
ffmpeg包括一组软件,ffmpeg用于对媒体文件进行处理,ffserver是一个http的流媒体服务器,ffplay是一个基于SDL的简单播放器。两个库文件libavcodec和libavformat。

ffmpeg作为媒体文件处理软件,基本用法如下:
ffmpeg [global_options] {[input_file_options] -i ‘input_file’} ... {[output_file_options] ‘output_file’} ...
输入输出文件通常就是待处理的多媒体文件了。可以是纯粹的音频文件,纯粹的视频文件,或者混合的。
大部分常见的格式都能够“通杀”。象常见的各种mpeg,AVI封装的DIVX和Xvid等等

对ffmpeg命令选项的了解,先从下面的命令开始
ffmpeg -h
ffmpeg -h long
ffmpeg -h full
man ffmpeg需要安装ffmpeg的手册页条目

各选项参数的解释,详情参见

http://www.ffmpeg.org/ffmpeg.html

列出几个主要的选项
-vcodec 视频流编码方式
-b 视频流码率(默认只有200k,一般都需要手动设置,具体的数值视codec选择而定)
-r 视频流帧数(一般说来PAL制式通常用25,NTSC制式通常用29)
-s 视频解析度(分辨率,也要视codec和你的需要而定。通常改变某个视频流的解析度是很耗费CPU的事情。另:具体写法使用“数字x数字”的形式。中间是小写字母“x”,这个用过mplayer的应该都知道)
-t 处理持续时间。
-acodec 音频流编码方式
-ab 音频流码率(默认是同源文件码率,也需要视codec而定)
-ar 音频流采样率(大多数情况下使用44100和48000,分别对应PAL制式和NTSC制式,根据需要选择)

还有些可能需要用到的选项如
-vn和-an分别是屏蔽视频流和屏蔽音频流,分别对源文件处理一次即可得到分离的音频和视频
-author -title分别是设置媒体文件的作者和title
-f选项是强制使用某种格式
-target type是使用预置的格式转换(可以转成dvd,vcd或svcd)

除此之外还有些更高级的选项,如设定vbr,或设定high quality,或者设定vbr的buff和max/min码率,象一般我们自用的dvd抓轨啦,DV转vcd或dvd啦,网上下载的电影转成vcd或dvd都不一定需要用到它们。
具体的使用方法在man里面有介绍。简单明了。

-bsf比特流过滤器设置
首先使用ffmpeg -bsfs来查看所有的比特流过滤器,使用下面的命令
ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
来匹配要复制的视频流,也是就是说,是有条件复制视频流,必须匹配上才复制

-c选项是-codec的缩写
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
意思是encodes all video streams with libx264 and copies all audio streams.

-map选项解读
指定一个或多个输入流作为输出文件的源。每个输入流由input_file_id[:stream_specifier]表示,这两个索引都从0开始计数,-stream_specifier
表示一个负map,参见下面的例子
ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov
选择a.mov中的第三个流,和b.mov中的第7个流,把它们复制到输出文件中
ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT
选择所有的视频流和第3个音频流,把它们复制到输出文件中
ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT
除了第2个音频流以外,复制其他的流到输出文件中
ffmpeg -i INPUT -map 0 output
复制第一个文件中的所有流到输出文件中

关于ffmpeg hls更详细的官方文档,参见
http://www.ffmpeg.org/ffmpeg-all.html
在页面中搜索“hls”即可
下面是该官方网页给出的一个例子
Segment the input file, and create an M3U8 live playlist (can be used as live HLS source):

ffmpeg -re -i in.mkv -codec copy -map 0 -f segment -segment_list playlist.m3u8 \
-segment_list_flags +live -segment_time 10 out%03d.mkv

下面是我收集的hls版本,并不好用。
ffmpeg -i inputfile.avi -c:v libx264 -c:a libvo_aacenc -hls_time 10 -hls_list_size 0 outputfile.m3u8
ffmpeg -i inputfile.avi -c copy -bsf:v h264_mp4toannexb -map 0 -hls_time 10 -hls_list_size 0 outputfile.m3u8
注意:我测试后,发现hls版本的命令生成的ts片段非常差,几乎不能观看。

目前的ffmpeg版本是支持hls的,直接使用下面的命令也会同时生成ts片段和m3u8文件,每个ts片段是默认2s,这反过来也说明ffmpeg是支持hls的
ffmpeg -i in.nut out.m3u8

对于hls切片来说,下面的命令使我测试过很好用的,特收藏如下

ffmpeg -i 1.mp4 -f segment -segment_time 10 -segment_format mpegts -segment_list list_file.m3u8 -c copy -bsf:v h264_mp4toannexb -map 0 output_file-%d.ts

这条命令的限制是:要求生成ts分片的输入视频是视频是h.264编码,音频是aac编码的视频文件,从优酷网上下载的视频片段都是符合这个条件的。

获取ffmpeg最新源码方法
git clone git://source.ffmpeg.org/ffmpeg ffmpeg
更新本地源码
git pull (--rebase)
git的使用方法详见

http://www.ffmpeg.org/git-howto.html

0条评论