obs源码之libaac编码。

#include "Main.h"#include "../libfaac/include/faac.h"//AAC is pretty good, I changed my  mind
class AACEncoder : public AudioEncoder
{UINT curBitRate;bool bFirstPacket;faacEncHandle faac;DWORD numReadSamples;DWORD outputSize;List<float> inputBuffer;List<BYTE>  aacBuffer;List<BYTE>  header;List<DWORD> bufferedTimestamps;DWORD curEncodeTimestamp;bool bFirstFrame;public:AACEncoder(UINT bitRate){curBitRate = bitRate;faac = faacEncOpen(44100, 2, &numReadSamples, &outputSize);//Log(TEXT("numReadSamples: %d"), numReadSamples);aacBuffer.SetSize(outputSize+2);aacBuffer[0] = 0xaf;aacBuffer[1] = 0x1;faacEncConfigurationPtr config = faacEncGetCurrentConfiguration(faac);config->bitRate = (bitRate*1000)/2;config->quantqual = 100;config->inputFormat = FAAC_INPUT_FLOAT;config->mpegVersion = MPEG4;config->aacObjectType = LOW;config->useLfe = 0;config->outputFormat = 0;int ret = faacEncSetConfiguration(faac, config);if(!ret)CrashError(TEXT("aac configuration failed"));BYTE *tempHeader;DWORD len;header.SetSize(2);header[0] = 0xaf;header[1] = 0x00;faacEncGetDecoderSpecificInfo(faac, &tempHeader, &len);header.AppendArray(tempHeader, len);free(tempHeader);bFirstPacket = true;bFirstFrame  = true;Log(TEXT("------------------------------------------"));Log(TEXT("%s"), GetInfoString().Array());}~AACEncoder(){faacEncClose(faac);}bool Encode(float *input, UINT numInputFrames, DataPacket &packet, DWORD ×tamp){if(bFirstFrame){curEncodeTimestamp = timestamp;bFirstFrame = false;}//------------------------------------------------DWORD curTimestamp = timestamp;UINT lastSampleSize = inputBuffer.Num();UINT numInputSamples = numInputFrames*2;inputBuffer.AppendArray(input, numInputSamples);int ret = 0;if(inputBuffer.Num() >= numReadSamples){//now we have to upscale the floats.  fortunately we almost always have SSEUINT floatsLeft  = numReadSamples;float *inputTemp = inputBuffer.Array();if(App->SSE2Available() && (UPARAM(inputTemp) & 0xF) == 0){UINT alignedFloats = floatsLeft & 0xFFFFFFFC;for(UINT i=0; i<alignedFloats; i += 4){float *pos = inputTemp+i;_mm_store_ps(pos, _mm_mul_ps(_mm_load_ps(pos), _mm_set_ps1(32767.0f)));}floatsLeft &= 0x3;inputTemp  += alignedFloats;}if(floatsLeft){for(UINT i=0; i<floatsLeft; i++)inputTemp[i] *= 32767.0f;}ret = faacEncEncode(faac, (int32_t*)inputBuffer.Array(), numReadSamples, aacBuffer.Array()+2, outputSize);if(ret > 0){if(bFirstPacket){bFirstPacket = false;ret = 0;}else{packet.lpPacket = aacBuffer.Array();packet.size     = ret+2;timestamp = bufferedTimestamps[0];bufferedTimestamps.Remove(0);}}else if(ret < 0)AppWarning(TEXT("aac encode error"));inputBuffer.RemoveRange(0, numReadSamples);bufferedTimestamps << curEncodeTimestamp;curEncodeTimestamp = curTimestamp + (((numReadSamples-lastSampleSize)/2)*10/441);}return ret > 0;}UINT GetFrameSize() const{return 1024;}void GetHeaders(DataPacket &packet){packet.lpPacket = header.Array();packet.size = header.Num();}int GetBitRate() const {return curBitRate;}CTSTR GetCodec() const {return TEXT("AAC");}String GetInfoString() const{String strInfo;strInfo << TEXT("Audio Encoding: AAC")  <<TEXT("\r\n    bitrate: ") << IntString(curBitRate);return strInfo;}
};AudioEncoder* CreateAACEncoder(UINT bitRate)
{return new AACEncoder(bitRate);
}

obs之libfaac编码相关推荐

  1. obs之lame编码

    obs之lame编码. #include "Main.h"#include "../lame/include/lame.h"const int audioBlo ...

