一.格式转换
格式转换是ffmpeg工具用的最多的地方了。我们可以使用-f选项,在输出文件之前指定输出文件的格式。
1-1媒体格式
1-1-1文件格式
媒体格式是能够存储音视频数据的特殊的文件类型。如果一个文件中存储了多个流,那么它就称之为容器。我们可以使用ffmpeg -formats命令来查看ffpmeg支持的媒体格式。
1-1-2媒体容器
媒体容器是一个特别封装过的文件,其特殊的格式用来存放多个流以及他们的元数据(metadata)。因为音视频可以被很多的算法进行编解码,那么,媒体容器则提供了简单的方法来将多个流存储在一个文件中。有些容器只能存储音频流,有些容器只能存储图像,但是大多数容器可以存储音频,视频,元数据,字幕等多个流。
如果容器发生了改变,但是编解码器保持不变,这种情况下我们可以使用-c copy或者-c:a copy 或者-c:v copy选项来标示:
ffmpeg -i input.avi -q 1 -c copy output.mov
1-2转码(Transcoding)和格式转换(conversion)
我不确定这个翻译恰不恰当…
Transcoding是使用mmpeg工具,利用输入文件到生成输出文件的过程,这个过程可能包含了格式的转换,也可能没有包含格式转换,知识同一种格式的视频中的一些数据发生了改变。
关于转码,还是看图吧:
1-3编解码器(codec)
codec这个名字来源于**co**der-**dec**oder,编解码器表示一个设备或者软件工具,使用特定的算法,对音频或者视频文件进行压缩或者解压缩的过程。ffmpeg已经定义了很多的编解码器,我们可以使用一下命令查看:
- ffmpeg -codecs …显示所有的编解码器
- ffmpeg -decoders …仅显示解码器
- ffmpeg -encoders …仅显示编码器
在命令行中,我们可以使用-c or -codec选项来指定使用的编解码器,语法格式如下:
-codec[:stream_specifier] codec_name
输入文件和输出文件都可以指定编解码器。如果输出文件包含了多个流,那么每个流都可以指定编解码器,如果我们指定了输出文件的格式,但是没有指定编解码器,那么,ffmpeg就会使用默认的编解码器。
1-4覆盖同名输出文件
如果指定名字的输出文件已经存在,那么ffmpeg就会询问你的意见,你看一选择yes或者no来决定要不要覆盖同名文件。如果想避免这个过程,我们可以直接使用-y或者-n选项来指定要不要覆盖同名文件,比如:
ffmpeg -y -i input.avi output.mp4
这样,如果存在output.mp4文件,就会直接覆盖它。
1-5格式转换中使用的通用的选项
通用选项可以用于设备,容器,以及编解码器。
二.时间的操作
多媒体处理包括了改变输入文件的时长,设置一个延时,选择输入文件的一部分等。这些操作都可以介绍一个指定的时间,时间格式如下:
HH指小时,MM指分钟,SS或者S指的是秒,m指的是毫秒
2-1音视频文件的时长
使用-t选项可以指定音视频文件的时长。比如:
ffmpeg -i music.mp3 -t 180 music_3_minutes.mp3
这样就把music_3_minutes.mp3的时长改为了3分钟。
2-2设置帧数
通过设置帧数,自然而然的就设置了时长,可用的选项如下:
audio: -aframes number or -frames:a number
data: -dframes number or -frames:d number
video: -vframes number or -frames:v number
举例:
ffmpeg -i video.avi -vframes 15000 video_10_minutes.avi
2-3设置从起始位置开始的延迟
使用-ss选项,指定延迟的秒数即可,举例:
ffmpeg -i input.avi -ss 10 output.mp4
2-4提取指定文件的特定部份
通过组合使用-ss和-t,即可提取媒体文件的特定部分。-ss限定延时,-t限定时长,这样不就提取出从ss开始的时长为t的部分媒体数据了吗?
举例:
ffmpeg -i video.mpg -ss 240 -t 60 clip_5th_minute.mpg
2-5输入流之间的延迟
通常有两种情况,一种是一个流需要延迟输出,另一种是两个流都需要延迟输出。我们可以使用-itsoffset (input timestamp offset)来创建一个延迟,同时使用-map来选择指定的流。需要注意的是,AVI, FLV, MOV, MP4有着不同的数据头,-itsoffset选项对这几种格式不起作用。我们可以创建一个延迟的流,并把这个流保存到文件中,然后合并两个文件:
ffmpeg -i input.avi -ss 1 audio.mp3
ffmpeg -i input.avi -i audio.mp3 -map 0:v -map 1:a video.mp4</