FFmpeg에서 밀리초로 트리밍하면 처리 속도가 크게 느려집니다.

FFmpeg에서 밀리초로 트리밍하면 처리 속도가 크게 느려집니다.

저는 이곳에 처음 왔고 이런 포럼 사이트에 처음 가입했습니다. 만약 제가 형편없다면 진심으로 사과드립니다! 양해해 주셔서 미리 감사드립니다. 내 노트북에서 Windows CMD를 실행하고 있습니다.

해당 동작에 오디오가 동기화된 댄스 비디오의 처음 7.3초 부분을 트리밍(삭제)하려고 합니다. 내가 시작한 코드 줄은 다음과 같습니다.

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

이 편집은 즉시 발생하지만(훌륭함) 밀리초는 무시되고 결과 출력 파일은 7.3초가 아닌 7초부터 잘립니다. 그래서 다음과 같이 수정해 보았습니다(입력 순서를 전환하여).

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

여기서 편집은 다시 즉각적이고(훌륭함) 정확한 밀리초 수준의 세부 수준으로 잘렸지만 오디오에 지연이 발생했습니다(편집된 비디오를 쓸모 없게 만들었습니다). 현재 일반 소프트웨어 'Movies & TV'를 사용하여 동영상을 재생하고 있지만 결국에는 이러한 동영상을 Vimeo에 업로드하여 여러 기기에서 스트리밍할 예정입니다.

나는 모든 것을 살펴보았고 단 하나의 해결책을 찾았습니다.

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

이 작업은 정확하게 작동하지만 안타깝게도 450MB 파일을 처리하는 데 최대 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인코딩에 대한 인내심에 따라 값을 다른 사전 설정으로 설정할 수 있습니다 .

관련 정보