使用FFmpeg精确剪切mp4文件

使用FFmpeg精确剪切mp4文件,ffmpeg,Ffmpeg,我想把mp4视频剪辑成以秒为单位的视频 在示例中: 00:00:00 - 00:00:01 00:00:01 - 00:00:02 00:00:02 - 00:00:10.01 这是我使用的命令: ffmpeg.exe -i 10sec.mp4 -ss 00:00:00 -t 00:00:01 -async 1 -strict -2 -c copy 0002.mp4 ffmpeg.exe -i 10sec.mp4 -ss 00:00:01 -t 00:00:02 -async 1 -stric

我想把mp4视频剪辑成以秒为单位的视频 在示例中:

00:00:00 - 00:00:01
00:00:01 - 00:00:02
00:00:02 - 00:00:10.01
这是我使用的命令:

ffmpeg.exe -i 10sec.mp4 -ss 00:00:00 -t 00:00:01 -async 1 -strict -2 -c copy 0002.mp4
ffmpeg.exe -i 10sec.mp4 -ss 00:00:01 -t 00:00:02 -async 1 -strict -2 -c copy 0003.mp4
ffmpeg.exe -i 10sec.mp4 -ss 00:00:02 -t 00:00:10.01 -async 1 -strict -2 -c copy 0004.mp4
我得到的文件是: 1.3秒长 2.6秒长 8.5秒长

所以很明显切割不准确

我知道这与关键帧有关,所以我想将原始文件(质量非常高的mpeg)解压缩为完全不压缩(因此每一帧都是关键帧),然后对其进行剪切(因此现在剪切将是准确的)

准确度对我来说如此重要的原因是,在剪辑之后,我必须将片段重新连接到单个电影中,而目前,我只是在从片段创建的电影中进行复制

我尝试了.avi版本:

..\ffmpeg.exe -i 10sec.mp4 -vcodec rawvideo -acodec copy uncompressed.mp4
这显然是失败的,因为:

 [mp4 @ 091f1300] Could not find tag for codec rawvideo in stream #0, codec not currently supported in container
 Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
 Error initializing output stream 0:0 --

所以我的q。是的,我如何使用
ffmpeg
精确地剪切文件(我有
pkt_pts
以及我想要剪切的时间,因此如果可以通过
pkt_pts
精确剪切,它也会帮助我)?

错误说明MP4不支持未压缩视频。因此,您最好使用AVI容器并指定像素格式:

..\ffmpeg.exe-i 10sec.mp4-vcodec rawvideo-pix_fmt bgr24-acodec 复制未压缩的.avi

然后,您可以按帧/时间精确剪切未压缩的.avi文件

这就是我的工作原理:

  • 使用无损耗转码从原始视频(Imagine.mp4)中仅剪切视频部分
  • ffmpeg-i Imagine.mp4-ss 00:00:00.00-t 00:00:05-c:v libx264-crf 0-preset ultrafast-an Imagine_part0.mp4

    ffmpeg-i Imagine.mp4-ss 00:00:05.00-t 00:00:05-c:v libx264-crf 0-preset ultrafast-an Imagine\u part1.mp4

    ffmpeg-i Imagine.mp4-ss 00:00:10.00-c:v libx264-crf 0-preset ultrafast-an Imagine_part2.mp4

  • 无需重新编码即可连接部件
  • ffmpeg-f concat-safe 0-i files.txt-an-c:v copy-fflags+genpts Imagine_.mp4

  • 仅将原始文件中的音频添加到加入的视频并创建最终输出(视频+音频)
  • ffmpeg-i Imagine_joined.mp4-i Imagine.mp4-c:v copy-c:a aac-map 0:v:0-map 1:a:0-shortest-fflags+genpts Imagine_final.mp4


    在第1步和第2步之间,您通常会按照目标质量进行编码,但为了简单起见,我忽略了这一点。

    这是一个巨大的文件(从22MB到3.4gb),对于全尺寸电影来说,这不是一个可扩展的解决方案(全视频源为12gb…),您是否有更具可扩展性的解决方案的想法?此外,我似乎仍然没有得到准确的切割:(如果不进行部分解码或重新编码,则无法在非关键帧处剪切视频。您必须在关键帧处剪切或进行解码。尝试不使用音频。根据音频格式,ffmpeg可能无法准确剪切。您可以稍后将音频添加到重新连接的视频中。我接受它,但为什么我会得到不一致的文件?如何生成spli可以重新连接到准确的原始视频的ts?(我接受不准确的切割位置,只要每个切割都在正确的位置(就在最后一个切片之后))