ffmpeg 不会将视频剪辑成预期的分钟数

ffmpeg 不会将视频剪辑成预期的分钟数

当我尝试将 8.27 分钟的视频剪辑成 6.27、1 和 1 分钟的视频时,第一部分为 6.27 分钟,第二部分为 2.05 分钟,而第三部分为 00.58 分钟。

如何解释这一现象?

  365  ffmpeg -ss 00:00:00 -i anotated_video.mp4 -to 00:06:27 -c copy train_anotated.mp4
  366  ffmpeg -ss 00:06:28 -i anotated_video.mp4 -to 00:07:28 -c copy test_anotated.mp4
  367  ffmpeg -ss 00:07:29 -i anotated_video.mp4 -to 00:08:27 -c copy val_anotated.mp4


(base) kubraeryilmaz@ DATA %

(base) kubraeryilmaz@ DATA % ffmpeg -ss 00:06:28 -i anotated_video.mp4 -to 00:07:28 -c copy test_anotated.mp4
ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple clang version 12.0.0 (clang-1200.0.32.21)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_2 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'anotated_video.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.45.100
  Duration: 00:08:27.07, start: 0.000000, bitrate: 1448 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1024x1024, 1445 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Output #0, mp4, to 'test_anotated.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.45.100
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1024x1024, q=2-31, 1445 kb/s, 30 fps, 30 tbr, 15360 tbn, 15360 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame= 3746 fps=0.0 q=-1.0 Lsize=   26055kB time=00:01:58.96 bitrate=1794.1kbits/s speed=4.34e+03x    
video:26011kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.167802%

答案1

你正在做直接复制视频流的原始部分被剪切到新的视频文件中。因此,ffmpeg 只能剪切视频关键帧关键帧或帧内帧是包含当前图像所有信息的帧。在关键帧之间,只存储帧的变化,这是实现较小视频文件大小的最重要技巧之一。如果您在其中一个帧上剪切视频流,则前一帧不再可用,因此无法再构建该帧。因此,生成的视频流将损坏。

如果需要精确的时间,您需要重新编码视频流,至少在您要剪切的两个关键帧之间进行重新编码。重新编码的缺点是需要更多时间,并且质量会下降(但可能不明显),因为您需要解压有损压缩视频,然后必须再次压缩。

在命令行中,-c copy参数是导致直接复制媒体流的原因。如果省略该参数,ffmpeg 将使用默认设置重新编码,即输入视频的编解码器和默认压缩设置。您可以通过分别添加视频和音频流的-vcodec-acodec选项来自己控制这些。

相关内容