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

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

运行结果如下:

工程下载地址

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

时间: 2024-08-10 02:09:24

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

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

最近项目涉及到流媒体等开发,由于有过开发经验深知其难度所在,没办法只能重新拾起,最新版的SDK被改的一塌糊涂,不过大体的开发思路都是一样的,看多少书查多少资料都无用,一步一步的编写代码 才是学好的关键.. 我会把每一天的学习经过,更新到博文上,希望能给更多想学习的人带来帮助,篇尾附上工程     以及最新版本SDK. FFMPEG被大多数的人命令行来使用,其实在真正的流媒体开发中,要想灵活运用其开发流媒体应用层序,必须使用官方SDK开发  ,实际上我们市面上好多产品 都是基于FFMPEG,比如

基于ffmpeg的流媒体服务器

OS:ubuntu 12.04ffmpeg:N-47141-g4063bb2x264:0.133.2334 a3ac64b目标:使用ffserver建立流媒体服务器使用ffmpeg对本地文件流化(x264编码器)使用ffplay播放 目录 [hide] 1 ffserver.conf配置 2 启动ffserver服务器 3 使用ffmpeg对本地文件流化 4 捕捉本地摄像头数据 5 为流媒体增加声音 6 使用ffplay播放 ffserver.conf配置 1 Port 8090  #访问端口

FFmpeg SDK开发模型之一:解码器

简介 本例讲解了如何使用ffmpeg SDK解码媒体文件: 参考源码是ffmpeg 自带的apiexample.c 一.源代码 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #ifdef HAVE_AV_CONFIG_H #undef HAVE_AV_CONFIG_H #endif #include "libavcodec/avcodec.h

用C/C++开发基于VLC SDK的视频播放器

在windows系统如果开发万能播放器,一般都是基本DirectShow来开发,开发也很简单,但缺点也很多,一个文件格式是否能够播放完全取决于你 是否安装了正确的解析器和解码器,即使现在有了万能解器安装包也会出现很多问题,不过自从很多开源软件的出现,比如大名鼎鼎的ffmpeg,vlc等,一 切都变得简单起来,基于ffmpeg sdk开发就不多介绍了,本文主要介绍基于 VLC SDK来开发自己的播放器,一切都是那么的简单. 1.先下载VLC player, http://www.videolan.

FFmpeg SDK开发模型之中的一个:解码器

简单介绍 本例解说了怎样使用ffmpeg SDK解码媒体文件: 參考源代码是ffmpeg 自带的apiexample.c 一.源代码#include <stdlib.h>#include <stdio.h>#include <string.h>#include <math.h> #ifdef HAVE_AV_CONFIG_H#undef HAVE_AV_CONFIG_H#endif #include "libavcodec/avcodec.h&qu

基于ffmpeg+SDL2 实现简单rtsp播放器

参考资料: 编译参考:         http://blog.chinaunix.net/uid-20718335-id-2980793.html 代码参考:         http://blog.csdn.net/leixiaohua1020/article/details/8652605 实现ffmpeg在window下编译,并基于ffmpeg动态库用测试程序播放本地文件和RTSP视频流 csdn博客插个图片怎么这么麻烦,上篇辛辛苦苦截了那么多图一上传全没了,代码里想变色结果发布了一看全

流媒体开发之--HLS--M3U8解析(2): HLS草案

目录 1 简介 2 2 概述 2 3 播放列表文件 3 3.1 介绍 3 3.2新标签 4 3.2.1 EXT-X-TARGETDURATION 4 3.2.2 EXT-X-MEDIA-SEQUENCE 4 3.2.3 EXT-X-KEY 4 3.2.4 EXT-X-PROGRAM-DATE-TIME 5 3.2.5 EXT-X-ALLOW-CATCH 5 3.2.6 EXT-X-ENDLIST 5 3.2.7 EXT-X-STREAM-INF 5 3.2.8 EXT-X-DISCONTINUI

最简单的基于FFmpeg的移动端例子:Android 推流器

本文记录一个安卓平台下基于FFmpeg的视频推流器.该推流器C语言的源代码来自于<最简单的基于FFMPEG的推流器>.相关的概念就不再重复记录了. 源代码 项目的目录结构如图所示.Java源代码位于src目录,而C代码位于jni目录. Android程序Java端代码位于src\com\leixiaohua1020\sffmpegandroidstreamer\MainActivity.java,如下所示. /** * 最简单的基于FFmpeg的推流器(RTMP)-安卓 * Simplest

基于海康威视SDK javaB/S

基于海康威视SDK javaB/S 下载NetVideoActiveX23.cab文件,放在webRoot下面的codebase文件夹里 //全局变量定义 var m_iNowChanNo = -1; //当前通道号 var m_iLoginUserId = -1; //注册设备用户ID var m_iChannelNum = -1; //模拟通道总数 var m_bDVRControl = null; //OCX控件对象 var m_iProtocolType = 0; //协议类型,0 –