ffmpeg 视频剪切与合并,时间不精确的问题

在工作中,需要将长视频对目标片段进行剪辑后测试,我们使用 ffmpeg 命令就可以很容易实现,这里也记录下我们使用过程中遇到的坑,希望对大家也有所帮助。

举个例子:

一、当我们要截取视频文件中 input.mp4 的第100秒到第150秒时,ffmpeg命令行可以这么写:
ffmpeg -ss 100 -to 150 -i input.mp4 -c:v copy output.mp4
# 这里的参数-c:v copy 指的是复用原始视频的编码格式,如果想切换视频编码也可以直接指定,比如-c:v libx264 (使用命令ffmpeg -codecs可以查看编码列表)。
二、另外 -ss 和 -to 后面也可以写成时:分:秒的格式,比如要截取视频00:01:40开始到00:02:30的视频,命令行就可以写成如下:
ffmpeg -ss 00:01:40 -to 00:02:30 -i input.mp4 -c:v copy output.mp4
三、如果先从某个时间点开始,截取之后的多少秒视频,我们可以将 -to参数替换为-t参数,比如我想从视频的00:12:01开始截取之后的60秒视频,命令行就也这么写:
ffmpeg -ss 00:01:40 -t 50 -i input.mp4 -c:v copy output.mp4
# 这里需要注意的是如果你同时使用了-t和-to参数,那么ffmpeg会优先使用-t参数的值,-to参数无效
四、提示:-ss指定起始时间点不准确的问题

这里补充一个我们使用中遇到的坑,就是视频截取时间点不准确的问题,以上命令行在短视频中还能正常使用,但随着我们输入的视频时长越来越长,我们发现截取出来的视频时间点越来越不准确,比如我想从第5分钟截取到第10分钟,结果上面命令行给截出来的是第6分钟到第11分钟的视频。
   后来查阅 man ffmpeg 手册发现,-ss参数有注意事项,其放在-i前和后的效果不一样,是这么介绍-ss参数的:

-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.

           position must be a time duration specification, see the Time duration section in the ffmpeg-utils(1) manual.

当-ss放在-i参数前,其搜索到的时间点是从文件中搜索到的位置是不准确的。当-ss参数在-i参数之后,ffmpeg会将视频重新解码,然后丢弃目标直到指定搜索的时间戳。
   所以以上几条命令,要想在任何输入下拿到更精确的结果,就应该这么写:

ffmpeg -i input.mp4 -ss 100 -to 150 -c:v copy output.mp4 
ffmpeg -i input.mp4 -ss 00:01:40 -to 00:02:30 -c:v copy output.mp4  
ffmpeg -i input.mp4 -ss 00:01:40 -t 50 -c:v copy output.mp4
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于音视频同步的问题,可以使用FFmpeg进行处理。FFmpeg是一个开源的跨平台音视频处理工具,可以进行音视频的转码、剪辑、合并等操作。 要实现音视频同步,可以使用FFmpeg的`-itsoffset`选项来调整音频或视频时间偏移量。具体步骤如下: 1. 首先,需要确定音频和视频时间偏移量。如果音频比视频快,则时间偏移量为正值;如果音频比视频慢,则时间偏移量为负值。 2. 使用以下命令来同步音视频: ``` ffmpeg -i input_video.mp4 -itsoffset <offset> -i input_audio.mp3 -c copy -map 0:v -map 1:a output.mp4 ``` 其中,`<offset>`为音频相对于视频时间偏移量,单位为秒。`input_video.mp4`为输入视频文件,`input_audio.mp3`为输入音频文件,`output.mp4`为输出文件名。 此命令将会将音频和视频进行合并,并根据时间偏移量进行同步。`-c copy`选项表示直接复制音频和视频的编码格式,加快处理速度。`-map 0:v`表示只选择第一个输入文件的视频流,`-map 1:a`表示只选择第二个输入文件的音频流。 3. 运行命令后,FFmpeg将会生成一个同步后的输出文件 `output.mp4`,其中音频和视频已经同步。 需要注意的是,音视频同步处理可能涉及到音频和视频的编码格式、采样率等参数的匹配,如果出现问题,可以尝试先对音频或视频进行转码,再进行同步操作。 希望以上方法能帮助到你,如果还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值