在 FFmpeg 中修剪到毫秒會導致處理速度大幅下降

在 FFmpeg 中修剪到毫秒會導致處理速度大幅下降

我是新來的,第一次加入這樣的論壇網站,所以如果我很糟糕,我深感抱歉!預先感謝您的耐心等待。我在筆記型電腦上運行 Windows CMD。

我正在嘗試修剪(刪除)舞蹈影片中的前 7.3 秒,該影片的音訊與這些動作同步。這是我開始的程式碼行:

ffmpeg -ss 7.3 -i myVideo.mp4 -c copy trimmed.mp4

雖然此編輯會立即發生(很棒),但毫秒會被忽略,並且產生的輸出檔案會從 7 秒而不是 7.3 秒開始修剪。所以然後我嘗試修改以下內容(透過切換輸入順序):

ffmpeg -i myVideo.mp4 -ss 7.3 -c copy trimmed.mp4

在這裡,編輯再次是瞬時的(很棒),並以正確的毫秒級細節進行剪輯,但是我的音訊出現了延遲(使得編輯後的影片毫無用處)。我目前正在使用通用軟體“電影和電視”來播放視頻,但最終會將這些視頻上傳到 Vimeo,從那裡它們將在多個設備上進行串流傳輸。

我查遍了,只找到一個解決方案:

ffmpeg -ss 7.3 -i myVideo.mp4 -c:v libx264 -c:a aac trimmed.mp4

雖然這可以準確地工作,但不幸的是,處理 450 MB 的文件最終需要大約 45 分鐘的時間。我有大約800 個類似的影片需要編輯(所有這些影片都有完全相同的介紹,需要修剪),並且想知道是否有任何方法可以在不造成大規模處理速度減慢的情況下獲得毫秒級的精度?或者也許我可以透過更快的計算機來解決這個問題?我願意接受任何想法,非常感謝您的幫助!

這是我的未剪切的命令列輸出第二命令:

ffmpeg -i myVideo.mp4 -ss 7.3 -c copy trimmed.mp4
ffmpeg version N-94576-g1965161ef6 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9.1.1 (GCC) 20190807
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
  libavutil      56. 33.100 / 56. 33.100
  libavcodec     58. 55.100 / 58. 55.100
  libavformat    58. 31.101 / 58. 31.101
  libavdevice    58.  9.100 / 58.  9.100
  libavfilter     7. 58.100 /  7. 58.100
  libswscale      5.  6.100 /  5.  6.100
  libswresample   3.  6.100 /  3.  6.100
  libpostproc    55.  6.100 / 55.  6.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'myVideo.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp41mp42isom
    creation_time   : 2019-07-18T19:40:35.000000Z
  Duration: 00:03:37.25, start: 0.000000, bitrate: 20007 kb/s
    Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s (default)
    Metadata:
      creation_time   : 2019-07-18T19:40:35.000000Z
      handler_name    : Core Media Audio
    Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 19864 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 60k tbc (default)
    Metadata:
      creation_time   : 2019-07-18T19:40:35.000000Z
      handler_name    : Core Media Video
Output #0, mp4, to 'trimmed.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp41mp42isom
    encoder         : Lavf58.31.101
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 19864 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 30k tbc (default)
    Metadata:
      creation_time   : 2019-07-18T19:40:35.000000Z
      handler_name    : Core Media Video
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s (default)
    Metadata:
      creation_time   : 2019-07-18T19:40:35.000000Z
      handler_name    : Core Media Audio
Stream mapping:
  Stream #0:1 -> #0:0 (copy)
  Stream #0:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 6271 fps=2425 q=-1.0 Lsize=  523124kB time=00:03:29.93 bitrate=20412.9kbits/s speed=81.2x
video:519589kB audio:3357kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.034075%

答案1

當您使用位元流複製 ( ) 剪切影片時-c copy,無法以任意時間戳進行剪切。影片只能在關鍵影格(幀內幀或 I 幀)處進行剪切,因為這些幀不需要比特流中存在其他幀才能進行解碼。

ffmpeg 會做的是,它仍然會包含您指定的可解碼點(7.2 秒)處的幀所需的所有幀。這意味著您剪切的視頻可能包含與原始幀一樣多的幀。然而,ffmpeg 將為這些幀分配一個負時間戳,以便它們不應該被顯示——但並非所有播放器都尊重這一點。這可能會導致 A/V 同步問題。

無論哪種方式,在這裡實現完全準確的唯一方法是重新編碼視頻,如您在第二個命令中所示。加快速度的唯一方法是使用更快的CPU、使用更快的GPU 編碼器(例如,如果您有支援的NVIDIA GPU,則為NVENC),或允許編碼器停用某些功能,這將使輸出文件稍大一些(編碼效率會降低)。請參閱H.264編碼指南了解更多。例子:

ffmpeg -ss 7.3 -i myVideo.mp4 -c:v libx264 -preset faster -c:a aac trimmed.mp4

-preset根據您對編碼的耐心程度,可以將該值設為其他預設。

相關內容