速度快但可能不准确

速度快但可能不准确

如何使用 ffmpeg 从 .mp4 文件中删除几秒钟?我有一个 test.mp4 文件,我想从 11:00 到 11:10 删除 10 秒

答案1

速度快但可能不准确

这避免了重新编码,但您只能在关键帧上剪切,因此它可能无法选择您想要的持续时间。

  1. 创建细分:

    ffmpeg  -t 00:11:00 -i input.mp4 -map 0 -c copy segment1.mp4
    ffmpeg -ss 00:11:10 -i input.mp4 -map 0 -c copy segment2.mp4
    
  2. 创造input.txt

    file 'segment1.mp4'
    file 'segment2.mp4'
    
  3. 连接解复用器

    ffmpeg -f concat -i input.txt -map 0 -c copy output.mp4
    

缓慢但准确

您可以尝试在不重新编码的情况下执行此操作,但由于您只能在关键帧上剪切,因此它可能与您想要的剪切时间不一致,因此如果您需要准确性,则需要重新编码:

ffmpeg -i input.mp4 -filter_complex \
  "[0:v]trim=end=660,setpts=N/FRAME_RATE/TB[v0]; \
   [0:a]atrim=end=660,asetpts=N/SR/TB[a0]; \
   [0:v]trim=start=670,setpts=N/FRAME_RATE/TB[v1]; \
   [0:a]atrim=start=670,asetpts=N/SR/TB[a1]; \
   [v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]" \
  -map "[v]" -map "[a]" output.mp4
  • (a)trim 将允许您选择剪辑。
  • (a)setpts 重置时间戳。
  • concat 连接剪辑。

FFmpeg 过滤器文档了解每个过滤器的详细信息。

答案2

我认为您必须将视频剪切成两部分,然后将它们合并在一起。第一个“时间值”是起点,第二个“时间值”是您要剪切的视频的长度。例如,第一个剪切从 00:00:00 开始,长度为 11 分钟,第二个剪切从 11 分 10 秒开始,长度为 10 分钟。

切割:

ffmpeg -i test.mp4 -ss 00:00:00 -t 00:11:00 -acodec copy -vcodec copy test1.mp4

ffmpeg -i test.mp4 -ss 00:11:10 -t 00:10:00 -acodec copy -vcodec copy test2.mp4

合并:

cat test1.mp4 test2.mp4 >> test3.mp4

我还没有尝试过,如果有效请告诉我。

答案3

我利用这里的知识创建了一个 shell 脚本。

将其保存为具有名称和 .sh 扩展名的文件(例如 video-cutter.sh)用于chmod +x video-cutter.sh允许其执行。

将以上内容粘贴到文件中并保存

#!/bin/bash

echo 'Input file:' $1
echo 'Output file:' $2
echo 'Start time of segment' $3
echo 'End time of segment' $4

ffmpeg -t $3 -i $1 -map 0 -c copy segment1.mp4

ffmpeg -ss $4 -i $1 -map 0 -c copy segment2.mp4

echo "file 'segment1.mp4'" >> input.txt
echo "file 'segment2.mp4'" >> input.txt 

ffmpeg -f concat -i input.txt -map 0 -c copy $2

echo 'Finished. Saved at ' $2

rm input.txt
rm segment1.mp4
rm segment2.mp4

执行它运行./video-cutter.sh test.mp4 test-without-segment.mp4 startTime endTime

例子:./video-cutter.sh originalfile.mp4 outputfile.mp4 00:11:00 00:11:10

相关内容