При использовании avconv при повторном смешивании с MKV существует ли способ исправить упакованные входные файлы AVI?

11

Из-за ошибок совместимости между сервером Plex и телевизорами Panasonic, единственный способ заставить его работать хорошо - это все заново смешать с MKV, напрямую скопировать все потоки (видео, аудио, субтитры)

Кажется достаточно простым:

avconv -i "input.avi" -c copy "output.mkv"

Кроме:

avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Apr  2 2013 17:00:59 with gcc 4.6.3
[mpeg4 @ 0x8422140] Invalid and inefficient vfw-avi packed B frames detected
Input #0, avi, from 'input.avi':
  Metadata:
    encoder         : VirtualDubMod 1.5.4.1 (build 2117/release)
  Duration: 00:27:38.52, start: 0.000000, bitrate: 1173 kb/s
    Stream #0.0: Video: mpeg4 (Advanced Simple Profile), yuv420p, 640x352 [PAR 1:1 DAR 20:11], 25 tbr, 25 tbn, 25 tbc
    Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 132 kb/s
File 'output.mkv' already exists. Overwrite ? [y/N] y
Output #0, matroska, to 'output.mkv':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #0.0: Video: mpeg4, yuv420p, 640x352 [PAR 1:1 DAR 20:11], q=2-31, 1k tbn, 25 tbc
    Stream #0.1: Audio: libmp3lame, 48000 Hz, stereo, 132 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press ctrl-c to stop encoding
[matroska @ 0x8422cc0] Can't write packet with unknown timestamp
av_interleaved_write_frame(): Invalid argument

С соответствующими строками:

[mpeg4 @ 0x8422140] Invalid and inefficient vfw-avi packed B frames detected#
<snip>
[matroska @ 0x8422cc0] Can't write packet with unknown timestamp
av_interleaved_write_frame(): Invalid argument

Я не вижу возможности распаковать B-кадры (или построить временную карту VBR? Нужны ли они в avconv?)

Есть ли способ сделать это, как в avidemux?

RoboJ1M
источник

Ответы:

8

Обходной путь должен сначала преобразовать в .mp4:

avconv -i input.avi -c copy temp.mp4
avconv -i temp.mp4 -c copy output.mkv
rm temp.mp4

К сожалению, нельзя просто передать формат mp4 между экземплярами avconv: «muxer [mp4 @ 0x80846c0] не поддерживает вывод без поиска»

rmsr
источник
Спасибо, попробую сегодня вечером. Интересно, есть ли команда, которая действует как буфер? Ожидает завершения записи команды в стандартный ввод, прежде чем передать все в стандартный вывод. С поиском на стандартный вывод. Это было бы удобно. avconv -i xxx | buf | avconv -i stdin xxx
RoboJ1M
1
Добавленное мною сообщение об ошибке специально связано с попыткой использовать каналы с avconv, поскольку каналы по своей сути не являются доступными для поиска. Лучшее, что можно сделать - это найти файл temp.mp4 в tmpfs или аналогичной файловой системе в памяти. / dev / shm / является хорошим кандидатом для этого, если у вас достаточно оперативной памяти.
rmsr
Что касается трубопровода, вы, вероятно, можете сделать это с именованными каналами, иначе как fifo. Есть поиск mkfifo. По сути, вы используете файл в качестве временного хранилища для стаута.
Sparhawk
Это решение работает также для ffmpeg
c97
8

Начиная с этого билета # 1979 на багтрекере ffmpeg, самое простое решение - исправить эту ошибку или добавить ее вручную -fflags +genptsв командную строку.

Т.е. измениться

ffmpeg -i inputfile_that_cant_be_muxed_into_mkv.ext -c copy out.mkv

в

ffmpeg -fflags +genpts -i inputfile_that_cant_be_muxed_into_mkv.ext -c copy out.mkv
Erik
источник
1
Это все еще дает мне ту же ошибку: /
Феликс
у меня работает с avconvверсией 0.8.16, пока Can't write packet with unknown timestampв конце файла не отображается нечетное число. Weird.
Малат
2
Убедитесь, что -fflagsиспользуется как опция ввода: она должна идти перед вашей -i input. Но, вероятно, это не сработало бы, если бы вы не поставили +genptsв нужное место.
Питер Кордес
Это прекрасно работает и с avconv9.18-6: 9.18-0ubuntu0.14.04.1
Старейшина Гик
2

Благодаря Andreas Cadhalpun ffmpegтеперь имеет новый фильтр: mpeg4_unpack_bframes(см реф ). Это позволит вам избавиться от сообщения: Invalid and inefficient vfw-avi packed B frames detected.

Использование так же просто, как:

ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi
малат
источник