Как скопировать неподдерживаемые потоки данных с помощью ffmpeg?

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

Брифинг

У меня есть некоторые .wmv файлы (на самом деле, мой полный пакетный файл работает с несколькими типами файлов) с странными потоками данных, которые необходимы для распознавания их внешней программой.

Я пытаюсь удалить каждый поток, который не является данными или аудио, которые также необходимо перекодировать.

Моя текущая команда:

fmpeg -y -loglevel debug -flags global_header -err_detect ignore_err -fflags +igndts -copy_unknown -i "%%~fV" -f !ext! -c copy -map 0 -vn -sn -b:a 32k "%%~pnxV.tmpoutput"

Это работает с другими типами файлов с таким же типом потока данных и будет работать с .wmv, если я добавлю -dn (хотя мой файл тогда не распознается внешней программой). Команда выше, как есть, для .wmv файлов выдает ошибку Не удалось записать заголовок для выходного файла #0 (некорректные параметры кодека ?): Операция не разрешена.

Из FFprobe (полный вывод ниже) я вижу сообщение Неподдерживаемый кодек с id 0 для входного потока 2, поэтому я верю, что причина действительно в потоке данных.


Вопрос

Дело в том, что я ожидал, что -copy_unknown сможет справиться с этим, но это не так. Мой вопрос: как мне скопировать этот неподдерживаемый, нигде не использующийся поток данных? Есть ли другие способы подойти к этому вопросу?

Спасибо


Дополнительная информация

Полный вывод FFmpeg (с -loglevel debug):

ffmpeg version 4.2 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. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Разделение командной строки.
Чтение опции '-y' ... соответствует опции 'y' (перезаписать выходные файлы) с аргументом '1'.
Чтение опции '-loglevel' ... соответствует опции 'loglevel' (установить уровень логирования) с аргументом 'debug'.
Чтение опции '-flags' ... соответствует AVOption 'flags' с аргументом 'global_header'.
Чтение опции '-err_detect' ... Перенаправление опции err_detect на уровень кодека и мультиплексора
 соответствует AVOption 'err_detect' с аргументом 'ignore_err'.
Чтение опции '-fflags' ... соответствует AVOption 'fflags' с аргументом '+igndts'.
Чтение опции '-copy_unknown' ... соответствует опции 'copy_unknown' (Копировать неизвестные типы потоков) с аргументом '1'.
Чтение опции '-i' ... соответствует входному url с аргументом 'C:\Users\Fabio\Desktop\Testes\test\a.wmv'.
Чтение опции '-f' ... соответствует опции 'f' (принудительный формат) с аргументом 'asf'.
Чтение опции '-c' ... соответствует опции 'c' (имя кодека) с аргументом 'copy'.
Чтение опции '-map' ... соответствует опции 'map' (установить сопоставление входного потока) с аргументом '0'.
Чтение опции '-vn' ... соответствует опции 'vn' (отключить видео) с аргументом '1'.
Чтение опции '-sn' ... соответствует опции 'sn' (отключить субтитры) с аргументом '1'.
Чтение опции '-b:a' ... соответствует опции 'b' (битрейт видео (пожалуйста, используйте -b:v)) с аргументом '32k'.
Чтение опции '\Users\Fabio\Desktop\Testes\test\a.wmv.tmpoutput' ... соответствует выходному url.
Завершено разделение командной строки.
Парсинг группы опций: global .
Применение опции y (перезаписать выходные файлы) с аргументом 1.
Применение опции loglevel (установить уровень логирования) с аргументом debug.
Применение опции copy_unknown (Копировать неизвестные типы потоков) с аргументом 1.
Успешно проанализирована группа опций.
Парсинг группы опций: входной url C:\Users\Fabio\Desktop\Testes\test\a.wmv.
Успешно проанализирована группа опций.
Открытие входного файла: C:\Users\Fabio\Desktop\Testes\test\a.wmv.
[NULL @ 0000025955e7af40] Открытие 'C:\Users\Fabio\Desktop\Testes\test\a.wmv' для чтения
[file @ 0000025955e7b740] Установка белого списка по умолчанию 'file,crypto'
[asf @ 0000025955e7af40] Формат asf проверен с размером=2048 и оценкой=100
[asf @ 0000025955e7af40] gpos несоответствие наш pos=24, end=244
[asf @ 0000025955e7af40] gpos несоответствие наш pos=24, end=26
[asf @ 0000025955e7af40] gpos несоответствие наш pos=24, end=3295
[asf @ 0000025955e7af40] Расширение полезной нагрузки 50 2
[asf @ 0000025955e7af40] gpos несоответствие наш pos=24, end=42
[asf @ 0000025955e7af40] gpos несоответствие наш pos=24, end=44
[asf @ 0000025955e7af40] gpos несоответствие наш pos=24, end=834
[asf @ 0000025955e7af40] Перед avformat_find_stream_info() pos: 5793 байт прочитано:32768 seeks:0 nb_streams:3
[asf @ 0000025955e7af40] парсер не найден для кодека wmav2, пакеты или времена могут быть недействительными.
[wmv3 @ 0000025955eb4480] Заголовок: 46690A01
[wmv3 @ 0000025955eb4480] Профиль 1:
frmrtq_postproc=3, bitrtq_postproc=6
LoopFilter=1, MultiRes=0, FastUVMC=0, Extended MV=0
Rangered=0, VSTransform=1, Overlap=1, SyncMarker=0
DQuant=0, Режим квантования=0, Макс B-frames=0
[wmv3 @ 0000025955eb4480] Дополнительные данные: 8 бит оставлено, значение: 0
[wmv3 @ 0000025955eb4480] Формат yuv420p выбран функцией get_format().
    Последнее сообщение повторено 1 раз
