基于FFMPEG SDK流媒体开发1---解码媒体文件流信息

标签: ffmpeg sdk 流媒体 | 发表时间:2014-12-17 02:59 | 作者:yue7603835
出处:http://blog.csdn.net

最近项目涉及到流媒体等开发,由于有过开发经验深知其难度所在,没办法只能重新拾起,最新版的SDK被改的一塌糊涂,不过大体的开发思路都是一样的,看多少书查多少资料都无用,一步一步的编写代码 才是学好的关键。。

我会把每一天的学习经过,更新到博文上,希望能给更多想学习的人带来帮助,篇尾附上工程     以及最新版本SDK。

FFMPEG被大多数的人命令行来使用,其实在真正的流媒体开发中,要想灵活运用其开发流媒体应用层序,必须使用官方SDK开发  ,实际上我们市面上好多产品

都是基于FFMPEG,比如 XX影音  。。 

FFMPEG官网  http://www.ffmpeg.org/

API地址       http://www.ffmpeg.org/doxygen/trunk/index.html

由于在windows下编译非常痛苦,所以还是推荐大家去直接下载编译好的二进制文件,注意官网上并没有直接完整的开发包,你需要分别取下载Linux或者windows下的

共享库 对于windows下还需要下载 .lib导入库,由于我是windows下 这里我就提供windows下载地址

http://ffmpeg.zeranoe.com/builds/   这个页面可以下载到 动态库和到入库 。。因为FFMPEG已经交由别的组织维护了。。。 在下面这个页面找吧 还有一点就是 既然用人家的东西 记住一定要遵循LGPL或GPL许可证...别给国人丢脸  

人家老外都这么说了 

Donating shows that you benefit from my work and are thankful for the time I spend on it. So if you like my work and would like to see more, feel free to donate, if you can't right now don't worry about it and just enjoy using FFmpeg on Windows. Thank you to everyone who has donated in the past!


具体不废话了,如何配置项目啥的,这都是新手级别的问题,我就不详细说明了 直接上代码加注释     我会提供源代码下载 。。。工程配置好的 大家下载研究就行

// ffmpeg_test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"  

#include <windows.h>
#ifdef _CPPRTTI
extern "C"  
{
#endif
	#include "libavcodec/avcodec.h"  //编解码器
	#include "libavformat/avformat.h" //格式上下文 
	#include "libavformat/avio.h"  //音视频IO
	#include "libavutil/file.h"  //处理文件
#ifdef _CPPRTTI  
};
#endif

void  SetStdClr(WORD wd)
{
	SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE),wd );
}

int _tmain(int argc, _TCHAR* argv[])
{   
	//注册所有 编码器  解析器 二进制流过滤器
	 av_register_all();
	 avcodec_register_all();
	 SetStdClr(FOREGROUND_RED |   FOREGROUND_GREEN);
	 AVFormatContext *pContext=NULL;//格式上下文
	 int errNo=0 ;
	 pContext=avformat_alloc_context();
	 //打开输入文件 新接口
	 if(0==avformat_open_input(&pContext,".\\test.mp4",nullptr,NULL)){
		 printf("打开文件输入成功!\n");
	 }else
		 return  0;
	 //从上下文检索流信息
	if(0==avformat_find_stream_info(pContext,NULL))
	{
		printf("获取流信息成功!\n");
	}else
		return 0 ;
	//循环多个流
	 SetStdClr(FOREGROUND_RED |   FOREGROUND_BLUE);
	for (unsigned int i=0;i<pContext->nb_streams;i++)
	{   

		//媒体流 
		AVStream *pStream = pContext->streams[i];
		//帧率信息 为有理数/无理数
		AVRational frame =pStream->r_frame_rate;  

		// 时间比率单位
		AVRational timeBase = pStream->time_base; 
		
		//流的持续时间  比特率
		int64_t duration=   pStream->duration ; 
		printf("媒体持续时间%d\n",duration);
		//获取编码类型
		AVCodecContext *pCodecContext=pStream->codec ;
		//获取 媒体类型
		/************************************************************************/
		/* 
		enum AVMediaType {
		AVMEDIA_TYPE_UNKNOWN = -1,  ///< Usually treated as AVMEDIA_TYPE_DATA
		AVMEDIA_TYPE_VIDEO,
		AVMEDIA_TYPE_AUDIO,
		AVMEDIA_TYPE_DATA,          ///< Opaque data information usually continuous
		AVMEDIA_TYPE_SUBTITLE,
		AVMEDIA_TYPE_ATTACHMENT,    ///< Opaque data information usually sparse
		AVMEDIA_TYPE_NB
		};
                                                                     */
		/************************************************************************/
		AVMediaType avMediaType=pCodecContext->codec_type;
		//编码器ID
		AVCodecID codecID=pCodecContext->codec_id ;
		if(avMediaType == AVMEDIA_TYPE_AUDIO)
		{
			//如果是视频
			int audioChannels = pCodecContext->channels;
			int samplerate = pCodecContext->sample_rate;
			PixelFormat pixelFormat = pCodecContext->pix_fmt;
			printf("Stream%d音频\n",i);
			printf("音频采样频率%d/%d\n",timeBase.num,timeBase.den);
			printf("音频时间单位%d/%d\n",timeBase.num,timeBase.den);
			printf("音频通道数%d\n",audioChannels);

		}
		else if(avMediaType == AVMEDIA_TYPE_VIDEO)
		{
			//如果是音频
			int videoWidth = pCodecContext->width;
			int videoHeight = pCodecContext->height;
			AVSampleFormat sampleFmt = pCodecContext->sample_fmt;
			printf("Stream%d视频\n",i);
			printf("帧率帧率%d/%d\n",frame.den,frame.num);
			printf("视频时间单位%d/%d\n",timeBase.num,timeBase.den);
			printf("图像宽度:%d\t高度:%d\t%\n",videoWidth,videoHeight);
			printf("图像宽度:%d\t高度:%d\t%\n",videoWidth,videoHeight);
		}
		switch(codecID)
		{
		case  AV_CODEC_ID_AAC:
			printf("编码器FAAC\n");
			break;
		case  AV_CODEC_ID_H264:
			printf("编码器H264\n");
			break;
		}

	}
	//释放上下文环境
	if(!pContext)
	{
		avformat_close_input(&pContext);
	}
	return 0;
}


