Використовуючи 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

З відповідними рядками gotcha:

[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?

Відповіді:


8

Вирішення проблеми полягає в тому, щоб спочатку перетворити на .mp4:

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

На жаль, не можна просто передати формат mp4 між екземплярами avconv: "[mp4 @ 0x80846c0] muxer не підтримує вихід, який не можна шукати"


Дякую, я спробую це сьогодні ввечері. Цікаво, чи існує команда, яка діє як буфер? Чекає завершення написання команди stdin, перш ніж передавати все це stdout. З прагненням на stdout. Це було б зручно. avconv -i xxx | buf | avconv -i stdin xxx
RoboJ1M

1
Повідомлення про помилку, яке я додав, стосується спеціально спроби використання труб з avconv, оскільки труби за своєю суттю не шукаються. Найкраще, що можна зробити - це знайти temp.mp4 у tmpfs або подібній файловій системі в пам'яті. / dev / shm / є хорошим кандидатом для цього, якщо достатньо оперативної пам'яті.
rmsr

Що стосується трубопроводів, то, ймовірно, це можна зробити за допомогою названих труб aka fifo. Проведіть пошук mkfifo. По суті, ви використовуєте файл як тимчасове сховище для stout.
Sparhawk

Це рішення працює також для ffmpeg
c97

8

З цього квитка № 1979 у ffmpeg bugtracker найпростіше рішення - виправити цю помилку або вручну додати -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

1
Це все одно дає мені таку саму помилку: /
Фелікс

працює для мене з avconvверсією 0.8.16, поки Can't write packet with unknown timestampв кінці файлу не відображається непарне . Дивно.
малат

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.