Вопрос или проблема
Я хочу извлечь последние несколько секунд видео с GoPro без потерь с помощью FFmpeg, чтобы сохранить телеметрическую информацию и оригинальный порядок потоков.
В видео с GoPro четыре потока, в следующем порядке:
Stream #0:0[0x1](eng)
: ВидеоStream #0:1[0x2](eng)
: АудиоStream #0:2[0x3](eng)
: Данные: нет (tmcd / 0x64636D74) (по умолчанию)Stream #0:3[0x4](eng)
: Данные: bin_data (gpmd / 0x646D7067), 59 kb/s (по умолчанию)
Детали:
Stream #0:0[0x1](eng): Видео: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, bt709), 3840x2160 [SAR 1:1 DAR 16:9], 59703 kb/s, 59.94 fps, 59.94 tbr, 60k tbn (по умолчанию)
Метаданные:
время_создания : 2024-11-23T23:10:03.000000Z
имя_обработчика : GoPro H.265
идентификатор_производителя : [0][0][0][0]
кодировщик : Кодировщик GoPro H.265
таймкод : 23:26:28:23
Stream #0:1[0x2](eng): Аудио: aac (LC) (mp4a / 0x6134706D), 48000 Hz, стерео, fltp, 189 kb/s (по умолчанию)
Метаданные:
время_создания : 2024-11-23T23:10:03.000000Z
имя_обработчика : GoPro AAC
идентификатор_производителя : [0][0][0][0]
таймкод : 23:26:28:23
Stream #0:2[0x3](eng): Данные: нет (tmcd / 0x64636D74) (по умолчанию)
Метаданные:
время_создания : 2024-11-23T23:10:03.000000Z
имя_обработчика : GoPro TCD
таймкод : 23:26:28:23
Stream #0:3[0x4](eng): Данные: bin_data (gpmd / 0x646D7067), 59 kb/s (по умолчанию)
Метаданные:
время_создания : 2024-11-23T23:10:03.000000Z
имя_обработчика : GoPro MET
Я пытаюсь использовать эту команду, чтобы извлечь последние несколько секунд видео с GoPro с помощью ffmpeg так, чтобы сохранить телеметрическую информацию и оригинальный порядок потоков:
ffmpeg -sseof -10 -i input.MP4 -map 0:v -map 0:a -map 0:3 -c copy -copy_unknown output.MP4
Тем не менее, она изменяет порядок Stream #0:2[0x3](eng)
и Stream #0:3[0x4](eng)
, т.е. выходной файл output.MP4
имеет 4 потока, в следующем порядке:
Stream #0:0[0x1](eng)
: ВидеоStream #0:1[0x2](eng)
: АудиоStream #0:3[0x3](eng)
: Данные: bin_data (gpmd / 0x646D7067), 59 kb/s (по умолчанию)Stream #0:2[0x4](eng)
: Данные: нет (tmcd / 0x64636D74) (по умолчанию)
Детали потоков выходного файла output.MP4
:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.MP4':
Метаданные:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
encoder : Lavf61.7.100
Длительность: 00:00:10.24, начало: 0.000000, битрейт: 60393 kb/s
Stream #0:0[0x1](eng): Видео: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, bt709), 3840x2160 [SAR 1:1 DAR 16:9], 60132 kb/s, 59.94 fps, 59.94 tbr, 60k tbn (по умолчанию)
Метаданные:
имя_обработчика : GoPro H.265
идентификатор_произведителя : [0][0][0][0]
кодировщик : Кодировщик GoPro H.265
таймкод : 23:26:28:23
Stream #0:1[0x2](eng): Аудио: aac (LC) (mp4a / 0x6134706D), 48000 Hz, стерео, fltp, 189 kb/s (по умолчанию)
Метаданные:
имя_обработчика : GoPro AAC
идентификатор_произведителя : [0][0][0][0]
Stream #0:2[0x3](eng): Данные: bin_data (gpmd / 0x646D7067), 60 kb/s (по умолчанию)
Метаданные:
имя_обработчика : GoPro MET
Stream #0:3[0x4](eng): Данные: нет (tmcd / 0x64636D74), 0 kb/s
Метаданные:
имя_обработчика : GoPro H.265
таймкод : 23:26:28:23
Соблазнительно использовать следующую команду, поскольку, как slhck написал, “порядок опций -map
определяет порядок потоков в выходном файле”:
ffmpeg -sseof -10 -i input.MP4 -map 0:v -map 0:a -map 0:2 -map 0:3 -c copy output.MP4
Тем не менее, нельзя использовать -map
на потоках, которые FFmpeg не понимает, и в результате возникает эта ошибка:
[AVFormatContext @ 0000012f9b604700] Невозможно выбрать выходной формат для 'map'; используйте стандартное расширение для имени файла или укажите формат вручную.
[out#0 @ 0000012f9bb4fa00] Ошибка инициализации мультиплексора для map: Неверный аргумент
Ошибка открытия выходного файла map.
Ошибка открытия выходных файлов: Неверный аргумент
В качестве альтернативы можно попробовать перенести -copy_unknown
перед -map 0:3
, т.е.:
ffmpeg -sseof -10 -i input.MP4 -map 0:v -map 0:a -copy_unknown -map 0:3 -c copy output.MP4
Но FFmpeg не учитывает порядок -copy_unknown
относительно -map
, так что это не изменяет порядок потоков.
У меня закончились идеи. Для удобства тестирования вот пример видеофайла GoPro (18.5 MiB). Переименуйте его в input.MP4
, чтобы попробовать вышеприведенные команды, и используйте -sseof -1
вместо -sseof -10
, так как видео длится всего 2 секунды.
Как я могу извлечь последние несколько секунд видео с GoPro без потерь с помощью ffmpeg, чтобы сохранить телеметрическую информацию и оригинальный порядок потоков?
Ответ или решение
Чтобы вырезать последние несколько секунд видео GoPro без потерь с использованием FFmpeg, сохранив при этом данные телеметрии и порядок потоков, необходимо использовать правильные ключи и порядок назначения потоков в команде. Давайте разберем этот процесс шаг за шагом.
Понимание Потоков Видеофайла GoPro
В вашем примере GoPro видео содержит следующие потоки:
- Поток #0:0 (видео): видеопоток в кодеке HEVC.
- Поток #0:1 (аудио): аудиопоток в кодеке AAC.
- Поток #0:2 (данные): данные временного кода (tmcd).
- Поток #0:3 (данные): метаданные (gpmd).
Проблема С Заказом Потоков
Как вы уже заметили, использование команды:
ffmpeg -sseof -10 -i input.MP4 -map 0:v -map 0:a -map 0:3 -c copy -copy_unknown output.MP4
приводит к изменению порядка потоков в выходном файле. Чтобы сохранить требуемый порядок потоков, необходимо четко указать порядок в команде с использованием -map
.
Оптимальный Подход
Для получения правильного порядка потоков и для исключения ошибок при работе с неизвестными потоками, используйте следующую команду:
ffmpeg -sseof -10 -i input.MP4 -map 0:v -map 0:a -map 0:2 -map 0:3 -c copy -copy_unknown output.MP4
В этой команде:
-sseof -10
указывает на извлечение последних 10 секунд видео.-map
позволяет указать порядок потоков, который вы хотите сохранить. Важно обрабатывать все потоки, которые вам нужны.
Реализация
- Убедитесь, что у вас установлена последняя версия FFmpeg, чтобы избежать проблем с кодеками и совместимостью.
- Поменяйте
input.MP4
на имя вашего виде файла. - Выполните команду в командной строке или терминале.
Примечания
- Ключ
-c copy
позволяет извлечь потоки без переработки, что делает процесс бесшовным и сохраняет оригинальное качество. - Ключ
-copy_unknown
гарантирует, что данные, которые FFmpeg не распознает, но которые могут быть важны (например, телеметрия), сохраняются в выходном файле.
Заключение
Следуя приведенным инструкциям, вы сможете успешно вырезать последние несколько секунд видео GoPro, сохраняя при этом все необходимые данные, включая телеметрию, и порядок потоков. Правильное использование ключей -map
совместно с -copy
и -copy_unknown
является ключом к успешному решению вашей задачи.