ffmpeg学习三:《FFmpeg Basics》读书笔记(下)

一.格式转换

格式转换是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

这样音视频就有了时差。
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

2-6限制处理时间

有时候,限制ffmpeg命令运行的时间是很重要的,这个时候我们可以使用-timelimit选项:

ffmpeg -i input.mpg -timelimit 600 output.mkv

这样,限制了这条命令执行的时间为10分钟。

2-7最短的流决定编码时间

如果想要让编码时间由时间最短的那个流来决定,那么可以使用-shortest选项。
举例:

ffmpeg -i video.avi -i audio.mp3 -shortest output.mp4

2-8时间戳和时间基准

为了设置多媒体容器的时间戳,我们可以使用-timestamp选项,改选项的值有如下几种:
这里写图片描述

时间戳的例子:
2010-12-24T12:00:00, 20101224t120000z, 20101224120000

2-9视频速度的修改

为了修改视频的播放速率,我们可以使用setpts视频过滤器。
比如,要把视频播放速度加快3倍:

ffplay -i input.mpg -vf setpts=PTS/3

2-10音频速率的修改

为了修改音频播放的速率,我们可以使用atempo[过滤器,比如,要把音频加快两倍,我们可以执行如下命令:

ffplay -i speech.mp3 -af atempo=2

2-11使用时间戳同步音视频

为了使用时间戳同步音频数据,我们可以使用asyncts音频过滤器。比如,为了使用时间戳同步音频数据,我们可以使用如下命令:

ffmpeg -i music.mpg -af asyncts=compensate=1 -f mpegts music.ts

三.元数据和字幕

3-1元数据

元数据通常在mp3文件中使用,播放器通常会显示歌曲的名字,作者,相册等信息。

3-2创建元数据

媒体文件中包含的元数据可以使用-metadata选项,后面跟key=value的方式来指定,比如我们想给一个media file指定元数据,那么可以使用如下命令:

ffmpeg -i input -metadata artist=FFmpeg -metadata title="Test 1" output

3-3保存或者装载元数据 到/从 文件中

我们可以输出一个媒体文件的原数组信息到一个文件,我们需要使用-f选项来制定ffmetadata格式为输出格式比如:

ffmpeg -i video.wmv -f ffmetadata data.txt

也可以从一个文件装载元数据,比如:

ffmpeg -i data.txt -i video1.avi video1.wmw

3-4删除元数据

为了删除元数据,我们可以使用-map_metadata选项。用法举例:

ffmpeg -i input.avi -map_metadata -1 output.mp4

3-5字幕

字幕大家都很熟悉吧,字幕一般存储在一个单独的文件中或者打包进视频文件中。
为了编码字幕到视频文件中,我们可以这样做:

ffmpeg -i video.avi -vf subtitles=titles.srt video.mp4

四.图片处理

4-1创建图片

通过截图创建:

ffmpeg -i input -ss t image.type

或者这样:

ffmpeg -i videoclip.avi -ss 01:23:45 image.jpg

4-2创建gif

ffmpeg -i promotion.swf -pix_fmt rgb24 promotion.gif

这条命令可以直接把promotion.swf视频生成gif图片。

4-3视频转为图片

ffmpeg -i clip.avi frame%d.jpg

4-4缩放,裁剪,填充图片

填充:

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

4-5翻转,旋转,覆盖图片

和视频操作类似,就不啰嗦了。
翻转:

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

4-6格式转换

命令个数如下:

ffmpeg -i image.type1 image.type2

举例:

ffmpeg -i illustration.png illustration.jpg

4-7使用图片来创建视频

一张图片创建视频
比如,使用一张图片来创建一个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来指定帧率。

五.麦克风和网络摄像头

5-1查看输入设备信息

我们可以使用如下的命令来列举出可用的麦克风和网络摄像头:

ffmpeg -list_devices 1 -f dshow -i dummy

效果如下:
这里写图片描述
数据显示了摄像头的名称为:”HP Webcam”,麦克风的名称为:”Microphone (Realtek High Defini”。
接下来,我们可以使用这两个名称做进一步操作。

5-2查看工作模式

摄像头一般有多个工作模式,我们可以使用-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"

5-3显示和录制摄像头数据

显示:

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文件中。

5-4使用两个摄像头

还是使用这个命令来查看:

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"

这里写图片描述

5-5录音并用扬声器显示

显示麦克风的工作模式:

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
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值