Cortar para milissegundos no FFmpeg causando enorme desaceleração na velocidade de processamento

Cortar para milissegundos no FFmpeg causando enorme desaceleração na velocidade de processamento

Sou novo aqui, estou entrando pela primeira vez em um fórum como este, então minhas mais sinceras desculpas se eu for péssimo! Agradecemos antecipadamente pela sua paciência. Estou executando o Windows CMD no meu laptop.

Estou tentando cortar (excluir) os primeiros 7,3 segundos de um vídeo de dança que possui áudio sincronizado com esses movimentos. Aqui está a linha de código com a qual comecei:

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

Embora essa edição aconteça instantaneamente (ótimo), o milissegundo é ignorado e o arquivo de saída resultante é cortado a partir de 7 segundos em vez de 7,3. Então tentei revisar o seguinte (alterando a ordem das entradas):

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

Aqui, a edição foi novamente instantânea (ótima) E cortada no nível correto de detalhe de milissegundos, porém um atraso no meu áudio foi introduzido (tornando o vídeo editado inútil). Atualmente, estou usando o software genérico 'Movies & TV' para reproduzir o vídeo, mas eventualmente enviarei esses vídeos para o Vimeo, de onde serão transmitidos em vários dispositivos.

Procurei por tudo e encontrei apenas uma solução:

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

Embora funcione com precisão, infelizmente leva cerca de 45 minutos para processar um arquivo de 450 MB. Tenho cerca de 800 vídeos semelhantes para editar (todos com a mesma introdução exata que precisa ser cortada) e queria saber se há alguma maneira de obter o nível de precisão de milissegundos sem criar uma enorme lentidão no processamento. Ou talvez eu pudesse resolver esse problema de outra forma através de um computador mais rápido? Estou aberto a toda e qualquer ideia, muito obrigado pela ajuda!

Aqui está a saída da linha de comando sem cortes do meusegundocomando:

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%

Responder1

Ao cortar um vídeo com cópia bitstream ( -c copy), não é possível cortar em carimbos de data/hora arbitrários. Um vídeo só pode ser cortado em quadros-chave (quadros intra ou quadros I), pois esses quadros não exigem que outros quadros estejam presentes no fluxo de bits para serem decodificados.

O que o ffmpeg fará é incluir todos os quadros necessários para que o quadro no ponto que você especificou (7,2 s) seja decodificável. Isso significa que seu vídeo cortadopodercontém tantos quadros quanto o original. No entanto, o ffmpeg atribuirá a esses frames um carimbo de data/hora negativo para que eles não sejam mostrados - nem todos os jogadores respeitam isso. Isso pode levar a problemas de sincronização A/V.

De qualquer forma, o único método para obter precisão total aqui é recodificar o vídeo, como você mostrou no segundo comando. A única maneira de acelerar isso é usar uma CPU mais rápida, usar um codificador de GPU mais rápido (por exemplo, NVENC se você tiver uma GPU NVIDIA compatível) ou permitir que o codificador desative alguns recursos, o que tornará o arquivo de saída um pouco maior ( a codificação será menos eficiente). Veja oGuia de codificação H.264para mais informações. Exemplo:

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

O -presetvalor pode ser definido para outras predefinições de acordo com quanta paciência você tem para codificação.

informação relacionada