ffmpeg aac解码pcm

匿名 (未验证) 提交于 2019-12-03 00:19:01

下面将aac解码成pcm的代码,主要是参考某位博主的博客,原文地址忘记在哪了!

#include<stdio.h> #include<stdlib.h> #include<string.h> #define __STDC_CONSTANT_MACROS extern "C" {     #include <libavcodec/avcodec.h>     #include <libavformat/avformat.h>     #include <libavdevice/avdevice.h>     #include<libswresample/swresample.h> }  #define MAX_AUDIO_FRAME_SIZE  192000  #define SAMPLE_PRT(fmt...)   \     do {\         printf("[%s]-%d: ", __FUNCTION__, __LINE__);\         printf(fmt);\        }while(0)  const char *in_file = "./hefang.aac"; const char *out_file = "./hefang.pcm"; int main() {     //注册所有的工具     av_register_all();      AVFormatContext *fmt_ctx = NULL;     AVCodecContext  *cod_ctx = NULL;     AVCodec         *cod   = NULL;      //分配一个avformat     fmt_ctx = avformat_alloc_context();     if (fmt_ctx == NULL)         printf("alloc fail");      //打开文件,解封装     if (avformat_open_input(&fmt_ctx, in_file, NULL, NULL) != 0)         printf("open fail");      //查找文件的相关流信息     if (avformat_find_stream_info(fmt_ctx, NULL) < 0)         printf("find stream fail");      //输出格式信息     av_dump_format(fmt_ctx, 0, in_file, 0);      //查找解码信息     int stream_index = -1;     for (int i = 0; i < fmt_ctx->nb_streams; i++)         if (fmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {             stream_index = i;             break;         }      if (stream_index == -1)         printf("find stream fail");      //保存解码器     cod_ctx = fmt_ctx->streams[stream_index]->codec;     cod = avcodec_find_decoder(cod_ctx->codec_id);      if (cod == NULL)         printf("find codec fail");      if (avcodec_open2(cod_ctx, cod, NULL) < 0)         printf("can't open codec");      FILE *out_fb = NULL;     out_fb = fopen(out_file, "wb");      //创建packet,用于存储解码前的数据     AVPacket *packet = (AVPacket *)malloc(sizeof(AVPacket));     av_init_packet(packet);      //设置转码后输出相关参数     //采样的布局方式     uint64_t out_channel_layout = AV_CH_LAYOUT_MONO;     //采样个数     int out_nb_samples = 1024;     //采样格式     enum AVSampleFormat  sample_fmt = AV_SAMPLE_FMT_S16;     //采样率     int out_sample_rate = 44100;     //通道数     int out_channels = av_get_channel_layout_nb_channels(out_channel_layout);     printf("%d\n",out_channels);     //创建buffer     int buffer_size = av_samples_get_buffer_size(NULL, out_channels, out_nb_samples, sample_fmt, 1);       //注意要用av_malloc     uint8_t *buffer = (uint8_t *)av_malloc(MAX_AUDIO_FRAME_SIZE * 2);       //创建Frame,用于存储解码后的数据     AVFrame *frame = av_frame_alloc();      int got_picture;      int64_t in_channel_layout = av_get_default_channel_layout(cod_ctx->channels);     //打开转码器     struct SwrContext *convert_ctx = swr_alloc();     //设置转码参数     convert_ctx = swr_alloc_set_opts(convert_ctx, out_channel_layout, sample_fmt, out_sample_rate, \             in_channel_layout, cod_ctx->sample_fmt, cod_ctx->sample_rate, 0, NULL);     //初始化转码器     swr_init(convert_ctx);      //while循环,每次读取一帧,并转码      while (av_read_frame(fmt_ctx, packet) >= 0) {          if (packet->stream_index == stream_index) {              //解码声音             if (avcodec_decode_audio4(cod_ctx, frame, &got_picture, packet) < 0) {                 printf("decode error");                 return -1;             }              if (got_picture > 0) {                 //转码                 swr_convert(convert_ctx, &buffer, MAX_AUDIO_FRAME_SIZE, (const uint8_t **)frame->data, frame->nb_samples);                  printf("pts:%10lld\t packet size:%d\n", packet->pts, packet->size);                  fwrite(buffer, 1, buffer_size, out_fb);             }             got_picture=0;         }          av_free_packet(packet);     }      swr_free(&convert_ctx);      fclose(out_fb);      return 0; }

windows:不懂


如果没有积分可以在评论区留下邮箱


文章来源: ffmpeg aac解码pcm
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!