[asf @ 0000025955e7af40] парсер не найден для кодека wmav2, пакеты или времена могут быть недействительными.
[asf @ 0000025955e7af40] Вся информация найдена
[asf @ 0000025955e7af40] После avformat_find_stream_info() pos: 191671 байт прочитано:196608 seeks:0 frames:58
Предположенная компоновка каналов для входного потока #0.0 : стерео
Вход #0, asf, из 'C:\Users\Fabio\Desktop\Testes\test\a.wmv':
  Метаданные:
    copyright       : ChessBase GmbH
    WMFSDKVersion   : 12.0.9600.17415
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    DeviceConformanceTemplate: MP@ML
  Длительность: 00:00:23.08, начало: 0.000000, битрейт: 526 кбит/с
    Поток #0:0, 17, 1/1000: Аудио: wmav2 (a[1][0][0] / 0x0161), 48000 Гц, стерео, fltp, 96 кбит/с
    Поток #0:1, 41, 1/1000: Видео: wmv3 (Main), 1 опорный кадр (WMV3 / 0x33564D57), yuv420p(left), 640x480, 0/1, 415 кбит/с, 25 tbr, 1k tbn, 1k tbc
    Поток #0:2, 0, 1/1000: Данные: none, 0/1, 10 кбит/с
Успешно открыт файл.
Парсинг группы опций: выходной url \Users\Fabio\Desktop\Testes\test\a.wmv.tmpoutput.
Применение опции f (принудительный формат) с аргументом asf.
Применение опции c (имя кодека) с аргументом copy.
Применение опции map (установить сопоставление входного потока) с аргументом 0.
Применение опции vn (отключить видео) с аргументом 1.
Применение опции sn (отключить субтитры) с аргументом 1.
Применение опции b:a (битрейт видео (пожалуйста, используйте -b:v)) с аргументом 32k.
Успешно проанализирована группа опций.
Открытие выходного файла: \Users\Fabio\Desktop\Testes\test\a.wmv.tmpoutput.
[file @ 0000025955eee200] Установка белого списка по умолчанию 'file,crypto'
Успешно открыт файл.
Не удалось записать заголовок для выходного файла #0 (некорректные параметры кодека ?): Операция не разрешена
Сопоставление потоков:
  Поток #0:0 -> #0:0 (копировать)
  Поток #0:2 -> #0:1 (копировать)
    Последнее сообщение повторено 1 раз
[AVIOContext @ 0000025955eee2c0] Статистика: 0 seeks, 1 writeouts
[AVIOContext @ 0000025955e83980] Статистика: 196608 байт прочитано, 0 seeks

FFprobe по образцу файла:

