Как я могу извлечь последние несколько секунд видео с GoPro без потерь с помощью FFmpeg, чтобы сохранить телеметрию и оригинальный порядок потоков?

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

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

В видео с GoPro четыре потока, в следующем порядке:

  1. Stream #0:0[0x1](eng): Видео
  2. Stream #0:1[0x2](eng): Аудио
  3. Stream #0:2[0x3](eng): Данные: нет (tmcd / 0x64636D74) (по умолчанию)
  4. 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 потока, в следующем порядке:

  1. Stream #0:0[0x1](eng): Видео
  2. Stream #0:1[0x2](eng): Аудио
  3. Stream #0:3[0x3](eng): Данные: bin_data (gpmd / 0x646D7067), 59 kb/s (по умолчанию)
  4. 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 видео содержит следующие потоки:

  1. Поток #0:0 (видео): видеопоток в кодеке HEVC.
  2. Поток #0:1 (аудио): аудиопоток в кодеке AAC.
  3. Поток #0:2 (данные): данные временного кода (tmcd).
  4. Поток #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 позволяет указать порядок потоков, который вы хотите сохранить. Важно обрабатывать все потоки, которые вам нужны.

Реализация

  1. Убедитесь, что у вас установлена последняя версия FFmpeg, чтобы избежать проблем с кодеками и совместимостью.
  2. Поменяйте input.MP4 на имя вашего виде файла.
  3. Выполните команду в командной строке или терминале.

Примечания

  • Ключ -c copy позволяет извлечь потоки без переработки, что делает процесс бесшовным и сохраняет оригинальное качество.
  • Ключ -copy_unknown гарантирует, что данные, которые FFmpeg не распознает, но которые могут быть важны (например, телеметрия), сохраняются в выходном файле.

Заключение

Следуя приведенным инструкциям, вы сможете успешно вырезать последние несколько секунд видео GoPro, сохраняя при этом все необходимые данные, включая телеметрию, и порядок потоков. Правильное использование ключей -map совместно с -copy и -copy_unknown является ключом к успешному решению вашей задачи.

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

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