Usando avconv, cuando remuxing a MKV, ¿hay alguna manera de arreglar los archivos de entrada AVI empaquetados?

11

Debido a los errores de compatibilidad entre el servidor Plex y los televisores Panasonic, la única forma de que funcione bien es remux todo a MKV, copia directa de todas las transmisiones (video, audio, subtítulos)

Parece bastante simple:

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

Excepto:

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

Con las líneas gotcha relevantes siendo:

[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

No puedo ver una opción para desempaquetar los marcos B (¿o construir un mapa de tiempo VBR? ¿Los necesitamos en avconv?)

¿Hay alguna manera de hacer esto, como en avidemux?

RoboJ1M
fuente

Respuestas:

8

Una solución es convertir a .mp4 primero:

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

Lamentablemente, uno no puede simplemente canalizar el formato mp4 entre instancias de avconv: "[mp4 @ 0x80846c0] muxer no admite salida no buscable"

rmsr
fuente
Gracias, lo probaré esta noche. Me pregunto si hay un comando que actúa como un búfer? Espera a que se complete el comando que escribe en stdin antes de pasarlo todo a stdout. Con búsqueda en stdout. Eso sería útil. avconv -i xxx | buf | avconv -i stdin xxx
RoboJ1M
1
El mensaje de error que agregué está específicamente relacionado con el intento de usar tuberías con avconv, ya que las tuberías son inherentemente no buscables. Lo mejor que puede hacer es ubicar temp.mp4 en un sistema de archivos tmpfs o similar en memoria. / dev / shm / es un buen candidato para esto, si uno tiene suficiente RAM.
rmsr
Con respecto a las tuberías, probablemente pueda hacerlo con tuberías con nombre, también conocidas como fifo. Tener una búsqueda de mkfifo. Básicamente, utiliza un archivo como almacenamiento temporal para stout.
Sparhawk
Esta solución también funciona para ffmpeg
c97
8

A partir de este ticket # 1979 en ffmpeg bugtracker, la solución más simple es corregir este error o agregarlo manualmente -fflags +genptsa la línea de comando.

Es decir, cambio

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

a

ffmpeg -fflags +genpts -i inputfile_that_cant_be_muxed_into_mkv.ext -c copy out.mkv
erik
fuente
1
Esto todavía me da el mismo error: /
Felix
funciona para mí con la avconvversión 0.8.16, hasta que muestra un extraño Can't write packet with unknown timestampal final del archivo. Extraño.
malat
2
Asegúrese de que -fflagsse utiliza como una opción de entrada: tiene que ir antes que su -i input. Pero probablemente no habría funcionado en absoluto si no lo hubiera puesto +genptsen el lugar correcto.
Peter Cordes
Esto funciona bien con avconv9.18-6: 9.18-0ubuntu0.14.04.1 también
Elder Geek
2

Gracias a Andreas Cadhalpun ffmpegahora tiene un nuevo filtro: mpeg4_unpack_bframes(ver ref .). Esto permitirá a deshacerse del mensaje: Invalid and inefficient vfw-avi packed B frames detected.

El uso es tan simple como:

ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi
malat
fuente