热门标签 | 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---解码媒体文件流信息(转)


推荐阅读
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 两个条件,组合控制#if($query_string~*modviewthread&t(&extra(.*)))?$)#{#set$itid$1;#rewrite^ ... [详细]
  • XAMPP 遇到 404 错误:无法找到请求的对象
    在使用 XAMPP 时遇到 404 错误,表示请求的对象未找到。通过详细分析发现,该问题可能由以下原因引起:1. `httpd-vhosts.conf` 文件中的配置路径错误;2. `public` 目录下缺少 `.htaccess` 文件。建议检查并修正这些配置,以确保服务器能够正确识别和访问所需的文件路径。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 自定义滚动条美化页面内容
    当页面内容超出显示范围时,为了提升用户体验和页面美观,通常会添加滚动条。如果默认的浏览器滚动条无法满足设计需求,我们可以自定义一个符合要求的滚动条。本文将详细介绍自定义滚动条的实现过程。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 本文介绍了如何使用 CMD 批处理脚本进行文件操作,包括将指定目录下的 PHP 文件重命名为 HTML 文件,并将这些文件复制到另一个目录。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 基于Web的Kafka管理工具Kafkamanager首次访问Web界面的详细配置指南(附图解)
    首次访问Kafkamanager Web界面时,需要对Kafka集群进行配置。这一过程相对简单,用户只需依次点击【Cluster】>【Add Cluster】,按照提示完成相关设置即可。本文将通过图文并茂的方式,详细介绍每一步的配置步骤,帮助用户快速上手Kafkamanager。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 装饰者模式(Decorator):一种灵活的对象结构设计模式
    装饰者模式(Decorator)是一种灵活的对象结构设计模式,旨在为单个对象动态地添加功能,而无需修改原有类的结构。通过封装对象并提供额外的行为,装饰者模式比传统的继承方式更加灵活和可扩展。例如,可以在运行时为特定对象添加边框或滚动条等特性,而不会影响其他对象。这种模式特别适用于需要在不同情况下动态组合功能的场景。 ... [详细]
  • 本文详细解析了Autofac在高级应用场景中的具体实现,特别是如何通过注册泛型接口的类来优化依赖注入。示例代码展示了如何使用 `builder.RegisterAssemblyTypes` 方法,结合 `typeof(IEventHandler).Assembly` 和 `Where` 过滤条件,动态注册所有符合条件的类,从而简化配置并提高代码的可维护性。此外,文章还探讨了这一方法在复杂系统中的实际应用及其优势。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
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社区 版权所有