FFmpeg - 音频解码过程

1. 注册所有解码器
 av_register_all();

2. Codec & CodecContext

AVCodec* codec = avcodec_find_decoder(CODEC_ID_AAC);
    if (!codec)
    {
        fprintf(stderr, "codec not found\n");
        exit(1);
    }

AVCodecContext *codec_ctx= avcodec_alloc_context();

if (avcodec_open(codec_ctx, codec) < 0)
    {
        fprintf(stderr, "could not open codec\n");
        exit(1);
    }

3. 准备好AVPacket
 AVPacket avpkt;
 av_init_packet(&avpkt);
    avpkt.size = pesdec.m_nEsLength;
    avpkt.data = pesdec.m_pEs;
    avpkt.pts = pesdec.m_nPts;

4. 准备好一个足够大的output buffer,用于存储音频解码得到的数据
奇怪的是长度要为AVCODEC_MAX_AUDIO_FRAME_SIZE *2,少了还不行(aac音频时,会crash)
 int16_t * outbuf = new int16_t[AVCODEC_MAX_AUDIO_FRAME_SIZE * 2];

5. 解码
 while(1)
 {
  // 读取一个完整的PES

// 解码
  while (avpkt.size > 0)
  {
   int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; // 对于AAC解码器来说,长度不能小于这个
   int len = avcodec_decode_audio3(codec_ctx, (short *)outbuf, &out_size, &avpkt);
   if (len <= 0)
   {
    fprintf(stderr, "Error while decoding\n");
    break;
   }

if (out_size > 0)
   {
    double pts = (double) avpkt.pts / 45000;
    printf("[time: %.3f] sound sample \n", pts);

// fwrite(outbuf, 1, out_size, outfile);
    // printf("get %d bytes.\n", out_size);
   }

avpkt.size -= len;
   avpkt.data += len;
  }
 }

6. 释放资源
   delete [] outbuf;

avcodec_close(codec_ctx);
    av_free(codec_ctx);

时间: 2024-10-03 00:17:33

FFmpeg - 音频解码过程的相关文章

ffmpeg强化一:编解码过程,基本用法

1  术语: 什么是影片?其实就是一组(很多张)图片,时间间隔很小的连续展示出来,人们就觉得画面中的人物在动,这就是影片.那电影的实质就是N多张图片的集合.那 每张图片和帧又有什么关系呢?事实上,如果一部影片里面的图片,我们原封不动的全部存起来,空间会很大很大很大,但是如果通过一定的算法(这里不讲相关算 法),把每一张图片压缩(编码_encode)一下,变成 帧.再把帧连起来变成流,再把不同的流放到某个容器里面,这就是我们平常看见的电影文件了,文件 碟中谍4.H264.ACC.mkv,他为什么要

FFMPEG解码过程

AVFormatContext* m_pFormatCtx; AVCodecContext * m_pCodecCtx; AVCodec* m_pCodec; AVFrame* m_pFrame; AVPacket m_AVPkt; // 注册库 av_register_all(); avformat_network_init(); //打开文件或者是网络串流 avformat_open_input(&m_pFormatCtx,pcURL,NULL,NULL); /***************

FFMPEG 音频封装编码

FFMPEG 4.0 for Android 准备工作 FFMPEG4.0 音频解码解封装 下面的函数方法基于最新的FFMPEG 4.0(4.X): 本文主要讲如何从一个pcm文件中拿到原始数据,用原始数据生成一个我们需要的音频格式文件,结合上一篇的FFMPEG4.0 音频解码解封装,你将能够实现音频格式转换. 从PCM文件中读取数据生成MP3格式文件.一.初始化输出 AVFormatContext *fmt_ctx; int ret = avformat_alloc_output_contex

H.264解码过程剖析-4

x264开源工程实现H.264的视频编码,但没有提供对应的解码器.ffmpeg开源多媒体编解码集合汇集了市面上几乎所有媒体格式的编解码的源代码.其中的H264.c就是一个能正常解码x264编码码流的独立的源文件,其使用步骤也与上述的编码或解码CODEC应用案例基本相同.这一节通过自顶向下的方式,讲述H264.c如何实现H.264视频解码过程. H264.c源文件有几千行,代码量庞大,很不便于浏览.分析和移植.同时该文件还依赖其他源文件,组织结构较复杂,实现平台由于不是基于Windows的VC++

音频解码相关总结

最近1年一直在做音频播放器的相关工作. 关于音频播放器,主要是做以下2项工作: 1> demux,对文件进行解析,获取Packet数据 2> 对解码器进行性能优化(主要针对软解) 对于第一点, 常见的辅助工具是阅读FFMPEG相关代码. 个人一些工作效率上的体会: 第一步: 建议在PC上利用QT等GUI工具,做一个树形控件,显示所有的数据block, 点击该块, 上面显示2进制值,下面显示相应字段的Offset, 值, 相关解释. 第二步,移植到目标平台 这里关键点是注意 Big-Endian

(转)FFMPEG:H264解码-SDL显示(RGB32、RGB24、YUV420P、YUV422)

FFMpeg对视频文件进行解码的大致流程 1. 注册所有容器格式: av_register_all()2. 打开文件: av_open_input_file()3. 从文件中提取流信息: av_find_stream_info()4. 穷举所有的流,查找其中种类为CODEC_TYPE_VIDEO5. 查找对应的解码器: avcodec_find_decoder()6. 打开编解码器: avcodec_open()7. 为解码帧分配内存: avcodec_alloc_frame()8. 不停地从码

TS流解码过程-ES-PES-PTS-DTS

转载自http://blog.chinaunix.net/uid-9688646-id-1998407.html TS 流解码过程: 1. 获取TS中的PAT 2. 获取TS中的PMT 3. 根据PMT可以知道当前网络中传输的视频(音频)类型(H264),相应的PID,PCR的PID等信息. 4. 设置demux 模块的视频Filter 为相应视频的PID和stream type等. 5. 从视频Demux Filter 后得到的TS数据包中的payload 数据就是 one piece of

ffmpeg音频编码

在弄音频采集时,需要设置缓存的大小,如果只是简单的采集和直接播放PCM数据,缓存的大小一般不影响播放和保存. 但是,如果需要使用FFMpeg音频编码,这时,音频缓存的大小必须设置av_samples_get_buffer_size函数返回的大小.以下是几点注意的 1. m_pFrame = av_frame_alloc();m_pFrame->format = ffSampleFormat;m_pFrame->nb_samples = nSampleRate;//帧的大小 2. m_nBuff

使用ffmpeg视频编码过程中踩的一个坑

今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,很多时候一旦思维定势真的挺难突破的.下面是不正确的编码结果: 使用ffmpeg做视频编码过程中,首先要新建数据帧,并为数据帧分配相应内存,以便于保存图像数据,为数据帧分配内存需要用到av_image_alloc()这个函数,该函数将根据传入的图像宽.高.图像格式.数据对齐基数等参数进行内存分配. 这其中有一个参数可能会让人迷惑,那就是数据对齐基数这个参数该设置多少?顺便说说为什么要数据对齐,之所以要对齐,主要