《ffmpeg basics》中文版 -- 12.时间操作

12.时间操作

​ 关于多媒体的时间操作有:修改输入文件的时长,设置延迟,按时间选取输入的一部分等等。这些时间操作中可以接受的时间表达形式有两种:

  • [-]HH:MM:SS[.m…]

  • [-]S+[.m…]

    其中,HH 表示小时,MM 表示分钟,SS 或 S 表示秒数,m 表示毫秒。

音频和视频的时长

使用 -t 选项设置时长

​ 如果想要修改一个媒体文件的时长,我们可以使用 -t 选项,它可以直接指定秒数,也可以使用 HH:MM:SS.milliseconds的形式指定时长。例如想要将 music.mp3 的时长设置为 3 分钟,我们可以使用命令:

ffmpeg -i music.mp3 -t 180 music_3_minutes.mp3
通过设置帧数来设置时长

​ 在某些情况下,通过指定帧数来设置媒体的时长会比较合适,其可用的选项如下:

  • audio: -aframes number or -frames:a number
  • data: -dframes number or -frames:d number
  • video: -vframes number or -frames:v number

​ 我们设置的帧数应该等于要设置的时长(秒数)乘以帧率。例如,想要将一个帧率为 25 fps 的 video.avi 设置为 10 分钟时长,我们可以使用命令:

ffmpeg -i video.avi -vframes 15000 video_10_minnutes.avi

从开始设置延迟

​ 想要从某个时间点开始记录输入文件,我们可以使用 -ss(seek from start)选项,它可以指定一个秒数或者形如 HH:MM:SS.milliseconds 的时长。这个选项既可以放置在输入文件之前,也可以放置在输出文件之前,当放置在输出文件之前时,编码会更精确一些。例如,我们想要从 10 秒开始进行格式转换,命令如下:

ffmpeg -i input.avi -ss 10 output.mp4

从媒体文件提取特定部分

​ 想要截取音频或视频文件的特定部分,我们可以同时使用 -ss 和 -t 选项,ffplay会在左下角显示当前时间,而且可以使用 空格键 或者 P键 来暂停播放或继续播放。例如,如果想要从 video.mpg 中保存第5分钟的部分,我们可以使用命令:

ffmpeg -i video.mpg -ss 240 -t 60 clip_5th_minute.mpg

在输入流之间做延迟

​ 通常有两种方式来完成输入流之间的延迟。当输入流中的某一个流应该在输出中被延迟时,我们需要两个选项,-itsoffset(input timestamp offset)选项指定延迟,-map 选项去选择特定的流。请注意,container 如 AVI,FLV,MOV,MP4 等不同的格式会有不同的头部数据,在某些情况下,itsoffset 选项可能不起作用,此时我们应该使用 -ss 选项将要被延迟的流保存到一个文件中,然后再将两个文件合并到一个文件。如下面的示例中,音频被延迟了 1 秒钟:

ffmpeg -i input.avi -ss 1 audio.mp3
ffmpeg -i input.avi -i audio.mp3 -map 0:v -map 1:a video.mp4
以下是从 FFmpeg 官网上截取的解释:

-itsoffset offset (input)
Set the input time offset. 
The offset is added to the timestamps of the input files. Specifying a positive offset means that the corresponding streams are delayed by the time duration specified in offset. 

也就是说,将输入项数据显示的时间设置了一个偏移量,如偏移量为2s,那么原本3秒出现的数据,现在会在第5秒出现,而原本第5秒出现的数据会在第7秒时间出现。
注:实际操作赋一个负值,没有起作用,并不会出现数据提前的效果。
注:赋一个正值,在某些封装格式时,也没有效果,正如上文提醒过的一样。

-ss position (input/output)
When used as an input option (before -i), seeks in this input file to position. Note that in most formats it is not possible to seek exactly, so ffmpeg will seek to the closest seek point before position. When transcoding and -accurate_seek is enabled (the default), this extra segment between the seek point and position will be decoded and discarded. When doing stream copy or when -noaccurate_seek is used, it will be preserved. 
When used as an output option (before an output url), decodes but discards input until the timestamps reach position. 

当-ss作为输入选项时,表示将输入的当前位置偏移到指定值。注意,大多数格式中并不能偏移,所以ffmpeg会偏移到指定值前的最近的一个可偏移点。

当-ss作为输出选项时,表示仍然编码所有的数据,但直到-ss指定时间之前的已编码好的数据都会被丢弃。也就是说,如果-ss指定了10分钟,这10分钟的数据仍然要被编码,直到10分钟后的数据才会被保存,并不会因此减少处理的时间。
一个输入文件

​ 如果输入文件中,视频和音频并不同步,比如音频比视频要快了 1.5 秒,那么我们可以延迟音频流来完成同步,命令如下:

ffmpeg -i input.mpv -map 0:v -map 0:a -itsoffset 1.5 -c:a copy -c:v copy output.mov

