ffmpeg庫G726編解碼例項
ffmpeg g726編碼器:AV_CODEC_ID_ADPCM_G726
ffmpeg g726解碼器包括:AV_CODEC_ID_ADPCM_G726、AV_CODEC_ID_ADPCM_G726LE
AV_CODEC_ID_ADPCM_G726,無法指定碼流,預設是16kps;AV_CODEC_ID_ADPCM_G726LE,可以指導碼流,AVCodecContext中的bits_per_coded_sample:表示編碼壓縮bit值與取樣率的bit值之比。如果為g726音訊時,表示g726碼流壓縮與取樣率比值。比如kbps碼流壓縮比為:40k/8k = 5,kbps碼流壓縮比為16k/8k = 2。
//編碼
extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavutil/frame.h" #include "libswscale/swscale.h" #include "libavutil/imgutils.h" } //連結ffmpeg lib庫 //pcm to g726 AVCodec *codec; AVCodecContext *c= NULL; AVPacket avpkt; AVFrame *decoded_frame = NULL; /* register all the codecs */ avcodec_register_all(); av_init_packet(&avpkt); avpkt.data = NULL; avpkt.size = 0; /* find the mpeg audio decoder */ codec = avcodec_find_encoder(AV_CODEC_ID_ADPCM_G726); if (!codec) { fprintf(stderr, "codec not found\n"); return; } c = avcodec_alloc_context3(codec); //put sample parameters c->bits_per_coded_sample = 2; c->bit_rate = 16000; // c->sample_rate = 8000; //取樣率 c->channels = 1; //通道數 c->sample_fmt = AV_SAMPLE_FMT_S16;//取樣位數 /* open it */ int iRet = avcodec_open2(c, codec,NULL); if ( iRet < 0 ) { fprintf(stderr, "could not open codec\n"); return; } CString filePath = ""; CString newlFilePath = ""; char szFilter[] = {"Pcm Files (*.pcm)|*.pcm||"}; CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL); if(dlg.DoModal() == IDOK) { filePath = dlg.GetPathName(); newlFilePath = filePath; newlFilePath.Replace(".pcm","_ff.g726"); FILE * fpSrc = fopen(filePath.GetBuffer(filePath.GetLength()),"rb"); FILE * fpDst = fopen(newlFilePath.GetBuffer(newlFilePath.GetLength()),"wb+"); char szData[320] = {0}; char szOutData[200] = {0}; int nDataLen = 320; int nOutDataLen = 200; int nReadedSize = 0; int ret = 0; if(fpSrc != NULL) { while(TRUE) { nReadedSize = fread(szData,sizeof(char),nDataLen,fpSrc); if(nReadedSize < nDataLen) { break; } if (!decoded_frame) { if (!(decoded_frame = avcodec_alloc_frame())) { return; } } else { avcodec_get_frame_defaults(decoded_frame); } decoded_frame->nb_samples = nReadedSize/(c->channels*av_get_bytes_per_sample(c->sample_fmt)); ret = avcodec_fill_audio_frame(decoded_frame, c->channels, c->sample_fmt, (unsigned char *)szData,nReadedSize, 1); if (ret < 0) { return; } int got_packet = 0; if (avcodec_encode_audio2(c, &avpkt, decoded_frame, &got_packet) < 0) { return; } if (got_packet) { int iiiii = fwrite( avpkt.data, 1, avpkt.size, fpDst ); } } fclose(fpSrc); fclose(fpDst); } }
//解碼
extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavutil/frame.h" #include "libswscale/swscale.h" #include "libavutil/imgutils.h" } //連結ffmpeg lib庫 //g726 to pcm AVCodec *codec; AVCodecContext *c= NULL; AVPacket avpkt; AVFrame *decoded_frame = NULL; avcodec_register_all(); av_init_packet(&avpkt); /* find the mpeg audio decoder */ codec = avcodec_find_decoder(AV_CODEC_ID_ADPCM_G726); if (!codec) { fprintf(stderr, "codec not found\n"); return; } c = avcodec_alloc_context3(codec); //取樣率= 8000 每個取樣用的bit數= 16 通道數= 1 c->bits_per_coded_sample = 2; //g726壓縮比為8:1 編碼前取樣用bit數為那麼編碼後應該佔/8 = 2 c->channels = 1; c->sample_fmt = AV_SAMPLE_FMT_S16; c->sample_rate = 8000; c->codec_type = AVMEDIA_TYPE_AUDIO; c->bit_rate = 16000; int iRet = avcodec_open2(c, codec,NULL); if ( iRet < 0 ) { fprintf(stderr, "could not open codec\n"); return; } CString filePath = ""; CString newlFilePath = ""; char szFilter[] = {"g726 Files (*.g726)|*.g726||"}; CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL); if(dlg.DoModal() == IDOK) { filePath = dlg.GetPathName(); newlFilePath = filePath; newlFilePath.Replace(".g726",".pcm"); BOOL bRet = 0; FILE * fpSrc = fopen(filePath.GetBuffer(filePath.GetLength()),"rb"); FILE * fpDst = fopen(newlFilePath.GetBuffer(newlFilePath.GetLength()),"wb+"); char szData[100] = {0}; char szOutData[320] = {0}; int nDataLen = c->bits_per_coded_sample*20; int nOutDataLen = 320; int nReadedSize = 0; if(fpSrc != NULL) { while(TRUE) { nDataLen = 40; nReadedSize = fread(szData,sizeof(char),nDataLen,fpSrc); if(nReadedSize < nDataLen) { break; } avpkt.data = (uint8_t *)szData; avpkt.size = nDataLen; int got_frame = 0; if (!decoded_frame) { if (!(decoded_frame = avcodec_alloc_frame())) { return; } } else { avcodec_get_frame_defaults(decoded_frame); } int len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt); if (len < 0) { return; } if (got_frame) { /* if a frame has been decoded, output it */ int data_size = av_samples_get_buffer_size(NULL, c->channels, decoded_frame->nb_samples, c->sample_fmt, 1); fwrite(decoded_frame->data[0], 1, data_size, fpDst); } } fclose(fpSrc); fclose(fpDst); avcodec_close(c); av_free(c); av_free(decoded_frame); } }
程式碼下載
相關推薦
ffmpeg庫G726編解碼例項
ffmpeg g726編碼器:AV_CODEC_ID_ADPCM_G726ffmpeg g726解碼器包括:AV_CODEC_ID_ADPCM_G726、AV_CODEC_ID_ADPCM_G726LEAV_CODEC_ID_ADPCM_G726,無法指定碼流,預設是16kp
FFmpeg視頻編解碼庫,無法解析的外部符號、找不到inttypes.h文件的問題
detail program targe image types lib 包含 mage 程序 ffmpeg報錯,link2019,無法解析的外部符號。 以下嘗試: 在檢查 包含目錄、庫目錄、鏈接器輸入和系統環境變量 均設置無誤的情況下,包含的文件要寫成以下形式: ex
Android 引入 FFMpeg 並列印編解碼庫
在編譯完 Android 平臺下的 FFMpeg 庫之後,我們接下來接入到 AndroidStudio 工程中。我們驗證的目的是想在 AndroidStudio 控制檯中列印 FFMpeg 所有支援的編解碼庫資訊,下面我們來一步一步的實現這個過程。 要完成這個功能主要有以下 2 步:
[總結]FFMPEG視音訊編解碼零基礎學習方法
郵箱:[email protected] 技術交流:QQ:931120780,註明csdn交流,白天較少回覆請留言。 部落格內錯誤之處,請您留言或郵件指明,不勝感激。近期發現一些錯誤,發現會及時修正。
【ffmpeg】視訊編解碼之ffmpeg命令列工具的常用命令彙總
H264視訊轉ts視訊流 ffmpeg -i test.h264 -vcodec copy -f mpegts test.ts H264視訊轉mp4 ffmpeg -i test.h264 -vcodec copy -f mp4 test.mp4 ts視訊轉mp4 ffmpeg
2017.11.1開始學習FFMPEG音視訊編解碼,通過學習雷霄驊文章
NAL Header由三部分組成:forbidden_bit,nal_reference_bit(優先順序)2bit,nal_unit_type(型別)5bit。 補充一下NAL_HEADER裡的nal_unit_type一位元組的型別有哪些: 0:未規定
參照ffmpeg重新寫makefile檔案提取prores編解碼庫
我們知道,ffmpeg原始碼是在linux底下開發出來的,而如果我們要在windows底下進行ffmpeg相關程式碼的修改和優化的話,則是需要藉助mingw,mingw中提供了msys編譯環境,這樣的話,你修改和優化後的ffmpeg程式碼如果要在windows下應用的話,則
ffmpeg庫解碼海思G726庫編碼音訊資料
解碼流程: 1、 讀取海思g726音訊資料,海思g726音訊會多4個位元組的海思頭資訊。 2、選擇ffmpeg g726編碼器進行解碼。ffmpeg g726解碼器包括:AV_CODEC_ID_ADPCM_G726、AV_CODEC_ID_ADPCM_G726LE。如果海
多媒體編解碼學習: ffmpeg(更新ffmpeg庫使用方法)
文中內容部分參考大牛部落格進行邊操作邊總結 一、ubuntu安裝ffmpeg 先安裝yasm,ffmpeg編譯中為了提高編譯速度,使用了彙編指令,於是需要使用這個工具,並且只有先安裝yasm,才能安裝ffmpeg 可以直接執行 yum -y install ya
[總結]FFMPEG視音頻編解碼零基礎學習方法
配置 音頻技術 build align jpeg 完成 data 步驟 c函數 http://blog.csdn.net/leixiaohua1020/article/details/15811977 在CSDN上的這一段日子,接觸到了很多同行業的人,尤其是使用FFMPEG
視訊編解碼的理論和實踐2:Ffmpeg視訊編解碼
近幾年,視訊編解碼技術在理論及應用方面都取得了重大的進展,越來越多的人想要了解編解碼技術。因此,網易雲信研發工程師為大家進行了歸納梳理,從理論及實踐兩個方面簡單介紹視訊編解碼技術。 相關閱讀推薦 《視訊直播關鍵技術:流暢、擁塞和延時追趕》 《視訊直播技術詳解:直播的推流
JBoss Marshalling 序列化技術 編解碼器使用 netty 例項
JBoss Marshalling 是一個 Java 物件序列化包,對 JDK 預設的序列化框架進行了優化,但又保持與 Serializable 介面的相容,同時增加了一些可呼叫的引數和附加的屬性,這些引數可通過工廠類進行配置。 環境準備 ma
史上最全的基於ffmpeg+sdl網路攝像頭編解碼播放資料(包含交叉編譯過程,附帶完整原始碼)
原創博文,嚴禁私自轉載,轉載請註明出處!!! 近期,由於工作需要,要在開發板上跑一個攝像頭,攝像頭款式比較老,不支援rtsp格式,所以選擇編譯ffmpeg+sdl實現軟解碼播放攝像頭,特此記錄整個編譯過程(非常之艱辛,發文留念) 在ubuntu上交叉編譯環境的搭建:因為開發板上搭建的程式的執
python3 編解碼常見操作(codecs, url編解碼, soup例項化報錯)
codecs是encoders和decoders的縮寫。codecs模組為我們解決的字元編碼的處理提供了lookup方法,它接受一個字元編碼名稱的引數,並返回指定字元編碼對應的codecs.CodecInfo 物件,該物件包含了 encoder、decoder、StreamR
FFmpeg編解碼常用函式ffmpeg av_parser_parse2()函式
主要是通過av_parser_parse2拿到AVPaket資料,跟av_read_frame類似。 輸入必須是隻包含視訊編碼資料“裸流”(例如H.264、HEVC碼流檔案),而不能是包含封裝格式的媒體資料(例如AVI、MKV、MP4)。 av_parser
利用開源ASN1C庫實現asn.1的編解碼
最近在研究MMS的時候接觸到了抽象語義記法ASN.1(Abstract Syntax Notation One),於是對它做了一番瞭解,下面將這幾天的學習到的做下記錄,以供以後偷懶。 ASN.1是一種 ISO/ITU-T 標準,描述了一種對資料進行表示、編碼、傳輸和
boost庫實現Base64編解碼
Base64介紹 Base64是一種基於64個可列印字元來表示二進位制資料的表示方法,從本質上看Base64編碼就是將三位元組轉換為四位元組,如果資料的長度不是3的整數倍,就要在後面補0再計算,每補2個0就再Base64串後加上1個‘=’。 boost庫Base64
ffmpeg編解碼詳細過程
1. 註冊所有容器格式和CODEC:av_register_all() 2. 開啟檔案:av_open_input_file() 3. 從檔案中提取流資訊:av_find_stream_info() 4. 窮舉所有的流,查詢其中種類為CODEC_TYPE_VID
樹莓派3下使用QT5配置ffmpeg環境並呼叫硬體編解碼器
最近由於專案需要,使用樹莓派編碼兩路視訊無線傳輸到pc端,遇到種種難題 ,做個簡單筆記.借鑑了不少前人的經驗,給個連結http://www.jianshu.com/p/dec9bf9cffc9 平臺 樹莓派3b,raspbian系統,x264最新版庫,f
樹莓派x264和ffmpeg編譯(用於支援GPU硬體編解碼)
FFmpeg是一套開源的音視訊編解碼庫,有非常強大的功能,包括視訊採集功能、視訊格式轉換等。視訊編解碼是一個非常消耗系統資源的過程,而樹莓派自帶了H.264的硬體編解碼器,本文講介紹在樹莓派上配置FFmpeg使其支援硬體編解碼器並編譯安裝的過程,所使用到的所有庫檔案,包括x