Ignore la transmisión no admitida al convertir un archivo avi a un archivo mkv usando ffmpeg

0

La pregunta Remux a MKV pero agregar todas las transmisiones usando FFmpeg explica cómo muxear todas las transmisiones a un archivo MKV.

Sin embargo, esto falla cuando FFMPEG no admite la transmisión.

Por ejemplo, usando el comando en un archivo avi con 2 transmisiones de video + una transmisión de subtítulos:

ffmpeg -y -i filename.avi -map 0 -c copy filename.mkv

dar el siguiente resultado:

ffmpeg version 2.3.1 Copyright (c) 2000-2014 the FFmpeg developers
  built on Aug  6 2014 13:32:20 with gcc 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)
  configuration: --enable-static --disable-shared --disable-asm --disable-doc --disable-devices --disable-network --disable-bsfs --disable-protocols --enable-protocol=file --disable-filters --disable-yasm --enable-pic --disable-iconv
  libavutil      52. 92.100 / 52. 92.100
  libavcodec     55. 69.100 / 55. 69.100
  libavformat    55. 48.100 / 55. 48.100
  libavdevice    55. 13.102 / 55. 13.102
  libavfilter     4. 11.100 /  4. 11.100
  libswscale      2.  6.100 /  2.  6.100
  libswresample   0. 19.100 /  0. 19.100
[avi @ 0x2dd8760] non-interleaved AVI
[avi @ 0x2dd8760] Could not find codec parameters for stream 2 (Unknown: none): unknown codec
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, avi, from 'filename.avi':
  Duration: 00:01:01.00, start: 0.000000, bitrate: 4285 kb/s
    Stream #0:0: Video: h264 (Constrained Baseline) (H264 / 0x34363248), yuv420p, 720x576, 2140 kb/s, 25.52 fps, 25.50 tbr, 25.52 tbn, 50 tbc
    Metadata:
      title           : sim0_video_H264_0_
    Stream #0:1: Video: h264 (Constrained Baseline) (H264 / 0x34363248), yuv420p, 720x576, 2140 kb/s, 25.52 fps, 25.50 tbr, 25.52 tbn, 50 tbc
    Metadata:
      title           : sim2_video_H264_0_
    Stream #0:2: Unknown: none
Cannot map stream #0:2 - unsupported type.

¿Hay alguna manera de ignorar las secuencias no compatibles?

mpromonet
fuente
Debe obtener una compilación reciente de git master compilando o simplemente usando una compilación estática . Si el problema persiste, informe un error ; incluya su comando, la salida completa de la consola y un archivo de entrada de muestra.
llogan
Como el código de github.com/FFmpeg/FFmpeg/blob/master/libavformat/avidec.c no cambió, el resultado será probablemente el mismo. ¿Los errores de ffmpeg están informando el seguimiento del pensamiento? no es problema de github?
mpromonet
Sí, el resultado puede ser el mismo, pero es necesario probar una compilación actual porque el desarrollo es muy activo. Los errores se deben informar a través de trac. FFmpeg no usa Github para el desarrollo (es solo un espejo para la fuente; aunque algunos usuarios envían erróneamente parches / solicitudes de extracción a través de él).
llogan

Respuestas:

1

La depuración de ffmpeg muestra que el archivo avi contiene una secuencia de subtítulos que tiene un encabezado de formato de secuencia de AVI vacío.

En tal situación, el método avi_read_header no establece st-> codec-> codec_type

698      case MKTAG('s', 't', 'r', 'f'):
699          /* stream header */
700          if (!size)
701              break;

A continuación, open_output_file imprime el registro y sale sin condición.

1939      switch (ist->st->codec->codec_type) {
1940          case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
1941          case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
1942          case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
1943          case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
1944          case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
1945          default:
1946              av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1947                      map->file_index, map->stream_index);
1948              exit_program(1);
1949      }

Luego, admitir el archivo AVI con un encabezado de formato de flujo vacío necesita modificar ffmpeg.

mpromonet
fuente