FFmpeg 解码过程中,有以下几个参数
AVFormatContext 结构体中有一个 ts_id 变量,表示文件 ID,固定值。
AVStream 结构体中有一个 id 变量,表示 FFmpeg 对文件中码流的编号,多信道 TS 文件中一般至少有视频流、音频流、菜单流三类。
AVFormatContext 结构体中的 programes 结构体变量有一个 id 变量,即为该流的菜单 ID(Menu ID)。一般该 ID 对应一路视频与一路或多路音频,音频有单/双通道。
因 FFmpeg 读取码流的顺序是未知的,因此需要根据菜单 ID 确定对应的视频流与音频流,如有菜单流、文字流及其他,均通过该 ID 定位。
以上信息也可通过 mediainfo 读取,更加方便。
代码如下:
#include "MediaInfoDLL.h"
#include <iostream>
#include <iomanip>
using namespace std;
using namespace MediaInfoDLL;
int main()
{
MediaInfo MI;
MI.Open(__T("d:\\Video\\CW\\test_576i_1080i_40E-10995V-H264-SD+HD.ts"));
//String info;
//MI.Option(__T("Complete"), __T("1")); //Complete //Video //Audio //Menu
//info += MI.Inform();
//wcout<<info.c_str()<<endl;
//String width;
//width = MI.Get(stream_t::Stream_Video, 0, __T("Width"));
//wcout<<__T("width : ")<<width.c_str()<<endl;
//String height;
//height = MI.Get(stream_t::Stream_Video, 0, __T("Height"));
//wcout<<__T("height : ")<<height.c_str()<<endl;
//String Duration;
//Duration = MI.Get(stream_t::Stream_Video, 0, __T("Duration"));
//wcout<<__T("Duration : ")<<Duration.c_str()<<endl;
//String FrameRate;
//FrameRate = MI.Get(stream_t::Stream_Video, 0, __T("FrameRate"));
//wcout<<__T("FrameRate : ")<<FrameRate.c_str()<<endl;
//String FrameCount;
//FrameCount = MI.Get(stream_t::Stream_Video, 0, __T("FrameCount"));
//wcout<<__T("FrameCount : ")<<FrameCount.c_str()<<endl;
//String Count;
//Count = MI.Get(stream_t::Stream_Video, 0, __T("Count"));
//wcout<<__T("Count : ")<<Count.c_str()<<endl;
//
//String VideoCodec;
//VideoCodec = MI.Get(stream_t::Stream_Video, 0, __T("Codec"));
//wcout<<__T("VideoCodec : ")<<VideoCodec.c_str()<<endl;
//String VideoCodecID;
//VideoCodecID = MI.Get(stream_t::Stream_Video, 0, __T("CodecINFO"));
//wcout<<__T("VideoCodecID : ")<<VideoCodecID.c_str()<<endl;
////ColorSpace
//String ColorSpace;
//ColorSpace = MI.Get(stream_t::Stream_Video, 0, __T("Colorspace"));
//wcout<<__T("ColorSpace : ")<<ColorSpace.c_str()<<endl;
//String Get(stream_t StreamKind, size_t StreamNumber, const String &Parameter, info_t InfoKind = Info_Text, info_t SearchKind = Info_Name)
//String Get(stream_t StreamKind, size_t StreamNumber, size_t Parameter, info_t InfoKind = Info_Text)
String StreamCount;
StreamCount = MI.Get(stream_t::Stream_Audio, 0, __T("StreamCount"));
wcout<<__T("VideoStreamCount : ")<<StreamCount.c_str()<<endl;
String AudioID;
AudioID = MI.Get(stream_t::Stream_Audio, 7, __T("ID"));
wcout<<__T("AudioID : ")<<AudioID.c_str()<<endl;
String MenuID;
MenuID = MI.Get(stream_t::Stream_Audio, 0, __T("MenuID"));
wcout<<__T("MenuID : ")<<MenuID.c_str()<<endl;
MI.Close();
return 0;
}
部分代码说明:
//String info;
//MI.Option(__T("Complete"), __T("1")); //Complete //Video //Audio //Menu
//info += MI.Inform();
//wcout<<info.c_str()<<endl;
complete 读取全部信息,video 仅读取视频信息,其他类似。
//String Get(stream_t StreamKind, size_t StreamNumber, const String &Parameter, info_t InfoKind = Info_Text, info_t SearchKind = Info_Name)
//String Get(stream_t StreamKind, size_t StreamNumber, size_t Parameter, info_t InfoKind = Info_Text)
获取指定信息,streamKind 在头文件中有定义类型,还包括general、text等。
size_t 默认0,若多路音视频,可指定该路 ID,即编号即可,mediainfo 已进行排序。
info_text 即为信息类型,网上没找到相关说明,且上述代码中部分 类型标识 不对,没试出来。
String StreamCount;
StreamCount = MI.Get(stream_t::Stream_Audio, 0, __T("StreamCount"));
wcout<<__T("VideoStreamCount : ")<<StreamCount.c_str()<<endl;
读取音频码流数,streamcount 标识固定,根据streamkind 区别,一般读取视频、音频、menu即可
参考:
http://www.cnblogs.com/royzou/archive/2011/09/06/mediainfo_parameter.html
http://blog.csdn.net/u010477528/article/details/43021403