obs之libfaac编码
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编码相关推荐
- obs之lame编码
obs之lame编码. #include "Main.h"#include "../lame/include/lame.h"const int audioBlo ...
- obs自定义编码设置_通过7个步骤设置OBS进行实时编码
obs自定义编码设置 by Wesley McCann 韦斯利·麦肯(Wesley McCann) 通过7个步骤设置OBS进行实时编码 (Setting up OBS for Live Coding ...
- obs之libx264编码
obs中使用libx264编码的例子,包含了动态设置码率. #include "Main.h"#include <inttypes.h> #include <ws ...
- 【obs】转载:OBS直播严重延迟和卡顿怎么办?
大神们对rtmp推流做了讨论和分享 GOP设置2秒 保利威 的知乎专栏 保利威 从推流到播放,会引入延迟的环节有编码延迟.网络丢包和网络抖动.视频的分段传输.节点.播放器的缓存等等. 由于RTMP基于 ...
- 【obs-studio开源项目从入门到放弃】video_thread 视频编码线程理解
文章目录 前言 1.视频编码线程的创建时机 video_output_open函数创建视频编码线程 2.视频编码线程的工作内容 video_output_cur_frame 线程真正的工作函数 详细解 ...
- OBS真正无延迟直播方案被我找到了
当你看到这篇文章的时候,相信你也经历着我几个月以来遇到的难题.这都5G兴起元宇宙大火的时代了,怎么直播还有那么大的延迟,少则几秒多则几十秒,特别是手机观看那直播延迟,简直受不了. 在讲OBS无延迟方案 ...
- ffmpeg文档16-音频编码器
16 音频编码器 介绍当前可用的音频编码器 aac AAC(Advanced Audio Coding )编码器 当前原生(内置)编码器还处于实验阶段,而且只能支持AAC-LC(低复杂度AAC).要使 ...
- ROS2学习笔记(三)-- 采集虚拟仿真环境图像并发布
简介:ROS2功能的学习我们还是在基于OpenAI的gym虚拟仿真环境中来完成,gym虚拟仿真环境安装请参考另一篇教程,这里不再重复说明,接下来我们开始创建一个ROS2的功能节点,并发布虚拟仿真环境小 ...
- 窄带高清画质增强之生成式细节修复
作者:兮墨 阿里云窄带高清本质上是一种转码质量优化技术,是一套以人眼的主观感受最优为基准的视频编码技术,研究的是在带宽受限的情况下,如何追求最佳的视觉感受,即人眼感受的主观质量最优.而画面质量提升则是 ...
最新文章
- Java学习笔记19
- Spring中日期格式转换
- 什么是 SAP Spartacus 里的 module augmentation
- c# 爬虫 -ChromeDriver+HtmlAgilityPack爬取比赛实时比分
- java 和javafx_Java,JavaFX的流利设计风格文本字段和密码字段
- Qt工作笔记-视图/模型以及过滤代理模型的使用
- C#设计学生成绩排序
- Hadoop集群启动时NameNode未启动解决方法
- spring-第十三篇之零配置支持
- php网络图片拼接,图片处理 - PHP图片拼接如何高效的实现
- Android热更新详解
- Java - JIT即时编译器
- [TJOI2013]松鼠聚会【切比雪夫距离转换曼哈顿距离】
- 机器学习深度学习 常用算法推导
- 迪士尼正在寻找一个区块链实习生
- 全文检索-Elasticsearch安装、集群和使用超全解读
- 华为信息中心配置命令,很全
- 【小白看世界】PDA软件开发是什么?
- 王桂林讲C++之友元
- 深入理解滤波器!降噪的底层原理!滤波器到底是什么?