热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于FFMPEGSDK流媒体开发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!

技术分享

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

[cpp] view plaincopyprint?
 
  1. // ffmpeg_test.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"    
  5.   
  6. #include   
  7. #ifdef _CPPRTTI  
  8. extern "C"    
  9. {  
  10. #endif  
  11.     #include "libavcodec/avcodec.h"  //编解码器  
  12.     #include "libavformat/avformat.h" //格式上下文   
  13.     #include "libavformat/avio.h"  //音视频IO  
  14.     #include "libavutil/file.h"  //处理文件  
  15. #ifdef _CPPRTTI    
  16. };  
  17. #endif  
  18.   
  19. void  SetStdClr(WORD wd)  
  20. {  
  21.     SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE),wd );  
  22. }  
  23.   
  24. int _tmain(int argc, _TCHAR* argv[])  
  25. {     
  26.     //注册所有 编码器  解析器 二进制流过滤器  
  27.      av_register_all();  
  28.      avcodec_register_all();  
  29.      SetStdClr(FOREGROUND_RED |   FOREGROUND_GREEN);  
  30.      AVFormatContext *pCOntext=NULL;//格式上下文  
  31.      int errNo=0 ;  
  32.      pCOntext=avformat_alloc_context();  
  33.      //打开输入文件 新接口  
  34.      if(0==avformat_open_input(&pContext,".\\test.mp4",nullptr,NULL)){  
  35.          printf("打开文件输入成功!\n");  
  36.      }else  
  37.          return  0;  
  38.      //从上下文检索流信息  
  39.     if(0==avformat_find_stream_info(pContext,NULL))  
  40.     {  
  41.         printf("获取流信息成功!\n");  
  42.     }else  
  43.         return 0 ;  
  44.     //循环多个流  
  45.      SetStdClr(FOREGROUND_RED |   FOREGROUND_BLUE);  
  46.     for (unsigned int i=0;inb_streams;i++)  
  47.     {     
  48.   
  49.         //媒体流   
  50.         AVStream *pStream = pContext->streams[i];  
  51.         //帧率信息 为有理数/无理数  
  52.         AVRational frame =pStream->r_frame_rate;    
  53.   
  54.         // 时间比率单位  
  55.         AVRational timeBase = pStream->time_base;   
  56.           
  57.         //流的持续时间  比特率  
  58.         int64_t duration=   pStream->duration ;   
  59.         printf("媒体持续时间%d\n",duration);  
  60.         //获取编码类型  
  61.         AVCodecContext *pCodecCOntext=pStream->codec ;  
  62.         //获取 媒体类型  
  63.         /************************************************************************/  
  64.         /*  
  65.         enum AVMediaType { 
  66.         AVMEDIA_TYPE_UNKNOWN = -1,  ///< Usually treated as AVMEDIA_TYPE_DATA 
  67.         AVMEDIA_TYPE_VIDEO, 
  68.         AVMEDIA_TYPE_AUDIO, 
  69.         AVMEDIA_TYPE_DATA,          ///< Opaque data information usually continuous 
  70.         AVMEDIA_TYPE_SUBTITLE, 
  71.         AVMEDIA_TYPE_ATTACHMENT,    ///< Opaque data information usually sparse 
  72.         AVMEDIA_TYPE_NB 
  73.         }; 
  74.                                                                      */  
  75.         /************************************************************************/  
  76.         AVMediaType avMediaType=pCodecContext->codec_type;  
  77.         //编码器ID  
  78.         AVCodecID codecID=pCodecContext->codec_id ;  
  79.         if(avMediaType == AVMEDIA_TYPE_AUDIO)  
  80.         {  
  81.             //如果是视频  
  82.             int audioChannels = pCodecContext->channels;  
  83.             int samplerate = pCodecContext->sample_rate;  
  84.             PixelFormat pixelFormat = pCodecContext->pix_fmt;  
  85.             printf("Stream%d音频\n",i);  
  86.             printf("音频采样频率%d/%d\n",timeBase.num,timeBase.den);  
  87.             printf("音频时间单位%d/%d\n",timeBase.num,timeBase.den);  
  88.             printf("音频通道数%d\n",audioChannels);  
  89.   
  90.         }  
  91.         else if(avMediaType == AVMEDIA_TYPE_VIDEO)  
  92.         {  
  93.             //如果是音频  
  94.             int videoWidth = pCodecContext->width;  
  95.             int videoHeight = pCodecContext->height;  
  96.             AVSampleFormat sampleFmt = pCodecContext->sample_fmt;  
  97.             printf("Stream%d视频\n",i);  
  98.             printf("帧率帧率%d/%d\n",frame.den,frame.num);  
  99.             printf("视频时间单位%d/%d\n",timeBase.num,timeBase.den);  
  100.             printf("图像宽度:%d\t高度:%d\t%\n",videoWidth,videoHeight);  
  101.             printf("图像宽度:%d\t高度:%d\t%\n",videoWidth,videoHeight);  
  102.         }  
  103.         switch(codecID)  
  104.         {  
  105.         case  AV_CODEC_ID_AAC:  
  106.             printf("编码器FAAC\n");  
  107.             break;  
  108.         case  AV_CODEC_ID_H264:  
  109.             printf("编码器H264\n");  
  110.             break;  
  111.         }  
  112.   
  113.     }  
  114.     //释放上下文环境  
  115.     if(!pContext)  
  116.     {  
  117.         avformat_close_input(&pContext);  
  118.     }  
  119.     return 0;  
  120. }  


运行结果如下:

技术分享

工程下载地址 

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

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


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
author-avatar
avici
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有