运行结果如下:






作者:yue7603835 发表于2014-12-17 2:59:52 原文链接
阅读:0 评论:0 查看评论

相关 [ffmpeg sdk 流媒体] 推荐:

基于FFMPEG SDK流媒体开发1---解码媒体文件流信息

- - CSDN博客推荐文章
最近项目涉及到流媒体等开发,由于有过开发经验深知其难度所在,没办法只能重新拾起,最新版的SDK被改的一塌糊涂,不过大体的开发思路都是一样的,看多少书查多少资料都无用,一步一步的编写代码 才是学好的关键. 我会把每一天的学习经过,更新到博文上,希望能给更多想学习的人带来帮助,篇尾附上工程     以及最新版本SDK.

ffmpeg轉檔

- - SSORC.twSSORC.tw
ffmpeg 是一個命令列工具,用來對視訊檔案轉換格式. -i = 來源影片 (後面的參數先不接的話可以查看來源影片的詳細資訊,可供想要轉成什麼品質的參考). -vcodec = video code (如果要保留原格式就用 -vcodec copy). -acoder = audio code  (如果要保留原格式就用 -vcodec copy).

ffmpeg裁剪合并视频

- - inJava
这里裁剪是指时间轴裁剪,不是空间裁剪. 比如说,你想把视频的从一分20秒开始,30秒的视频裁剪出来,保存成一个视频. ffmpeg提供简单的命令参数:. -ss 开始时间,如: 00:00:20,表示从20秒开始;. -t 时长,如: 00:00:10,表示截取10秒长的视频;. -i 输入,后面是空格,紧跟着就是输入视频文件;.

Goolge发布Chromecast SDK

- - Chrome迷
自从有了Chromecast,用户把各种自己喜爱的在线内容投放到电视屏幕上变得非常方便,投放过程简单得只需要用户按下手机、平板和笔记本上的投放按钮. 今日,为了让内容更容易地被呈现到电视上,Google发布了Chromecast软件开发套件(SDK),开发者们可以在自己的应用和网站上提供Chromecast接入.

玩转 FFmpeg 的 7 个小技巧

- mk - OSMSG
FFmpeg堪称音频和视频应用程序的瑞士军刀,提供了丰富的选项和灵活性.很多时候用户为了看视频和听音乐都安装了ffmeg.更多关于ffmeg的详细介绍:here,可以通过ffmpeg -formats查看FFmpeg支持的视音频格式,左侧若是E表明可以编码,D表明可以解码. 本文着重介绍命令行下ffmeg的7个技巧:.

Nginx+ffmpeg搭建Apple Http Live Streaming笔记

- - 移动开发 - ITeye博客
起始Nginx来搭建HLS步骤非常少. 安装好Nginx,然后跑起来. 把切片好的视频和m3u8文件放到部署目录,直接访问就可以了. 网上国内国外的找了好多博客. 这里一定注意一点,不要用VLC播放器来测试,最好用iPad或者iPhone,再么用Safari 开发模式下模拟iPad、iPhone的浏览器模式播放.

CentOS 下通过 JavaCPP 调用 FFMPEG

- - CSDN博客综合推荐文章
   FFMPEG 是一个广泛用于媒体处理的库,在Java的世界里,处理视频的能力相当弱,于是有很大需求需要Java 调用 FFMPEG.   Java 调用C 的方式有很多,可以用最原始的JNI方式,也可以JNA方式,还可以是命令行.    采用命令行的方式比较简单,不过有很大局限性,尤其是涉及到 视频的处理和分析的时候,比如要取出某个packet,然后进行处理.

FFmpeg和一千多次bug修正

- - Solidot
Google透露,它在两年多时间内帮助开源跨平台多媒体编解码器库FFmpeg发现和修复了1000多个bug. Google称,它不仅仅重视自家产品的安全,它的安全团队和Google雇员还经常评估外部软件,并将结果报告给软件供应商或维护者. FFmpeg和它的衍生版本Libav被许多项目广泛使用,其中包括Google Chrome、MPlayer、VLC和xine,Google认为帮助FFmpeg发现bug将会让数以百万计的用户受益.

ffmpeg 视频转码例子集合

- - 开源软件 - ITeye博客
-muxrate 复用码率,设置之后整体码率模式才是CBR. -c:v mpeg2video MPEG2视频编码. -flags ildct+ilme 隔行扫描. -top 隔行扫描前场/后场优先模式 ,1是前场(顶场),0是后场(底场). -streamid 设置视频、音频PID,0视频,1音频.

微软发布Kinect SDK For Windows

- skyan - Solidot
微软遵守承诺发布了Kinect SDK For Windows,允许教育研究人员或爱好者为这种体感控制器开发新的应用. SDK是基于XBOX 360上使用的软件,但微软将其移植到了.NET平台,支持C#、VB.NET或C++.NET等开发语言. Kinect SDK For Windows的运行平台是Windows 7,最低硬件需求是4GB RAM、双核处理器和DirectX 9.0c显卡,开发工具是Visual Studio 2010 Express(免费版),.NET Framework 4.0.