obs之lame编码
来源:互联网 发布:贝尔野外求生刀数据 编辑:程序博客网 时间:2024/05/16 15:43
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 streaming lame_set_VBR(lgf, vbr_off); lame_set_brate(lgf, bitRate); lame_init_params(lgf); outputFrameSize = lame_get_framesize(lgf); //1152 usually dwMP3MaxSize = 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);}
阅读全文
0 0
- obs之lame编码
- obs之libfaac编码
- obs之libx264编码
- ffmpeg开发之旅(4):MP3编码格式分析与lame库编译封装
- ffmpeg开发之旅(4):MP3编码格式分析与lame库编译封装
- LAME
- LAME
- Android NDK之Lame初探
- c#利用lame.exe实现mp3编码
- LAME-MP3编码引擎(音频)
- struts标签之浅入深出 OBS
- OBS源码分析之rtmp
- Android多媒体之LAME MP3录音转换
- OBS源码分析之render_video处理流程
- Visual Studio下用LAME将wav编码为mp3
- WBS、控制账户、管理控制点、账户编码、OBS、RBS
- lame音频压缩解码(二)之编译事例Demo
- Android JNI开发之使用Lame将录音转MP3
- jquery中绑定事件(on,bind,delegate,live)详解
- TWS API 97.3 python3.6 出现 decode错误
- springmvc源码分析系列-请求处理流程
- day4_字符串的两头堵模型
- 重新运行explorer.exe
- obs之lame编码
- 【读书笔记】Android源码设计模式解析与实战(三)——建造者模式(Builder)
- git分支(branch)操作相关命令
- 文件下载中文文件名不显示
- Linux下查看文件内容的命令
- node.js——麻将算法(四)胡牌算法的一些优化处理方案(无赖子版)
- Axis2开发WebService客户端 的3种方式
- 内存优化
- 利用 Global mapper制作地图瓦片