问题重新合并为 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。