如何使用 ffmpeg 从视频中剪切一部分?
想象一下我有一个 60 秒的 mp4 A。
我想删除 0:15 到 0:45 之间的所有内容。
结果应该是一个 30 秒的 mp4,它由前 15 秒的A和后 15 秒的 组成A。
在不使用 concat 的情况下如何做到这一点?
我知道如何通过创建两个中间文件然后使用 ffmpeg 连接它们来做到这一点。我不想为此(简单?)操作执行如此多的手动工作。
我还看到过trim用于从视频中删除多个部分的文件夹。我发现的所有用法都表明它似乎非常冗长,并且我还没有找到像我想要的那样简单的案例示例(仅删除了一个部分)。
我必须使用修剪来执行此操作吗?或者还有其他不太冗长的解决方案吗?
当然,理想的情况至少是简单的,例如-ss 0:15 -to 0:45删除视频的结尾(-cut 0:15-0:45例如)。
jai*_*met 23
我从 /sf/answers/3793486371/开始(目前是“FFmpeg 从视频中间删除 2 秒并连接各部分。单行解决方案”的唯一答案)。
从该示例开始,以下内容对我有用:
# In order to keep <start-15s> and <45s-end>, you need to
# keep all the frames which are "not between 15s and 45s":
ffmpeg -i input.mp4 \
-vf "select='not(between(t,15,45))', setpts=N/FRAME_RATE/TB" \
-af "aselect='not(between(t,15,45))', asetpts=N/SR/TB" \
output.mp4
Run Code Online (Sandbox Code Playgroud)
这是一个单行 Linux 命令,但我使用了 bash 行继续符('\'),这样我就可以垂直对齐等号,因为这有助于我理解正在发生的事情。
我以前从未见过 ffmpegnot和运算符,但我在这里between找到了他们的文档。
关于通常的 ffmpeg“复制与重新编码”二分法,我希望能够使用 ffmpeg 的“复制”“编解码器”(是的,我知道它不是真正的编解码器),这样 ffmpeg 就不会重新编码我的视频,但如果我指定“复制”,那么 ffmpeg 将在最近的关键帧处启动和停止,这些关键帧与我所需的开始点和停止点不够接近。(我想删除一段大约 20 秒长的视频,但我的源视频每 45 秒只有一个关键帧!)。因此我不得不重新编码。有关更多信息,请参阅https://trac.ffmpeg.org/wiki/Seeking#Seekingwhiledoingacodeccopy 。
setpts/asetpts 过滤器将每个帧上的时间戳设置为正确的值,以便您的媒体播放器能够在正确的时间播放每个帧。
HTH。
Lim*_*ent 10
如果您想使用复制“编解码器”,请考虑以下方法:
ffmpeg -i input.mp4 -t "$start_cut_section" -c copy part1.mp4&
ffmpeg -i input.mp4 -ss "$end_cut_section" -c copy part2.mp4&
echo "file 'part1.mp4'" > filelist;
echo "file 'part2.mp4'" >> filelist;
wait;
ffmpeg -f concat -i filelist -c copy output.mp4;
rm filelist;
Run Code Online (Sandbox Code Playgroud)
这将创建剪切前后的两个文件,然后将它们组合成一个新的修剪后的最终视频。显然,这可以用来创建任意数量的剪切。它可能看起来比接受的答案更长,但由于使用了复制编解码器,它的执行速度可能会快得多。
| 归档时间: |
|
| 查看次数: |
9856 次 |
| 最近记录: |