使用 ffmpeg 将 avi 文件转换为 mkv 文件时忽略不支持的流

使用 ffmpeg 将 avi 文件转换为 mkv 文件时忽略不支持的流

问题重新合并为 MKV 但使用 FFmpeg 添加所有流解释如何将所有流混合为 MKV 文件。

然而,当 FFMPEG 不支持该流时,此操作将会失败。

例如,对具有 2 个视频流 + 一个字幕流的 avi 文件使用该命令:

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

给出以下输出:

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.

有没有办法忽略不受支持的流?

答案1

调试 ffmpeg 显示 avi 文件包含具有空 AVI 流格式头的字幕流。

在这种情况下avi_读取_头文件方法未设置 st->codec->codec_type

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

下一个打开输出文件打印日志并无条件退出。

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      }

然后支持带有空流格式头的AVI文件需要修改ffmpeg。

相关内容