ffmpeg视频精准剪切

1. 导言

ffmepg剪切视频,很方便,但是也有很大缺陷:
(1)剪切时间点不精确
(2)有时剪切的视频开头有黑屏

造成这些问题的原因是ffmpeg无法seek到非关键帧上。
一下本文通过一些参数配置尽可能地减轻以上问题


2. 基本剪切方法

ffmpeg -i test.mp4 -ss 10 -t 15 -codec copy cut.mp4

参数分析:

-i : source
-ss:start time
-t :duration
-c :video,audio codec

时间格式:

  • x秒
  • HOURS:MM:SS.MICROSECONDS

可以设置输出视频的编码格式

-vcodec xxx
-acodec xxx

把-ss, -t参数放在-i参数之后,是对输出文件执行的seek操作
输入文件会逐帧解码,直到-ss设置的时间点为止,这么操作会很慢,虽然时间点是准确的,但是很容易出现黑屏问题。


3. 参数优化

(1)将-ss, -t 参数放在-i参数之前

ffmpeg -ss 10 -t 15 -i test.mp4 -codec copy cut.mp4

对输入文件执行seek操作,会seek到-ss设置的时间点前面的关键帧上。
时间不精确,但是不会出现黑屏

(2)accurate_seek
剪切时间更加精确

ffmpeg -ss 10 -t 15 -accurate_seek -i test.mp4 -codec copy cut.mp4

PS:accurate_seek必须放在-i参数之前

(3)avoid_negative_ts
如果编码格式采用的copy 最好加上 -avoid_negative_ts 1参数

ffmpeg -ss 10 -t 15 -accurate_seek -i test.mp4 -codec copy -avoid_negative_ts 1 cut.mp4

4. 参考文献

[1] http://trac.ffmpeg.org/wiki/Seeking

### 如何进行视频轨道分割 在视频编辑领域,视频轨道分割是一项常见的需求。以下是关于如何通过不同工具和技术来实现这一目标的具体说明。 #### 使用 OpenShot 进行视频轨道分割 OpenShot 是一款功能强大的开源视频编辑软件,支持多种格式并提供丰富的编辑功能[^1]。要完成视频轨道分割的操作,可以按照以下方式操作: - 打开 OpenShot 并加载需要编辑的视频文件。 - 将视频拖放到时间轴上的相应轨道位置。 - 利用鼠标点击时间轴中的播放头,将其移动到希望分割的位置。 - 右键单击该视频片段,选择 **“剪切”** 或者按下快捷键 `Ctrl + K` 来执行分割动作。 ```python # 示例代码展示如何调用命令行版本的 OpenShot API (假设存在) import subprocess subprocess.run(["openshot", "--split-video", "input.mp4", "-t", "00:00:10"]) ``` 此过程会将选定的视频分成两部分,并分别放置在同一轨道的不同区域中。 --- #### 基于 Shotcut 的视频轨道分割方案 Shotcut 同样是一款优秀的跨平台视频编辑器,以其灵活性和高效性著称[^3]。对于视频轨道分割而言,其具体流程如下所示: - 导入待处理的素材至项目库。 - 把素材拖拽到主窗口下方的时间线上对应轨道处。 - 移动滑块到达期望切割点附近;也可以手动输入精确的时间码数值。 - 单击顶部菜单栏里的 **“剪刀图标”**(Split Clip),或者按键盘上的默认热键 `S` 完成分离工作。 值得注意的是,Shotcut 支持复杂的多轨编辑环境以及即时预览效果调整等功能。 --- #### LosslessCut 实现无损视频轨道分割 如果追求极致效率与质量保留,则可以选择专门针对快速无损剪辑设计的应用程序——LosslessCut[^4]。它的核心优势在于无需重新编码即可完成精准分片任务,从而极大缩短等待时间和保持原始分辨率清晰度不变。 - 下载安装 LosslessCut 应用程序之后启动它。 - 添加源文件路径并通过内部媒体播放控件找到确切断点坐标。 - 设定起始结束区间参数后确认提交指令即刻获得独立保存的新段落成果物。 由于整个过程中没有任何额外的数据转换环节参与其中,因此最终产物能够完美继承母版属性特征。 --- #### JavaScript 中利用 FFmpeg.js 截取首帧作为封面图实例演示 除了上述提到的各种图形界面应用程序之外,还可以借助编程手段达成自动化批量生产目的。下面给出一段基于 Node.js 和 WebAssembly 版本 ffmpeg 的脚本例子用于获取指定时刻的画面截图充当缩略代表图片用途[^2]: ```javascript const { createFFmpeg, fetchFile } = require('@ffmpeg/ffmpeg'); async function extractFrame(inputVideoPath, outputImagePath, timeInSeconds) { const ffmpeg = createFFmpeg({ log: true }); await ffmpeg.load(); ffmpeg.FS('writeFile', inputVideoPath, await fetchFile(inputVideoPath)); await ffmpeg.run('-i', inputVideoPath, '-ss', `${timeInSeconds}`, '-vframes', '1', outputImagePath); const data = ffmpeg.FS('readFile', outputImagePath); console.log(`Extracted frame saved to ${outputImagePath}`); } extractFrame('./example.mp4', './thumbnail.png', 5); // 提取第5秒画面存为PNG格式文件 ``` 以上代码展示了怎样运用现代前端技术栈配合第三方依赖包实现在服务器端远程操控多媒体资源的能力。 ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值