arl*_*dia 4 linux ffmpeg video-conversion video-codecs
我正在使用 ffmpeg 在 CentOS Web 服务器上处理用户上传的视频。我需要将每个视频转换为标准大小和格式,然后从每个视频中提取 30 秒的示例剪辑。我想在提取命令中使用“-vcodec copy”标志以避免第二次编码。
此命令适用于我的初始转换:
ffmpeg -i uploaded.mov -f mp4 -vcodec libx264 -vpre medium -acodec libfaac -r 15 -b 360k -ab 48k -ar 22050 -s 480x320 formatted.mp4
Run Code Online (Sandbox Code Playgroud)
这有时适用于提取:
ffmpeg -i formatted.mp4 -vcodec copy -acodec copy -ss 0 -t 30 formatted_sample.mp4
Run Code Online (Sandbox Code Playgroud)
但是,当我对某些视频运行提取命令时,提取的示例剪辑以几秒钟的空白视频开始。音频立即开始,但视频在 3-6 秒内没有开始。
为了演示这个问题,我上传了两个视频片段并在它们上运行上述命令。我在 Final Cut Express 中创建了第一个剪辑,并在上传到 Web 服务器之前使用 Handbrake 对其进行了编码:
1a)上传的剪辑
1b)用第一个命令转换
相比之下,第二个剪辑来自Apple的网站并没有显示问题:
2a)上传的剪辑
2b)用第一个命令转换
2c)用第二个命令提取,没问题
谁能看出这两个源剪辑有什么不同?如果是这样,我可以在我的转换命令中做些什么,以便在提取命令运行时,设置剪辑以避免丢失视频?
顺便说一句,我最初从 yum 安装 ffmpeg 0.6.1 时遇到了问题,但我升级到最新的 git 版本,问题仍然存在。
Matt 关于关键帧的建议,结合及时发布到 ffmpeg 邮件列表的提示,让我找到了一个解决方案,尽管我不确定这是否是最好的解决方案。
首先,我必须在提取命令中移动 -ss 和 -t 选项,以便它们出现在 -i 选项之前。这会导致提取从下一个最早的关键帧开始。所以假设我使用 -ss 25 -t 15 在我的剪辑中从 0:25 到 0:40 提取,但我每 10 秒就有一个关键帧。以前我会得到一个 15 秒的样本,从 5 秒的空白视频开始。现在我将获得一个 20 秒的样本,从 0:20 到 0:40 运行,但没有空白视频。换句话说,我避免了空白视频,但失去了剪辑选择的准确性。
为了解决这个问题,我必须在我的转换命令中添加 -g 选项以重新格式化关键帧。我使用 -g 15 和 -r 15 每秒制作一个关键帧。这允许我选择最接近秒的样本位置,因此 -ss 25 -t 15 会给我我要求的 15 秒剪辑。我希望额外的关键帧使我的完整剪辑更大,但在我的测试中它只大了大约 2%,这对我的项目来说是一个很好的权衡。
因此,我将上面的两个命令更改为:
ffmpeg -i uploaded.mov -f mp4 -vcodec libx264 -vpre medium -acodec libfaac -r 15 -g 15 -b 360k -ab 48k -ar 22050 -s 480x320 formatted.mp4
ffmpeg -ss 0 -t 30 -i formatted.mp4 -vcodec copy -acodec copy formatted_sample.mp4
Run Code Online (Sandbox Code Playgroud)
一切似乎都很好。如果有人有更有效的解决方案,请发布,我会更改我选择的答案。
| 归档时间: |
|
| 查看次数: |
5416 次 |
| 最近记录: |