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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php数据类型_PHP数据类型能力问题和解答

php数据类型This section contains Aptitude Questions and Answers on PHP Data Types. 本节包含有关PHP数据类型的 Aptitude问题和解答。 1) There are the following statements that are given below, which of them are correct about data types in PHP? In PHP, varia…

WPF 使用NotifyIcon控件

转载自&#xff1a;https://www.cnblogs.com/celery94/archive/2010/10/26/1861371.html 1.在什么地方找到NotifyIcon 普通的WPF控件基本上都是在该命名空间下&#xff1a;System.Windows.Controls&#xff0c;该命名空间在C:\Program Files\Reference Assemblies\Microsoft\…

SpringBoot 中 4 大核心组件,你了解多少?

Spring Boot 中的 4 大组件分别是&#xff1a;Spring Boot Starter、Spring Boot Autoconfigure、Spring Boot CLI 以及 Spring Boot actuator&#xff0c;接下来&#xff0c;我们分别来看他们的使用和作用。1.Spring Boot Starter1.1 Starter的应用示例<dependency><…

cache命令小结

鉴于健忘症&#xff0c;将常用的cache操作记录下来&#xff0c;便于查询&#xff1a;1、ttcurl -X PUT http://192.168.1.102:14010/dlytest -d "dlytest"curl -X DELETE http://192.168.1.105:15002/2156F298FDD458C321A30B7D26F98E6D 2、memcacheset 命令用于向缓存…

Python operator.truth()函数与示例

operator.truth()函数 (operator.truth() Function) operator.truth() function is a library function of operator module, it is used to check whether the given value is a true/truthy value or not, it returns True if the given value is a true/truthy value, False…

WPF 代码设置NotifyIcon图标

以前做Winform窗口的时候&#xff0c;设置图标非常简便&#xff0c;用WPF还是有区别的。 notifyIcon1.Icon new Icon(System.Windows.Application.GetResourceStream(new Uri("Images/Icon/Moana.ico", UriKind.Relative)).Stream);

双重检查锁,原来是这样演变来的,你了解吗

最近在看Nacos的源代码时&#xff0c;发现多处都使用了“双重检查锁”的机制&#xff0c;算是非常好的实践案例。这篇文章就着案例来分析一下双重检查锁的使用以及优势所在&#xff0c;目的就是让你的代码格调更加高一个层次。同时&#xff0c;基于单例模式&#xff0c;讲解一下…

Linux学习之FTP服务

环境&#xff1a;red hat6.5安装包&#xff1a;vsftp、ftp服务器主配置文件&#xff1a;/etc/vsftpd/vsftpd.conf主配置参数&#xff1a;anonymous_enableYES //&#xff08;默认&#xff09;允许匿名登录anon_upload_enableYES //允许匿名上传文件anon_mkdir_write_enableYES …

WakaTime 记录你的时间(Moana 自动同步信息客户端)

X、写在前面 代码界有一神器&#xff0c;可以记录敲代码的时间&#xff0c;项目名称&#xff0c;编译器等信息&#xff0c;可以极大的满足程序员的虚荣心&#xff0c;它就是 WakaTime 网站链接 WakaTime 可以记录敲代码时间&#xff0c;和具体编辑的文件等信息&#xff0c;并…

图解:为什么非公平锁的性能更高?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在 Java 中 synchronized 和 ReentrantLock 默认使用的都是非公平锁&#xff0c;而它们采用非公平锁的原因都是一致的&#…

java timezone_Java TimeZone setDefault()方法与示例

java timezoneTimeZone类的setDefault()方法 (TimeZone Class setDefault() method) setDefault() method is available in java.util package. setDefault()方法在java.util包中可用。 setDefault() method is used to assign the default time zone which is retrieved by us…

5.2 测试计划和估算

5.2 测试计划和估算 2015-06-23 5.2.2. 测试计划活动&#xff08;K3&#xff09; 对整个系统或部分系统可能的测试计划活动包括&#xff1a; 确定测试的范围和风险&#xff0c;明确测试的目标&#xff1b;定义测试的整体方法&#xff08;测试策略&#xff09;&#xff0c;包括测…

Android 模拟器调试的缺点

1.模拟器调试速度太慢&#xff0c;不能清晰真实反映开发中的问题。 2.安卓定制化现象严重&#xff0c;模拟器达不到真机的真实水平&#xff0c;如控件样式、分辨率。 3.模拟器不能模拟所有的API&#xff0c;如Email、电话、短信、横竖屏、GPS、蓝牙、多点触控、震动、服务等基…

java timezone_Java TimeZone getDefault()方法与示例

java timezoneTimeZone类的getDefault()方法 (TimeZone Class getDefault() method) getDefault() method is available in java.util package. getDefault()方法在java.util包中可用。 getDefault() method is used to return the default time zone for this host. getDefaul…

死锁的 4 种排查工具 !

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone死锁&#xff08;Dead Lock&#xff09;指的是两个或两个以上的运算单元&#xff08;进程、线程或协程&#xff09;&#xff0c;都在等待…

搜索百度百科官方创建入口,怎么创建更新公司的百度百科词条呢?

在百度搜索百度百科找到百度百科官方创建入口&#xff0c;可以上传并创建公司类的百度百科词条&#xff0c;创建词条后还可以再修改更新百科词条&#xff0c;最终完善好的百度百科词条将会在百度上获得大量曝光。那么百度百科可以怎么创建&#xff0c;下面洛希爱做百科网把十多…

【HM】第2课:JavaScript基础

<pre>day02第一天的内容&#xff1a;*html标签里面的表单标签*html标签里面的表格标签思维导图1、JavaScript的简介* 什么是JavaScript&#xff1a;js是一个基于对象和事件驱动的语言&#xff0c;应用客户端。**基于对象&#xff1a;在java里面如果使用对象需要创建&…

Nginx For Windows 关于 worker_connections 不生效问题

○、结论 Nginx For Windows 建议使用 http://nginx-win.ecsds.eu/ 下载 nginx 1.17.0.1 Crow 一、起因 项目中有一个 API 服务&#xff0c;对客户端通信进行支持&#xff0c;大概 1w 客户端&#xff0c;每分钟都会进行通信。 高峰期的时候服务负载较高&#xff0c;为了防…

你没有见过的 7 种 for 循环优化,超好用!

来源&#xff1a;blog.csdn.net/csdn_aiyang/article/details/75162134我们都经常使用一些循环耗时计算的操作&#xff0c;特别是for循环&#xff0c;它是一种重复计算的操作&#xff0c;如果处理不好&#xff0c;耗时就比较大&#xff0c;如果处理书写得当将大大提高效率&…

java valueof_Java Short类valueOf()方法及示例

java valueofSyntax: 句法&#xff1a; public static Short valueOf (short value);public static Short valueOf (String value);public static Short valueOf (String value, int radixs);简短的类valueOf()方法 (Short class valueOf() method) valueOf() method is avail…