前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Python3+ffmpeg对视频进行精确截取的探索

使用Python3+ffmpeg对视频进行精确截取的探索

作者头像
黑马Amos
发布2023-03-21 14:02:21
9610
发布2023-03-21 14:02:21
举报
文章被收录于专栏:李家杂货铺zi李家杂货铺zi

目录

一. 精确截取视频

1.1 根据原视频,截取产生1个包含很多关键帧的视频step1_output_larger.mkv

1.2 根据step1_output_larger.mkv微调原截取开始时间和持续时间

1.3 根据step1_output.mkv和微调后的开始时间和持续时间产生step2_output.mkv

1.4 其他的处理

1.5 截取的一个示例


网上有很多ffmpeg对视频进行精确剪切的讨论,因为关键帧的问题,导致剪切时间不太精确,本文对视频的精确截取进行了探索,有两个目标:

1. 能精确截取视频。

2. 能保证剪切处声音不会突然截断。

以下的命令均在Ubuntu环境下实现,windows下的ffmpeg不太友好,播放mkv经常出现无法加载字幕的情况。

一. 精确截取视频

仅以1个例子说明,步骤如下:

1.1 根据原视频,截取产生1个包含很多关键帧的视频step1_output_larger.mkv

ffmpeg -y -ss 01:25:24.64 -t 9.8 -intra -accurate_seek -i *.mkv  -ss 0 -t 9.8 -g 2 -keyint_min 2 step1_output_larger.mkv

这一步是根据*.mkv产生1个带有很多关键帧的step1_output_larger.mkv,假定截取开始时间为01:25:24.64,持续时间t=9.8s,这个larger是指产生一个比你预期长度要大一点的mkv,这样做的目的是解决上面所述的第2个目标:保证剪切处声音不会突然截断,后面有叙述。

根据实际测试,说明几点:

1)-intra不可以去掉,似乎ffmpeg文档中说-intra可以用-g 1替代,但实际运行会有差异,没有详细研究。

2)accurate_seek用在-i之前。

3)-g 2 -keyint_min 2用来限定2个关键帧的间隔帧数为2,这个2可以根据具体情况自由选取。

4)*.mkv后的-ss 0 -t 9.8如果去掉,会导致*.mkv在重新进行编码时会花费大量的时间,我有点心疼我的电脑...,所以就加上了,加上后效果很明显,编码很快,和闪电侠一样快。

5)*.mkv之后不要再加-codec copy了,否则-g 2 -keyint_min 2就没用了。

如果想了解产生的step1_output_larger.mkv的关键帧数量、音视频长度、视频帧率、音频采样率等信息可以使用ffprobe,有需要的可以研究下。

1.2 根据step1_output_larger.mkv微调原截取开始时间和持续时间

ffmpeg -y -ss timestamp_begin_new -t duration_new -intra -accurate_seek -i step1_output_larger.mkv -codec copy -avoid_negative_ts make_zero step1_output.mkv

说明几点:

1)timestamp_begin_new和duration_new都是微调后的值,确保在timestamp_begin_new时刻的声音不会突然截断,在timestamp_begin_new+duration_new时刻声音也不会突然截断,可以先获取step1_output_larger.mkv的音频数据,wav或mp3格式的均可,然后需对音频进行采样,模拟转成数字后,处理上就容易多了,此时的处理类似于在数组中查找第1个0或最后1个0的索引,转化为时间后,再计算该时间相对于原时间的时间偏差,这个偏差+原时间戳开始时间就是timestamp_begin_new。

1.3 根据step1_output.mkv和微调后的开始时间和持续时间产生step2_output.mkv

ffmpeg -y -intra -accurate_seek -ss 0 -t duration_new -i step1_output.mkv  -codec copy -avoid_negative_ts make_zero step2_output.mkv

说明几点:

1)此时的ss从0开始,持续时间t改成duration_new。

2)直接使用-codec copy就可以了,无需重新编码了。

1.4 其他的处理

主要是指:

声音和视频的渐入fade_in和渐出fade_out,详细可研究ffmpeg文档;

将mkv转成mp4,同时将mkv的字幕烧写到mp4中,详细可研究ffmpeg文档。

1.5 截取的一个示例

我将MP4转成gif了,可以看到渐出的效果。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一. 精确截取视频
    • 1.1 根据原视频,截取产生1个包含很多关键帧的视频step1_output_larger.mkv
      • 1.2 根据step1_output_larger.mkv微调原截取开始时间和持续时间
        • 1.3 根据step1_output.mkv和微调后的开始时间和持续时间产生step2_output.mkv
          • 1.4 其他的处理
            • 1.5 截取的一个示例
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档