今热点:如何将PCM格式的原始音频采样数据编码为MP3格式或AAC格式的音频文件?
一.打开和关闭输入文件和输出文件以及判断输入文件是否读取完毕
(资料图片仅供参考)
//io_data.cppstatic FILE* input_file= nullptr;static FILE* output_file= nullptr;int32_t open_input_output_files(const char* input_name,const char* output_name){ if(strlen(input_name)==0||strlen(output_name)==0){ cout<<"Error:empty input or output file name."<二.音频编码器的初始化
//audio_encoder_core.cppstatic const AVCodec* codec= nullptr;static AVCodecContext* codec_ctx= nullptr;static AVFrame* frame= nullptr;static AVPacket* pkt= nullptr;static enum AVCodecID audio_codec_id;int32_t init_audio_encoder(const char* codec_name){ if(strcasecmp(codec_name,"MP3")==0){ audio_codec_id=AV_CODEC_ID_MP3; cout<<"Select codec id:MP3"<bit_rate=128000; codec_ctx->sample_fmt=AV_SAMPLE_FMT_FLTP; codec_ctx->sample_rate=44100; codec_ctx->channel_layout=AV_CH_LAYOUT_STEREO; codec_ctx->channels=2; int32_t result=avcodec_open2(codec_ctx,codec, nullptr); if(result<0){ cerr<<"Error:could not open codec."< nb_samples=codec_ctx->frame_size;//采样点数量 frame->format=codec_ctx->sample_fmt; frame->channel_layout=codec_ctx->channel_layout; result= av_frame_get_buffer(frame,0); if(result<0){ cerr<<"Error:AVFrame could not get buffer."< 三.编码循环体
1.PCM文件的存储结构
音频采样格式可以分为packed和planar两类。以packed格式保存的采样数据,各声道间按照采样值交替存储;以planar格式保存的采样数据,各个采样值按照不同声道连续存储
下面以8bit为例展示planar和packed格式是如何保存音频采样数据的:
packed:
左声道0 右声道0 左声道1 右声道1 左声道2 右声道2 左声道3 右声道3 planar:
左声道0 左声道1 左声道2 左声道3 右声道0 右声道1 右声道2 右声道3 2.读取PCM音频采样数据
由于我们代码里设置了采样格式为fltp,即planar格式,而输入的PCM音频采样数据是packed格式的,因此我们需要将packed格式转化为planar格式进行保存:
//io_data.cppint32_t read_pcm_to_frame(AVFrame* frame,AVCodecContext* codec_ctx){ int data_size= av_get_bytes_per_sample(codec_ctx->sample_fmt); if(data_size<0){ cerr<<"Error:Failed to calculate data size."<channels;ch++){ fread(frame->data[ch]+i*data_size,1,data_size,input_file); } } return 0;} 3.编码音频采样数据
//audio_encoder_core.cppstatic int32_t encode_frame(bool flushing){ int32_t result=0; if(!flushing){ cout<<"Send frame to encoder with pts:"<<frame->pts<=0){ result= avcodec_receive_packet(codec_ctx,pkt); if(result==AVERROR(EAGAIN)||result==AVERROR_EOF){//尚未完成对新一帧的编码,要传入后续帧或编码器已完全输出内部缓存的码流 return 1; } else if(result<0){ cerr<<"Error:avcodec_receive_packet failed."< dts<<",pts:"< pts<<", "< 4.写出码流数据
//io_data.cppvoid write_pkt_to_file(AVPacket* pkt){ fwrite(pkt->data,1,pkt->size,output_file);}5.实现编码循环
//audio_encoder_core.cppint32_t audio_encoding(){ int32_t result=0; while(!end_of_input_file()){ result= read_pcm_to_frame(frame,codec_ctx); if(result<0){ cerr<<"Error:read_pcm_to_frame failed."<6.关闭编码器
//audio_encoder_core.cppvoid destroy_audio_encoder(){ av_frame_free(&frame); av_packet_free(&pkt); avcodec_free_context(&codec_ctx);}7.最终main函数的实现如下:
int main(){ const char* input_file_name="../input.pcm"; const char* output_file_name="../output.mp3"; const char* codec_name="MP3"; int32_t result= open_input_output_files(input_file_name,output_file_name); if(result<0){ return result; } result=init_audio_encoder(codec_name); if(result<0){ return result; } result=audio_encoding(); if(result<0){ return result; } destroy_audio_encoder(); close_input_output_files(); return 0;}与视频文件类似,可以使用ffplay播放输出的.mp3文件来测试效果。
-
今热点:如何将PCM格式的原始音频采样数据编码为MP3格式或AAC格式的音频文件?
博客园 2023-06-20
-
全球看热讯:一个不负责的男人下场_不负责的男人可不可靠
互联网 2023-06-20
-
全球观速讯丨青海都兰县总工会全力打造暖心“司机之家”
中工网 2023-06-20
-
每日消息!有关系购买入学名额?有人被骗 25.5 万元!警方紧急提醒
央视财经 2023-06-20
-
信息:快!救人!救人!
西青区融媒体中心 2023-06-20
-
全球动态:成都市成华区侨联陪同杭州市富阳区侨联一行学习考察龙潭工业机器人产业功能区
中国侨网 2023-06-20
-
公告速递:华泰柏瑞鸿益30天滚动持有短债基金暂停转换转入 世界热推荐
证券之星 2023-06-20
-
全球看点:沈阳最“无敌”的水上乐园,存活15的沈阳老地标里有你的童年吗?
栋察楼市 2023-06-20
-
全球新动态:湛江水产“游”向世界
湛江日报 2023-06-20
-
意天空:那不勒斯首选丹索代替金玟哉 若奥斯梅恩离队有意签戴维 全球新要闻
直播吧 2023-06-20
-
今热点:如何将PCM格式的原始音频采样数据编码为MP3格式或AAC格式的音频文件?
博客园 2023-06-20
-
全球看热讯:一个不负责的男人下场_不负责的男人可不可靠
互联网 2023-06-20
-
全球观速讯丨青海都兰县总工会全力打造暖心“司机之家”
中工网 2023-06-20
-
每日消息!有关系购买入学名额?有人被骗 25.5 万元!警方紧急提醒
央视财经 2023-06-20
-
信息:快!救人!救人!
西青区融媒体中心 2023-06-20
-
全球动态:成都市成华区侨联陪同杭州市富阳区侨联一行学习考察龙潭工业机器人产业功能区
中国侨网 2023-06-20
-
公告速递:华泰柏瑞鸿益30天滚动持有短债基金暂停转换转入 世界热推荐
证券之星 2023-06-20
-
全球看点:沈阳最“无敌”的水上乐园,存活15的沈阳老地标里有你的童年吗?
栋察楼市 2023-06-20
-
全球新动态:湛江水产“游”向世界
湛江日报 2023-06-20
-
意天空:那不勒斯首选丹索代替金玟哉 若奥斯梅恩离队有意签戴维 全球新要闻
直播吧 2023-06-20
-
@贵州人:雨继续下!这些防御知识你必须知道!
光明网 2023-06-20
-
兴业证券(601377):6月19日北向资金减持80.12万股 环球今热点
证券之星 2023-06-20
-
视焦点讯!队记:绿军一直在探索交易 想减轻后场拥挤并增加侧翼和大个深度
手机网易网 2023-06-20
-
天天关注:叶罗丽娃娃衣服教程视频_yie罗丽娃娃衣服
互联网 2023-06-20
-
广告设备大全图片及价格清单_广告设备大全-观天下
互联网 2023-06-20
-
欧足3消息:梅西夺冠半年发文 卢卡库宣誓留国米 恩里克入主巴黎
条条爱侃球 2023-06-19
-
青春期撞上更年期大结局(青春期撞上更年期大结局) 全球观点
互联网 2023-06-19
-
焦点报道:护航中考,逐梦之路“警”相随
平安天津 2023-06-19
-
环球信息:佩斯科夫:联合国代表若访问第聂伯河左岸将面临安全问题
环球网 2023-06-19
-
焦点速看:东南大学:2023年新增3个专业 5个双学士学位培养项目
人民网-教育频道 2023-06-19
-
官方回复!事关昆明地铁一号线西北延教场北路站→
光明网 2023-06-19
-
关注肺癌靶向治疗,推动县域肿瘤诊疗同质化
人民日报健康客户端 2023-06-19
-
大同阳高东小村镇杏果有了“双保险” 全球新动态
金台资讯 2023-06-19
-
瑞奇智造:深耕核能、新能源等优势领域实现公司市场规模的稳步提升 快消息
挖贝网 2023-06-19
-
日照市第七届运动会(青少年组)足球比赛开赛
互联网 2023-06-19
-
天天新动态:媒体人:张镇麟结束美国特训现身沈阳 将飞成都和林书豪参加活动
天下足球最新帖子 2023-06-19
-
租赁住房贷款支持计划稳步推进_全球快报
中国经济网 2023-06-19
-
房产纠纷律师——执行债务房屋过程中他人起诉要求中止执行纠纷|全球微动态
北京房产律师靳双权 2023-06-19
-
2023端午节天津科技馆快乐学习“粽”动员活动详情
本地宝 2023-06-19
-
一二级残疾人可以无条件享受低保吗 看这里就清楚了
互联网 2023-06-19