FFmpeg 学习之 Mediainfo 读取多信道 TS 视频码流

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



猜你喜欢

转载自blog.csdn.net/u010477528/article/details/56667606