Ошибка FFmpeg “Продолжительность, предоставленная приложением: […] выходит за пределы допустимого диапазона для формата mov/mp4” при объединении обрезанных видео с GoPro: как это исправить?

Вопрос или проблема

Я хочу соединить два видео GoPro без потерь с помощью следующей команды FFmpeg:

ffmpeg -safe 0 -f concat -i "list_videos.txt" -map 0:v -map 0:a -map 0:3 -copy_unknown -tag:2 gpmd -c copy "ab.mp4"

с файлом list_videos.txt, содержащим:

file 'a.MP4'
file 'b.MP4'

Это работает хорошо. Дополнительные параметры -map 0:v -map 0:a -map 0:3 -copy_unknown -tag:2 gpmd сохраняют информацию телеметрии.

Поскольку a.MP4 немного слишком длинное, и я просто хочу сохранить первые 10 секунд, я запускаю следующую команду FFmpeg, чтобы оставить первые 10 секунд, как предложил Гьян:

ffmpeg -sseof -10 -i a.MP4 -map 0:v -map 0:a -map 0:3 -map 0:3 -copy_unknown -tag:2 gpmd -tag:3 gpmd -c copy a_only_the_first_10secs.MP4

Это работает хорошо. Однако, когда я пытаюсь объединить a_only_the_first_10secs.MP4 с b.MP4 с помощью вышеупомянутой команды (ffmpeg -safe 0 -f concat [...]), это не удается и выдает ошибку:

[mp4 @ 000001da1b77e900] Приложение предоставило длительность: -9223372036854775808 / метка времени: -9223372036854775808 выходит за пределы формата mov/mp4
[mp4 @ 000001da1b77e900] pts не имеет значения

В чем проблема?


Полный лог:

C:\vids\test>ffmpeg -safe 0 -f concat -i "list_videos.txt" -map 0:v -map 0:a -map 0:3 -copy_unknown -tag:2 gpmd -c copy "ab.mp4"
ffmpeg version 5.0.1-full_build-www.gyan.dev Copyright (c) 2000-2022 разработчики FFmpeg
  собран с помощью gcc 11.2.0 (Rev7, собран проектом MSYS2)
  конфигурация: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
[concat @ 000001da1b736440] Не удалось найти параметры кодека для потока 4 (Неизвестно: none): неизвестный кодек
Рекомендуется увеличить значение для параметров 'analyzeduration' (0) и 'probesize' (5000000)
Ввод #0, concat, из 'list_videos.txt':
  Длительность: N/A, начало: -0.026667, битрейт: 59959 kb/s
  Поток #0:0(eng): Видео: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, bt709), 3840x2160 [SAR 1:1 DAR 16:9], 59651 kb/s, 59.94 fps, 59.94 tbr, 60k tbn
    Метаданные:
      handler_name    : GoPro H.265
      vendor_id       : [0][0][0][0]
      timecode        : 00:05:41:11
  Поток #0:1(eng): Аудио: aac (LC) (mp4a / 0x6134706D), 48000 Hz, стерео, fltp, 189 kb/s
    Метаданные:
      handler_name    : GoPro AAC
      vendor_id       : [0][0][0][0]
  Поток #0:2(eng): Данные: bin_data (gpmd / 0x646D7067), 59 kb/s
    Метаданные:
      handler_name    : GoPro MET
  Поток #0:3(eng): Данные: bin_data (gpmd / 0x646D7067), 59 kb/s
    Метаданные:
      handler_name    : GoPro MET
  Поток #0:4: Неизвестно: none
[mp4 @ 000001da1b77e900] Приложение предоставило длительность: -9223372036854775808 / метка времени: -9223372036854775808 выходит за пределы формата mov/mp4
[mp4 @ 000001da1b77e900] pts не имеет значения
Вывод #0, mp4, в 'ab.mp4':
  Метаданные:
    encoder         : Lavf59.16.100
  Поток #0:0(eng): Видео: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, bt709), 3840x2160 [SAR 1:1 DAR 16:9], q=2-31, 59651 kb/s, 59.94 fps, 59.94 tbr, 60k tbn
    Метаданные:
      handler_name    : GoPro H.265
      vendor_id       : [0][0][0][0]
      timecode        : 00:05:41:11
  Поток #0:1(eng): Аудио: aac (LC) (mp4a / 0x6134706D), 48000 Hz, стерео, fltp, 189 kb/s
    Метаданные:
      handler_name    : GoPro AAC
      vendor_id       : [0][0][0][0]
  Поток #0:2(eng): Данные: bin_data (gpmd / 0x646D7067), 59 kb/s
    Метаданные:
      handler_name    : GoPro MET
