格式转换是ffmpeg工具用的最多的地方了。我们可以使用-f选项,在输出文件之前指定输出文件的格式。
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
我不确定这个翻译恰不恰当…
Transcoding是使用mmpeg工具,利用输入文件到生成输出文件的过程,这个过程可能包含了格式的转换,也可能没有包含格式转换,知识同一种格式的视频中的一些数据发生了改变。
关于转码,还是看图吧:
codec这个名字来源于**co**der-**dec**oder,编解码器表示一个设备或者软件工具,使用特定的算法,对音频或者视频文件进行压缩或者解压缩的过程。ffmpeg已经定义了很多的编解码器,我们可以使用一下命令查看:
-codec[:stream_specifier] codec_name
输入文件和输出文件都可以指定编解码器。如果输出文件包含了多个流,那么每个流都可以指定编解码器,如果我们指定了输出文件的格式,但是没有指定编解码器,那么,ffmpeg就会使用默认的编解码器。
如果指定名字的输出文件已经存在,那么ffmpeg就会询问你的意见,你看一选择yes或者no来决定要不要覆盖同名文件。如果想避免这个过程,我们可以直接使用-y或者-n选项来指定要不要覆盖同名文件,比如:
ffmpeg -y -i input.avi output.mp4
这样,如果存在output.mp4文件,就会直接覆盖它。
通用选项可以用于设备,容器,以及编解码器。
多媒体处理包括了改变输入文件的时长,设置一个延时,选择输入文件的一部分等。这些操作都可以介绍一个指定的时间,时间格式如下:
HH指小时,MM指分钟,SS或者S指的是秒,m指的是毫秒
使用-t选项可以指定音视频文件的时长。比如:
ffmpeg -i music.mp3 -t 180 music_3_minutes.mp3
这样就把music_3_minutes.mp3的时长改为了3分钟。
通过设置帧数,自然而然的就设置了时长,可用的选项如下:
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
使用-ss选项,指定延迟的秒数即可,举例:
ffmpeg -i input.avi -ss 10 output.mp4
通过组合使用-ss和-t,即可提取媒体文件的特定部分。-ss限定延时,-t限定时长,这样不就提取出从ss开始的时长为t的部分媒体数据了吗?
举例:
ffmpeg -i video.mpg -ss 240 -t 60 clip_5th_minute.mpg
通常有两种情况,一种是一个流需要延迟输出,另一种是两个流都需要延迟输出。我们可以使用-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
这样音视频就有了时差。
2-5-1一个输入文件
如果一个输入文件包含了音频流和视频流,并且这两个流不同步,音频流提前了1.5秒,那么我们可以把音频流延迟1.5秒:
ffmpeg -i input.mov -map 0:v -map 0:a -itsoffset 1.5 -c:a copy -c:v copy output.mov
2-5-2多个输入文件
如果输入文件有多个,加入我们想要延迟音频3秒钟,可以使用如下命令:
ffmpeg -i v.mpg -itsoffset 3 -i a.mp3 -map 0:v:0 -map 1:a:0 output.mp4
有时候,限制ffmpeg命令运行的时间是很重要的,这个时候我们可以使用-timelimit选项:
ffmpeg -i input.mpg -timelimit 600 output.mkv
这样,限制了这条命令执行的时间为10分钟。
如果想要让编码时间由时间最短的那个流来决定,那么可以使用-shortest选项。
举例:
ffmpeg -i video.avi -i audio.mp3 -shortest output.mp4
为了设置多媒体容器的时间戳,我们可以使用-timestamp选项,改选项的值有如下几种:
时间戳的例子:
2010-12-24T12:00:00, 20101224t120000z, 20101224120000
为了修改视频的播放速率,我们可以使用setpts视频过滤器。
比如,要把视频播放速度加快3倍:
ffplay -i input.mpg -vf setpts=PTS/3
为了修改音频播放的速率,我们可以使用atempo[过滤器,比如,要把音频加快两倍,我们可以执行如下命令:
ffplay -i speech.mp3 -af atempo=2
为了使用时间戳同步音频数据,我们可以使用asyncts音频过滤器。比如,为了使用时间戳同步音频数据,我们可以使用如下命令:
ffmpeg -i music.mpg -af asyncts=compensate=1 -f mpegts music.ts
元数据通常在mp3文件中使用,播放器通常会显示歌曲的名字,作者,相册等信息。
媒体文件中包含的元数据可以使用-metadata选项,后面跟key=value的方式来指定,比如我们想给一个media file指定元数据,那么可以使用如下命令:
ffmpeg -i input -metadata artist=FFmpeg -metadata title="Test 1" output
我们可以输出一个媒体文件的原数组信息到一个文件,我们需要使用-f选项来制定ffmetadata格式为输出格式比如:
ffmpeg -i video.wmv -f ffmetadata data.txt
也可以从一个文件装载元数据,比如:
ffmpeg -i data.txt -i video1.avi video1.wmw
为了删除元数据,我们可以使用-map_metadata选项。用法举例:
ffmpeg -i input.avi -map_metadata -1 output.mp4
字幕大家都很熟悉吧,字幕一般存储在一个单独的文件中或者打包进视频文件中。
为了编码字幕到视频文件中,我们可以这样做:
ffmpeg -i video.avi -vf subtitles=titles.srt video.mp4
通过截图创建:
ffmpeg -i input -ss t image.type
或者这样:
ffmpeg -i videoclip.avi -ss 01:23:45 image.jpg
ffmpeg -i promotion.swf -pix_fmt rgb24 promotion.gif
这条命令可以直接把promotion.swf视频生成gif图片。
ffmpeg -i clip.avi frame%d.jpg
填充:
ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg
裁剪:
ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rgb.png
修改大小:
ffmpeg -f lavfi -i color=c=orange:s=cif orange_rect1.png
ffmpeg -f lavfi -i color=c=orange -s cif orange_rect2.png
和视频操作类似,就不啰嗦了。
翻转:
ffmpeg -i orange.jpg -vf hflip orange_hflip.jpg
ffmpeg -i orange.jpg -vf vflip orange_vflip.jpg
旋转:
ffmpeg -i image.png -vf transpose=1 image_rotated.png
覆盖:
ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb.png
ffmpeg -f lavfi -i smptebars smpte.png
ffmpeg -i rgb.png -i smpte.png -filter_complex overlay=(W-w)/2:(H-h)/2 ^
rgb_smpte.png
命令个数如下:
ffmpeg -i image.type1 image.type2
举例:
ffmpeg -i illustration.png illustration.jpg
一张图片创建视频
比如,使用一张图片来创建一个10秒钟的视频:
ffmpeg -loop 1 -i photo.jpg -t 10 photo.mp4
多张图片创建视频:
ffmpeg -f image2 -i img%d.jpg -r 25 video.mp4
这条命令指定输入文件的格式为image2格式,然后使用所有命名为img1.jpg,img3.jpg,img3.jpg…的图片来创建一个视频。-r来指定帧率。
我们可以使用如下的命令来列举出可用的麦克风和网络摄像头:
ffmpeg -list_devices 1 -f dshow -i dummy
效果如下:
数据显示了摄像头的名称为:”HP Webcam”,麦克风的名称为:”Microphone (Realtek High Defini”。
接下来,我们可以使用这两个名称做进一步操作。
摄像头一般有多个工作模式,我们可以使用-list_options来显示摄像头的工作模式,麦克风也是类似的,后面会讲到。
命令如下:
ffmpeg -list_options true -f dshow -i video="HP Webcam"
输出如下:
[dshow @ 021bd040] Pin "Capture"
[dshow @ 021bd040] min s=640x480 fps=15 max s=640x480 fps=30
[dshow @ 021bd040] min s=640x480 fps=15 max s=640x480 fps=30
[dshow @ 021bd040] min s=160x120 fps=15 max s=160x120 fps=30
[dshow @ 021bd040] min s=160x120 fps=15 max s=160x120 fps=30
[dshow @ 021bd040] min s=176x144 fps=15 max s=176x144 fps=30
[dshow @ 021bd040] min s=176x144 fps=15 max s=176x144 fps=30
[dshow @ 021bd040] min s=320x240 fps=15 max s=320x240 fps=30
[dshow @ 021bd040] min s=320x240 fps=15 max s=320x240 fps=30
[dshow @ 021bd040] min s=352x288 fps=15 max s=352x288 fps=30
[dshow @ 021bd040] min s=352x288 fps=15 max s=352x288 fps=30
video=HP Webcam: Immediate exit requested
ffmpeg -list_options true -f dshow -i video="HP Webcam"
显示:
ffplay -f dshow -i video="HP Webcam"
ffmpeg -f dshow -i video="HP Webcam" -f sdl "webcam via ffmpeg"
第一条命令使用ffplay来显示摄像头数据,第二条使用SDL输出设备。
录制
ffmpeg -f dshow -i video="HP Webcam" webcam.avi
将录制的内容保存到avi文件中。
还是使用这个命令来查看:
ffmpeg -list_devices 1 -f dshow -i dummy
假如信息如下:
[dshow @ 01f7d000] DirectShow video devices
[dshow @ 01f7d000] "Sirius USB2.0 Camera"
[dshow @ 01f7d000] "HP Webcam"
[dshow @ 01f7d000] DirectShow audio devices
[dshow @ 01f7d000] "Microphone (Realtek High Defini"
然后使用下面的命令来显示两个视频:
ffmpeg -f dshow -i "video=Sirius USB2.0 Camera" -f dshow -video_size qvga ^
-i "video=HP Webcam" -filter_complex overlay -f sdl "2 webcams"
显示麦克风的工作模式:
ffmpeg -list_options 1 -f dshow -i "audio=Microphone (Realtek High Defini"
录音:
ffmpeg -f dshow -i audio="Microphone (Realtek High Defini" -t 60 mic.mp3
播放麦克风的声音:
ffplay -f dshow -i audio="Microphone (Realtek High Defini"
同时录音和录视频并保存到同一个文件:
ffmpeg -f dshow -i audio="Microphone (Realtek High Defini":^
video="HP Webcam" webcam_with_sound.avi