obs之lame编码。

#include "Main.h"#include "../lame/include/lame.h"const int audioBlockSize = 4; //output is 2 16bit channelsstruct AACDataPacket
{List<BYTE> Packet;inline void FreeData() {Packet.Clear();}
};//lame is not lame..  it's godly.
class MP3Encoder : public AudioEncoder
{lame_global_flags *lgf;List<BYTE> MP3OutputBuffer;List<BYTE> header;DWORD dwMP3MaxSize;bool bFirstPacket;UINT outputFrameSize;UINT curBitRate;List<DWORD> bufferedTimestamps;DWORD curEncodeTimestamp;DWORD frameCounter;bool bFirstFrame;public:MP3Encoder(UINT bitRate){curBitRate = bitRate;lgf = lame_init();if(!lgf)CrashError(TEXT("Unable to open mp3 encoder"));lame_set_in_samplerate(lgf, 44100);lame_set_out_samplerate(lgf, 44100);lame_set_num_channels(lgf, 2);lame_set_mode(lgf, STEREO);lame_set_disable_reservoir(lgf, TRUE); //bit reservoir has to be disabled for seamless streaminglame_set_VBR(lgf, vbr_off);lame_set_brate(lgf, bitRate);lame_init_params(lgf);outputFrameSize = lame_get_framesize(lgf); //1152 usuallydwMP3MaxSize = DWORD(1.25*double(outputFrameSize*audioBlockSize) + 7200.0);MP3OutputBuffer.SetSize(dwMP3MaxSize+1);MP3OutputBuffer[0] = 0x2f;bFirstPacket = true;Log(TEXT("------------------------------------------"));Log(TEXT("%s"), GetInfoString().Array());}~MP3Encoder(){lame_close(lgf);}bool Encode(float *input, UINT numInputFrames, DataPacket &packet, DWORD ×tamp){if(bFirstFrame){curEncodeTimestamp = timestamp;bFirstFrame = false;}//------------------------------------------------UINT lastSampleSize = frameCounter;frameCounter += numInputFrames;if(frameCounter > outputFrameSize){frameCounter -= outputFrameSize;bufferedTimestamps << curEncodeTimestamp;curEncodeTimestamp = timestamp + ((outputFrameSize-lastSampleSize)*10/441);}int framenum1 = lame_get_frameNum(lgf);int ret = lame_encode_buffer_interleaved_ieee_float(lgf, (float*)input, numInputFrames, MP3OutputBuffer.Array()+1, dwMP3MaxSize);int framesEncoded = lame_get_frameNum(lgf)-framenum1;if(ret < 0){AppWarning(TEXT("MP3 encode failed"));return false;}if(ret > 0){if(bFirstPacket){header.CopyArray(MP3OutputBuffer.Array(), ret);bFirstPacket = false;ret = 0;}else{packet.lpPacket = MP3OutputBuffer.Array();packet.size     = ret+1;timestamp = bufferedTimestamps[0];bufferedTimestamps.Remove(0);}}return ret > 0;}UINT GetFrameSize() const{return outputFrameSize;}void GetHeaders(DataPacket &packet){packet.lpPacket = header.Array();packet.size = header.Num();OSDebugOut(TEXT("testing, 123\r\n"));}int GetBitRate() const {return curBitRate;}CTSTR GetCodec() const {return TEXT("MP3");}String GetInfoString() const{String strInfo;strInfo << TEXT("Audio Encoding: MP3") <<TEXT("\r\n    bitrate: ") << IntString(curBitRate);return strInfo;}
};AudioEncoder* CreateMP3Encoder(UINT bitRate)
{return new MP3Encoder(bitRate);
}

obs之lame编码相关推荐

  1. Android音视频开发入门(5)使用LAME编码一个PCM文件,为了跳槽强刷1000道Android真题

    无论是自行安装PC上的编译器,还是下载其他平台的交叉编译链,它们都会提供下面几个工具: CC 编译器,对C源文件进行编译处理,生成汇编文件 AS 将汇编文件生成目标文件 AR 打包器,用于库操作 LD ...

  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之libfaac编码

    obs源码之libaac编码. #include "Main.h"#include "../libfaac/include/faac.h"//AAC is pr ...

  5. 音视频编解码技术之音频编码基本概念介绍

    音频编码基本概念介绍 自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码.PCM通过抽样.量化.编码三个步骤将连续变化的模拟信号转换为数字编码. 1-1 什么是采样率 ...

  6. sox和lame音频处理器

    前两天想在ubuntu上录个音频文件,无意发现了一个有趣的音频处理器sox sudo apt-get install sox 先安装了sox之后发现有些文件不能play (比如mp3) sudo ap ...

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

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

  8. 音频编码和视频编码基础

    音频编码和视频编码基础 1 音频数字化 1.1 PCM 1.2 音频编码方式 2 视频数字化 2.1 RGB/YUV 2.2 视频编码方式 2.3 编码中的重要概念 1 音频数字化 1.1 PCM 音 ...

  9. LAME应用教学--HIFI级MP3制作之路

    HIFI级MP3?可能吗?LAME又是什么?看完全文就会知道,不过,在此之前,还是先普及一下MP3基本知识,不然大家或许会不明白. 一.MP3家史 mp3全名是mpeg audio layer iii ...

最新文章

  1. Ext UI 第一步
  2. oracle 11g 大小,修改oracle 11GR2归档模式和归档目录及大小-Oracle
  3. 定时任务:Java中Timer和TimerTask的使用
  4. 职业技术学校计算机专业部教师,江安职校计算机专业部召开第二次全体教师大会...
  5. 为什么要使用 using namespace std
  6. Linux下scp命令的用法
  7. 微软“.Net社区虚拟大会”dotnetConf2015:关键词:.NET 创新、开源、跨平台
  8. python安装与配置虚拟环境包_python 虚拟环境配置及pypi包使用及包怎么
  9. db.serverStatus()
  10. 一以贯之是一个思想家成熟的标志
  11. ad中电容用什么封装_【AD封装】贴片插件晶振(带3D)
  12. 2921年3月计算机二级office,国家二级计算机考试office怎么报名
  13. SAP 入门学习途径——官方工具使用
  14. Web 中的“选区”和“光标”需求实现
  15. TB-RK1808M0最新固件烧录和驱动更新
  16. Python小学生课程学哪些内容?
  17. Maven –如何跳过单元测试
  18. 相对寻址方式与变址寻址方式的区别与联系
  19. c++ private、protect、public、virtual详细说明***
  20. 业务逻辑漏洞挖掘-某网站绕过下载付费机制进行下载文件

热门文章

  1. PDFBox-convertToImage-type not implemented yet
  2. Scala是多范式编程语言
  3. C++ 领域:游戏、HPC、编译器、金融、财务
  4. oracle中入库判断空串,不同数据库和SpringDataJPA对字段值null,''空值的判断
  5. 【超参数寻优】粒子群算法(PSO) 超参数寻优的python实现
  6. python导入模块的常用方法_(9)python模块的定义、导入、优化,常用模块
  7. linq to sql 行转列_n套SQL面试题--行转列、留存、日活等
  8. 率土之滨显示未选择服务器怎么办,率土之滨未转服,为什么要转服
  9. c语言输入字符串_我们一起学C语言(四)
  10. excel不显示0_【扫盲】小白必看:excel表里数字格式常见的几种错误?