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

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

最近项目涉及到流媒体等开发,由于有过开发经验深知其难度所在,没办法只能重新拾起,最新版的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;
}


运行结果如下:



工程下载地址

http://download.csdn.net/detail/yue7603835/8268095



目录
相关文章
|
23天前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
260 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
8月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
433 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
5月前
|
人工智能 自然语言处理 开发工具
HarmonyOS NEXT~鸿蒙开发能力:HarmonyOS SDK AI 全解析
本文深入解析HarmonyOS SDK中的AI功能集,涵盖分布式AI引擎、核心组件(NLP、计算机视觉等)及智能决策能力。通过代码示例与开发实践指南,帮助开发者掌握环境配置、性能调优及多场景应用(智能家居、移动办公等)。同时探讨性能优化策略与未来演进方向,助力构建高效分布式智能应用。
365 9
|
12月前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
1151 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
7月前
|
存储 开发工具 开发者
揭秘 Microsoft.Docker.SDK:让容器开发更轻松的强大工具揭秘
随着云计算和容器技术的快速发展,`Docker` 已经成为容器化技术的事实标准。`Microsoft` 作为 `Docker` 的主要支持者和参与者,推出了 `Microsoft.Docker.SDK`,旨在帮助开发者更轻松地进行容器开发。本文将深入揭秘 Microsoft.Docker.SDK 的功能、使用方法以及它在容器开发中的应用。
195 12
|
8月前
|
前端开发 JavaScript 开发工具
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
469 5
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
8月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
503 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
8月前
|
JavaScript 编译器 开发工具
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
379 2
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
9月前
|
API 开发工具 Android开发
【01】完整开发即构美颜sdk的uni官方uts插件—让所有开发者可以直接使用即构美颜sdk的能力-优雅草卓伊凡
【01】完整开发即构美颜sdk的uni官方uts插件—让所有开发者可以直接使用即构美颜sdk的能力-优雅草卓伊凡
287 23
【01】完整开发即构美颜sdk的uni官方uts插件—让所有开发者可以直接使用即构美颜sdk的能力-优雅草卓伊凡

热门文章

最新文章