本代码实现将cap1.g726文件中的g726编码帧数据进行解码,然后保存到cap1文件中
extern "C" { #include "./h/libavcodec/avcodec.h" };
#pragma comment(lib, "avutil.lib") //ffmpeg #pragma comment(lib, "avformat.lib") #pragma comment(lib, "avcodec.lib")
AVCodec *codec; AVCodecContext *c= NULL; AVPacket avpkt; AVFrame *decoded_frame = NULL;
//编码后一帧大小为 84字节 #define framesize 84
int main(int argc, char* argv[]) { printf("Hello World!\n"); unsigned char inbuffer[framesize] = {0}; /* register all the codecs */ avcodec_register_all(); av_init_packet(&avpkt); /* find the mpeg audio decoder */ codec = avcodec_find_decoder(CODEC_ID_ADPCM_G726); if (!codec) { fprintf(stderr, "codec not found\n"); return 0; } c = avcodec_alloc_context3(codec);
//没有如下两句 avcodec_open会返回 -22 错误
//采样率 = 8000 每个采样用的bit数 = 16 通道数 = 1 c->bits_per_coded_sample = 2; //g726压缩比为 8:1 编码前采样用bit数为16 那么编码后应该占16/8 = 2 这是我的理解
c->channels = 1; /* open it */ int iRet = avcodec_open(c, codec); if ( iRet < 0 ) { fprintf(stderr, "could not open codec\n"); return 0; } FILE *f, *outfile;
//打开存放g726音频帧的文件
f = fopen( "cap1.g726", "rb" ); if (!f) { return 0; }
//打开要存放解码后音频帧的文件 outfile = fopen("cap1", "wb"); if (!outfile)
{ av_free(c); return 0; } avpkt.data = inbuffer; while ( (avpkt.size = fread(inbuffer, 1, framesize, f) ) > 0 ) { int got_frame = 0; if (!decoded_frame) { if (!(decoded_frame = avcodec_alloc_frame())) { return 0; } } else { avcodec_get_frame_defaults(decoded_frame); } int len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt); if (len < 0) { return 0; } 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, outfile); } } fclose(outfile); fclose(f); avcodec_close(c); av_free(c); av_free(decoded_frame); return 0; }
//编码
ffmpeg g726 编码
2012-10-11 10:19:21| 分类: ffmpeg|举报|字号 订阅
一、将文件source中原始音频数据进行编码,并保存到dest中 采样率 = 8000 通道数 = 1 采样位数 = 16 波特率 = 16000 二、源码extern "C" { #include "./h/libavcodec/avcodec.h" }; //视频相关库 #pragma comment(lib, "avutil.lib") //ffmpeg #pragma comment(lib, "avformat.lib") #pragma comment(lib, "avcodec.lib") AVCodec *codec; AVCodecContext *c= NULL; AVPacket avpkt; AVFrame *decoded_frame = NULL;
#define framesize 80 #define buffersize 640
int main(int argc, char* argv[]) {
/* register all the codecs */ avcodec_register_all(); av_init_packet(&avpkt);
//如下两句在编码中是必须的,要不avcodec_encode_audio2会失败
avpkt.data = NULL;
avpkt.size = 0;
/* find the mpeg audio decoder */ codec = avcodec_find_encoder(CODEC_ID_ADPCM_G726); if (!codec) { fprintf(stderr, "codec not found\n"); return 0; } 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_open(c, codec); if ( iRet < 0 ) { fprintf(stderr, "could not open codec\n"); return 0; }
int buf_size = buffersize; char szBuffer[buffersize] = {0}; int ret = 0; int got_packet = 0; FILE *f; FILE *output;
//打开存放编码前音频文件
f = fopen("source", "rb");
//打开存放编码后音频文件
output = fopen( "dest", "wb" );
while( fread( szBuffer, 1, buffersize, f ) ) { if (!decoded_frame) { if (!(decoded_frame = avcodec_alloc_frame())) { return 0; } } else { avcodec_get_frame_defaults(decoded_frame); } decoded_frame->nb_samples = buf_size/(c->channels*av_get_bytes_per_sample(c->sample_fmt)); ret = avcodec_fill_audio_frame(decoded_frame, c->channels, c->sample_fmt, (unsigned char *)szBuffer,
buf_size, 1); if (ret < 0) { //av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n"); return 0; } if (avcodec_encode_audio2(c, &avpkt, decoded_frame, &got_packet) < 0) {
return 0; } if (got_packet) { int iiiii = fwrite( avpkt.data, 1, avpkt.size, output ); } } fclose(f); fclose(output);
}