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


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何在BackTrack 5中配置和启动SSH服务,确保其正常运行,并通过Windows系统成功连接。涵盖了必要的密钥生成步骤及常见问题解决方法。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
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社区 版权所有