基於FFMPEG SDK流媒體開發1---解碼媒體檔案流資訊
最近專案涉及到流媒體等開發,由於有過開發經驗深知其難度所在,沒辦法只能重新拾起,最新版的SDK被改的一塌糊塗,不過大體的開發思路都是一樣的,看多少書查多少資料都無用,一步一步的編寫程式碼 才是學好的關鍵。。
我會把每一天的學習經過,更新到博文上,希望能給更多想學習的人帶來幫助,篇尾附上工程 以及最新版本SDK。
FFMPEG被大多數的人命令列來使用,其實在真正的流媒體開發中,要想靈活運用其開發流媒體應用層序,必須使用官方SDK開發 ,實際上我們市面上好多產品
都是基於FFMPEG,比如 XX影音 。。
由於在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!
具體不廢話了,如何配置專案啥的,這都是新手級別的問題,我就不詳細說明了 直接上程式碼加註釋 我會提供原始碼下載 。。。工程配置好的 大家下載研究就行
// 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