Вопрос или проблема
Брифинг
У меня есть некоторые .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
не решает проблему.
Возможные решения
-
Обновление FFmpeg: Убедитесь, что у вас установлена последняя версия FFmpeg. Разработчики постоянно работают над улучшением, и возможно, добавлены улучшения относительно поддерживаемых потоков данных.
-
Указание корректного формата для вывода:
- Вместо использования
-f !ext!
, попробуйте указать правильный формат для .wmv. Например:ffmpeg -y -i "input.wmv" -f asf -c copy -map 0 -vn -sn "output.wmv"
- Это поможет FFmpeg распознать, какой именно формат вы хотите использовать и может предотвратить ошибку.
- Вместо использования
-
Процесс перекодирования:
- Если вы не можете просто скопировать потоки данных, возможно, вам придется перекодировать аудиопоток, чтобы избежать проблем с неподдерживаемыми кодеками:
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
(если требуется) выбирает потоки данных.
- Если вы не можете просто скопировать потоки данных, возможно, вам придется перекодировать аудиопоток, чтобы избежать проблем с неподдерживаемыми кодеками:
-
Использование MKVToolNix:
- Рассмотрите возможность использования MKVToolNix для обертывания файлов в формат .mkv. Этот формат поддерживает множество кодеков и может помочь сохранить данные:
mkvmerge -o "output.mkv" "input.wmv"
- Рассмотрите возможность использования MKVToolNix для обертывания файлов в формат .mkv. Этот формат поддерживает множество кодеков и может помочь сохранить данные:
-
Обработка потоков данных:
- Если данные все равно будут игнорироваться, и вы знаете, что они не мешают работе вашей программы, попробуйте просто удалить их:
ffmpeg -y -i "input.wmv" -map 0:0 -map 0:1 -c copy -b:a 32k "output.wmv"
- Если данные все равно будут игнорироваться, и вы знаете, что они не мешают работе вашей программы, попробуйте просто удалить их:
Вывод
Каждый из предложенных методов может быть полезен в зависимости от специфики ваших файлов и требований к работе сторонних программ. Попробуйте их поочередно, чтобы увидеть, какой из способов наиболее эффективен, поскольку каждый случай может требовать уникального подхода. Уделяя дополнительное внимание версиям программного обеспечения и их возможностям, можно существенно упростить работу с видеофайлами и нестандартными потоками.