使用Python3+ffmpeg对视频进行精确截取的探索
目录
1.1 根据原视频,截取产生1个包含很多关键帧的视频step1_output_larger.mkv
1.2 根据step1_output_larger.mkv微调原截取开始时间和持续时间
1.3 根据step1_output.mkv和微调后的开始时间和持续时间产生step2_output.mkv
网上有很多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了,可以看到渐出的效果。
相关文章
- pycharm怎么安装requests模块_python3安装模块
- Python3字符串替换replace(),translate(),re.sub()
- 当同时安装Python2和Python3后,如何兼容并切换使用详解(比如pip使用)
- python3标准库httpclient使用
- 关于python3导出excel图片链接转图片且图片内嵌表格内实现
- 使用ResNet101作为预训练模型训练Faster-RCNN-TensorFlow-Python3-master[通俗易懂]
- Python3操作MongoDB数据库
- Selenium4+Python3系列(十一) - Page Factory设计模式
- CentOS python3 & Java 安装
- Python3 + Django + xamdin + DjangoUediter,UEditorField 在 xadmin 下加载不出来的解决办法
- centos7 yum与Python3冲突详解程序员
- Ubuntu下使用python3中的venv创建虚拟环境
- python3使用urllib示例详解编程语言
- Python3 tesseract加载chi_sim异常停止工作详解编程语言
- Python3 判断文件和文件夹是否存在、创建文件夹详解编程语言
- Python3 itchat实现微信定时发送群消息详解编程语言
- Python3:Requests模块的异常值处理详解编程语言
- Python3.x的BeautifulSoup解析html常用函数详解编程语言
- python3:面向对象(多态和继承、方法重载及模块)详解编程语言
- Python 2to3:自动将Python 2.x代码转换成Python3.x代码
- Linux 卸载Python3:步骤与注意事项(linux卸载python3)
- python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)