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