1. 程式人生 > >ffmpeg庫G726編解碼例項

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);
		}

	}

程式碼下載

相關推薦

ffmpegG726解碼例項

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