ffprobe version 4.3 Copyright (c) 2007-2020 the FFmpeg developers
  built with gcc 9.3.1 (GCC) 20200621
  configuration: --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-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libaom --enable-libgsm --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-libopenmpt --enable-amf
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
[wmv3 @ 00000180012e1440] Дополнительные данные: 8 бит оставлено, значение: 0
Вход #0, asf, из 'test/a.wmv':
  Метаданные:

    WMFSDKVersion   : 12.0.9600.17415
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    DeviceConformanceTemplate: MP@ML
  Длительность: 00:00:23.08, начало: 0.000000, битрейт: 526 кбит/с
    Поток #0:0: Аудио: wmav2 (a[1][0][0] / 0x0161), 48000 Гц, 2 канала, fltp, 96 кбит/с
    Поток #0:1: Видео: wmv3 (Main) (WMV3 / 0x33564D57), yuv420p, 640x480, 415 кбит/с, 25 tbr, 1k tbn, 1k tbc
    Поток #0:2: Данные: none, 10 кбит/с
[wmv3 @ 0000018001324a80] Дополнительные данные: 8 бит оставлено, значение: 0
Неподдерживаемый кодек с id 0 для входного потока 2

Другие

Я решил указать -f и .tmpoutput, чтобы облегчить другие не связанные части моего процесса.

Попробуйте:

  • Обновить ffmpeg до последней версии.
  • Указать имя расширения .wmv для выходного файла в ffmpeg.
  • mkvtoolnix для ремультиплексирования файлов в новый контейнер .mkv, который поддерживает все.

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

Копирование неподдерживаемых потоков данных с помощью FFmpeg может быть непростой задачей, особенно при работе с форматами видеофайлов, содержащими нестандартные или неизвестные кодеки. В данном случае, вы сталкиваетесь с проблемой при попытке обработать файлы .wmv, содержащие необычные потоки данных, которые требуется сохранить для корректной работы сторонней программы. Давайте рассмотрим разные подходы к решению данной задачи.

Проблема

Исходная команда, которую вы используете:

ffmpeg -y -loglevel debug -flags global_header -err_detect ignore_err -fflags +igndts -copy_unknown -i "%%~fV" -f !ext! -c copy -map 0 -vn -sn -b:a 32k "%%~pnxV.tmpoutput"

выдает ошибку:

Could not write header for output file #0 (incorrect codec parameters ?): Operation not permitted

это происходит из-за наличия неподдерживаемого потока (Data: none), пока -copy_unknown не решает проблему.

Возможные решения

  1. Обновление FFmpeg: Убедитесь, что у вас установлена последняя версия FFmpeg. Разработчики постоянно работают над улучшением, и возможно, добавлены улучшения относительно поддерживаемых потоков данных.

  2. Указание корректного формата для вывода:

    • Вместо использования -f !ext!, попробуйте указать правильный формат для .wmv. Например:
      ffmpeg -y -i "input.wmv" -f asf -c copy -map 0 -vn -sn "output.wmv"
    • Это поможет FFmpeg распознать, какой именно формат вы хотите использовать и может предотвратить ошибку.
  3. Процесс перекодирования:

    • Если вы не можете просто скопировать потоки данных, возможно, вам придется перекодировать аудиопоток, чтобы избежать проблем с неподдерживаемыми кодеками:
      ffmpeg -y -i "input.wmv" -c:a wmav2 -b:a 32k -map 0:a -map 0:c "output.wmv"
    • Здесь, -map 0:a выбирает аудиопотоки, а -map 0:c (если требуется) выбирает потоки данных.
  4. Использование MKVToolNix:

    • Рассмотрите возможность использования MKVToolNix для обертывания файлов в формат .mkv. Этот формат поддерживает множество кодеков и может помочь сохранить данные:
      mkvmerge -o "output.mkv" "input.wmv"
  5. Обработка потоков данных:

    • Если данные все равно будут игнорироваться, и вы знаете, что они не мешают работе вашей программы, попробуйте просто удалить их:
      ffmpeg -y -i "input.wmv" -map 0:0 -map 0:1 -c copy -b:a 32k "output.wmv"

Вывод

Каждый из предложенных методов может быть полезен в зависимости от специфики ваших файлов и требований к работе сторонних программ. Попробуйте их поочередно, чтобы увидеть, какой из способов наиболее эффективен, поскольку каждый случай может требовать уникального подхода. Уделяя дополнительное внимание версиям программного обеспечения и их возможностям, можно существенно упростить работу с видеофайлами и нестандартными потоками.

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

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