Поточное сопоставление:
  Поток #0:0 -> #0:0 (copy)
  Поток #0:1 -> #0:1 (copy)
  Поток #0:3 -> #0:2 (copy)
Нажмите [q], чтобы остановить, [?] для помощи
frame=19394 fps=3787 q=-1.0 Lsize= 2368221kB time=00:05:23.56 bitrate=59958.9kbits/s speed=63.2x
video:2358037kB audio:7480kB subtitle:0kB другие потоки:2347kB глобальные заголовки:0kB накладные расходы мультиплексирования: 0.015097%

Неизвестный поток заставляет ffmpeg искать временную метку, которой у него нет. Вы можете извлечь метаданные в файл, выполнить объединение, а затем добавить метаданные к файлу.

Извлеките каждый поток отдельно:

ffmpeg -i a.MP4 -map 0:2 -f ffmetadata a_gpmd1.txt
ffmpeg -i a.MP4 -map 0:3 -f ffmetadata a_gpmd2.txt

Объедините метаданные: type a_gmpd1.txt a_gmpd2.txt > a_metadata.txt Повторите для другого файла. Затем снова объедините.

type a_metadata.txt b_metadata.txt > final_metadata.txt

Поскольку вы уже извлекли метаданные, вы можете получить первые 10 секунд следующим образом:

ffmpeg -i a.MP4 -to 00:00:10 -map 0:v -map 0:a -c copy a_first_10secs.MP4

Выполните объединение:

ffmpeg -safe 0 -f concat -i "list_videos.txt" -map 0:v -map 0:a -c copy "concatenated.mp4"

Затем добавьте метаданные обратно в файл:

ffmpeg -i "concatenated.mp4" -i final_metadata.txt -map_metadata 1 -c copy "final_output.mp4"

Ответ или решение

Как исправить ошибку FFmpeg "Application provided duration: […] is out of range for mov/mp4 format" при конкатенации обрезанных видео GoPro

Когда вы пытаетесь конкатенировать видеофайлы, созданные камерой GoPro, с помощью FFmpeg и получаете сообщение об ошибке, содержащейся в строке "Application provided duration: -9223372036854775808 / timestamp: -9223372036854775808 is out of range for mov/mp4 format", это может быть связано с тем, что один из потоков данных не имеет корректных временных меток. В частности, это может происходить из-за наличия неизвестных потоков, которые FFmpeg не может обработать должным образом.

Шаги для устранения проблемы

  1. Проверка и извлечение потоков:
    Первым делом, вам нужно выяснить, какие потоки содержатся в каждом из ваших видеофайлов и извлечь необходимые данные. Если у вас есть дополнительный поток данных (например, метаданные), который неизвестен для FFmpeg, вам следует отдельно извлечь каждый поток данных, например, таким образом:

    ffmpeg -i a.MP4 -map 0:2 -f ffmetadata a_gpmd1.txt
    ffmpeg -i a.MP4 -map 0:3 -f ffmetadata a_gpmd2.txt

    Эти команды извлекут метаданные из видео в текстовые файлы.

  2. Объединение метаданных:
    Затем объедините извлеченные метаданные в один файл:

    type a_gpmd1.txt a_gpmd2.txt > a_metadata.txt

    Повторите этот процесс и для второго видеофайла (например, b.MP4).

  3. Обрезка видео:
    Чтобы оставить только первые 10 секунд видео, вы можете использовать следующую команду:

    ffmpeg -i a.MP4 -to 00:00:10 -map 0:v -map 0:a -c copy a_first_10secs.MP4
  4. Конкатенация видео:
    Создайте文件 списка list_videos.txt, который будет содержать ваши видеофайлы:

    file 'a_first_10secs.MP4'
    file 'b.MP4'

    После подготовки файла списка, выполните команду конкатенации:

    ffmpeg -safe 0 -f concat -i "list_videos.txt" -map 0:v -map 0:a -c copy concatenated.mp4
  5. Добавление метаданных:
    После успешной конкатенации видео, вы можете вернуть метаданные в объединенный файл:

    ffmpeg -i "concatenated.mp4" -i final_metadata.txt -map_metadata 1 -c copy final_output.mp4

Заключение

Следуя указанным выше шагам, вы сможете исправить ошибку при конкатенации обрезанных видеоклипов GoPro. Основная проблема заключается в некорректных временных метках, возникающих из-за неизвестных потоков данных. Убедитесь также, что вы используете актуальную версию FFmpeg, так как обновления могут содержать исправления различных ошибок. Если проблема сохраняется, важно проверить структуру исходных файлов и их кодеки, возможно, потребуется конвертация в более стандартный формат перед конкатенацией.

Оцените материал
Добавить комментарий

Капча загружается...