標籤:
最近項目涉及到流媒體等開發,由於有過開發經驗深知其難度所在,沒辦法只能重新拾起,最新版的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?
- // 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
基於FFMPEG SDK流媒體開發1---解碼媒體檔案流資訊(轉)