  2. obs自定义编码设置_通过7个步骤设置OBS进行实时编码

    obs自定义编码设置 by Wesley McCann 韦斯利·麦肯(Wesley McCann) 通过7个步骤设置OBS进行实时编码 (Setting up OBS for Live Coding ...

  3. obs之libx264编码

    obs中使用libx264编码的例子,包含了动态设置码率. #include "Main.h"#include <inttypes.h> #include <ws ...

  4. 【obs】转载:OBS直播严重延迟和卡顿怎么办?

    大神们对rtmp推流做了讨论和分享 GOP设置2秒 保利威 的知乎专栏 保利威 从推流到播放,会引入延迟的环节有编码延迟.网络丢包和网络抖动.视频的分段传输.节点.播放器的缓存等等. 由于RTMP基于 ...

  5. 【obs-studio开源项目从入门到放弃】video_thread 视频编码线程理解

    文章目录 前言 1.视频编码线程的创建时机 video_output_open函数创建视频编码线程 2.视频编码线程的工作内容 video_output_cur_frame 线程真正的工作函数 详细解 ...

  6. OBS真正无延迟直播方案被我找到了

    当你看到这篇文章的时候,相信你也经历着我几个月以来遇到的难题.这都5G兴起元宇宙大火的时代了,怎么直播还有那么大的延迟,少则几秒多则几十秒,特别是手机观看那直播延迟,简直受不了. 在讲OBS无延迟方案 ...

  7. ffmpeg文档16-音频编码器

    16 音频编码器 介绍当前可用的音频编码器 aac AAC(Advanced Audio Coding )编码器 当前原生(内置)编码器还处于实验阶段,而且只能支持AAC-LC(低复杂度AAC).要使 ...

  8. ROS2学习笔记(三)-- 采集虚拟仿真环境图像并发布

    简介:ROS2功能的学习我们还是在基于OpenAI的gym虚拟仿真环境中来完成,gym虚拟仿真环境安装请参考另一篇教程,这里不再重复说明,接下来我们开始创建一个ROS2的功能节点,并发布虚拟仿真环境小 ...

  9. 窄带高清画质增强之生成式细节修复

    作者:兮墨 阿里云窄带高清本质上是一种转码质量优化技术,是一套以人眼的主观感受最优为基准的视频编码技术,研究的是在带宽受限的情况下,如何追求最佳的视觉感受,即人眼感受的主观质量最优.而画面质量提升则是 ...

最新文章

  1. Java学习笔记19
  2. Spring中日期格式转换
  3. 什么是 SAP Spartacus 里的 module augmentation
  4. c# 爬虫 -ChromeDriver+HtmlAgilityPack爬取比赛实时比分
  5. java 和javafx_Java,JavaFX的流利设计风格文本字段和密码字段
  6. Qt工作笔记-视图/模型以及过滤代理模型的使用
  7. C#设计学生成绩排序
  8. Hadoop集群启动时NameNode未启动解决方法
  9. spring-第十三篇之零配置支持
  10. php网络图片拼接,图片处理 - PHP图片拼接如何高效的实现
  11. Android热更新详解
  12. Java - JIT即时编译器
  13. [TJOI2013]松鼠聚会【切比雪夫距离转换曼哈顿距离】
  14. 机器学习深度学习 常用算法推导
  15. 迪士尼正在寻找一个区块链实习生
  16. 全文检索-Elasticsearch安装、集群和使用超全解读
  17. 华为信息中心配置命令,很全
  18. 【小白看世界】PDA软件开发是什么?
  19. 王桂林讲C++之友元
  20. 深入理解滤波器!降噪的底层原理!滤波器到底是什么?

热门文章

  1. 关于float的内部结构
  2. 关于文件上传,我要向struts提点意见
  3. 留存光明延续大爱 80后父母捐病儿角膜感动冰城
  4. 如何实施域控制器活动目录备份与恢复
  5. java一维数组的使用_Java初步认知和使用一维数组
  6. java 文件名乱码_详解关于java文件下载文件名乱码问题解决方案
  7. mysql自动化巡检_mysql自动化巡检脚本生成html报告
  8. 乔治华盛顿计算机科学,乔治华盛顿大学计算机科学
  9. 解决react状态管理---React Query
  10. 5工程添加emwin库_手把手教你打造专属自己的远程私有库——上