​ 如果是视频快了 5 秒,那么可以用下面的命令同步:

ffmpeg -i input.mov -map 0:v -itsoffset 5 -map 0:a -c:a copy -c:v copy output.mov
两个或多个输入文件

​ 当输出是从两个或者多个输入文件创建的,通常音频流的开始时间要迟于视频流。例如,我们将音频流延迟 3 秒,命令如下:

ffmpeg -i v.mpg -itsoffset 3 -i a.mp3 -map 0:v:0 -map 1:a:0 output.mp4

限制处理时间

​ 有时,我们应该限制 ffmpeg 工具的运行时间,可以使用 -timelimit 选项来设置这个限制时长。例如,我们想让 ffmpeg 在 10 分钟后退出编码流程,我们可以使用命令:

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

使用最短的流来决定编码时长

​ 想要将最短的输入流时长设置为整体的输出时长,我们可以使用 -shortest 选项,此时当最短的流处理完成后,就会退出编码流程。例如,要将文件 video.avi 和 audio.mp3 混合,其中音频文件的时长要比视频文件短,我们可以使用以下命令来指定输出时长为音频时长(如果不使用 -shortest 选项,超出音频时长的部分将会使用静音处理):

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

时间戳和时间基

​ 想要在媒体 container 中设置 记录时间戳 ,我们可以使用 -timestamp 选项,它的值可以是如下形式:

  • now:当前时间

  • 日期可以用 YYYY-MM-DD 或 YYYYMMDD 指定,如果不指定,默认使用当前日期

  • 时间可以用 HH:MM:SS[.m…] 或 HHMMSS[.m…] 指定,小数部分是可选的

  • 在时间值之前,可以加上一个可选的字母 T 或 t

  • 如果在时间值之后,有 Z 或者 z,那么该时间是 UTC 标准,否则是本地时间

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

​ ffmpeg 处理视频流时会在控制台输出相关流的时基信息,示例如下:

Stream #0:0,1,1/25: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46) , yuv420p , 320x240 [SAR 1:1 DAR 4:#],25 tbr , 25 tbn , 25 tbc

​ 缩写 tbr,tbn 和 tbc 分别表示 FFmpeg 时间戳的 3 个不同的时间基:

在这里插入图片描述

编码器时基设置

​ 一个 encoder 拷贝流时,需要为其设置时间基,我们可以使用 -copytb 选项来设置,它可以取下面三个值:

  • 1 :使用 demuxer时间基

    将对应的输入 demuxer 中的时基 i 拷贝到输出的 encoder中,当我们拷贝采用了可变帧率(VBR)的视频流时就可以使用这个参数,以防止时间戳的非单调增长。

  • 0:使用 decoder时间基

    时间戳会从对应的输入 decoder 拷贝到 输出 encoder。

  • -1:默认值,自动选择对输出最合适的时间戳

​ 例如,如果我们要对输出设置 demuxer 的时间基,则命令如下:

ffmpeg -i input.mp4 -copytb 1 output.webm

音频视频速度修改

视频速度修改

​ 想要修改视频文件的速度,我们可以使用 setpts filter(set presentation timestamp),其详细描述如下:

在这里插入图片描述

​ 每一个视频帧都会包含一个头,其中有时间戳值,两个相邻帧之间的差值是 1/fps ,例如,如果 fps 是 25,那么相邻帧之间时间戳的差值就是 0.04 秒。如果想要加快视频播放,那么这个时间差的值必须更小一些才行,相反如果想要放慢视频播放,这个时间差的值应该更大。例如,想要以 3 倍速来观看视频,那么时间戳就必须除以 3 才行:

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

​ 而想要以 3/4 的速度观看,那么输入时间戳必须除以 3/4,:

ffplay -i input.mpg -vf setpts=PTS/(3/4)
音频速度改变

​ 想要调整音频的速度,我们可以使用 atempo filter,其详情如下:

在这里插入图片描述

​ 例如,想要用 2 倍速来播放输入音频,那么命令如下:

ffplay -i speech.mp3 -af atempo=2

​ 想要以 0.5 被的速度播放音频,那么仅需将 atempo设置为0.5即可。如果 atempo 修改的范围不在我们需要的范围内,我们可以多次重复设置 atempo 以达到想要的效果。

使用时间戳同步音频数据

​ asyncts audio filter 可以使用时间戳来同步音频数据,其详细描述如下:

在这里插入图片描述

​ 例如,想要使用时间戳来同步 music.mpg 文件中的数据,命令如下:

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

译者注:关于时间戳的额外信息,请查询以下博客:

https://www.cnblogs.com/leisure_chn/p/10584910.html

78729440963)]

​ 例如,想要使用时间戳来同步 music.mpg 文件中的数据,命令如下:

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

译者注:关于时间戳的额外信息,请查询以下博客:

https://www.cnblogs.com/leisure_chn/p/10584910.html

或者自行查找资料。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值