Вопрос или проблема
Я хочу соединить два видео 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 не может обработать должным образом.
Шаги для устранения проблемы
-
Проверка и извлечение потоков:
Первым делом, вам нужно выяснить, какие потоки содержатся в каждом из ваших видеофайлов и извлечь необходимые данные. Если у вас есть дополнительный поток данных (например, метаданные), который неизвестен для 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_gpmd1.txt a_gpmd2.txt > a_metadata.txt
Повторите этот процесс и для второго видеофайла (например,
b.MP4
). -
Обрезка видео:
Чтобы оставить только первые 10 секунд видео, вы можете использовать следующую команду:ffmpeg -i a.MP4 -to 00:00:10 -map 0:v -map 0:a -c copy a_first_10secs.MP4
-
Конкатенация видео:
Создайте文件 списка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
-
Добавление метаданных:
После успешной конкатенации видео, вы можете вернуть метаданные в объединенный файл:ffmpeg -i "concatenated.mp4" -i final_metadata.txt -map_metadata 1 -c copy final_output.mp4
Заключение
Следуя указанным выше шагам, вы сможете исправить ошибку при конкатенации обрезанных видеоклипов GoPro. Основная проблема заключается в некорректных временных метках, возникающих из-за неизвестных потоков данных. Убедитесь также, что вы используете актуальную версию FFmpeg, так как обновления могут содержать исправления различных ошибок. Если проблема сохраняется, важно проверить структуру исходных файлов и их кодеки, возможно, потребуется конвертация в более стандартный формат перед конкатенацией.