-VCをコードする複数の同時MP3を達成するためにどのようにMP3としてエンコードmp3エンコーディング--PCM転送MP3、PCM、MFCはQQ35744025 ---実現

免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/xjb2006/article/details/78404523

あなたは急いを監視しています

写真をウォームアップしてみましょう、心配しないでください

美しい写真を見てするために使用

チャン孟赤ちゃんへの旅



同時にテストmp3デコーダを達成するために前の記事でも、マルチチャンネルデコードする能力を持っています。

これに先立ち、私は動的ライブラリBladeMP3EncDLLエンコードを使用している、実際には、何の問題は、それがマルチスレッドコードではありません。

__declspec(DLLEXPORT)BE_ERRbeInitStream(PBE_CONFIG pbeConfig、PDWORD dwSamples、PDWORD dwBufferSize、PHBE_STREAM phbeStream)。
__declspec(DLLEXPORT)BE_ERR beEncodeChunk(HBE_STREAM hbeStream、DWORD nSamples、PSHORT pSamples、PBYTE POUTPUT、PDWORD pdwOutput)。
//浮動小数点オーディオのために追加- DSPguru、JD
__declspec(DLLEXPORT)BE_ERR beEncodeChunkFloatS16NI(HBE_STREAM hbeStream、DWORD nSamples、PFLOATのbuffer_l、PFLOATのbuffer_r、PBYTE POUTPUT、PDWORD pdwOutput)。
__declspec(DLLEXPORT)BE_ERR beDeinitStream(HBE_STREAM hbeStream、PBYTE POUTPUT、PDWORD pdwOutput)。
__declspec(DLLEXPORT)BE_ERR beCloseStream(HBE_STREAM hbeStream)。
__declspec(DLLEXPORT)VOID beVersion(PBE_VERSION pbeVersion)。
__declspec(DLLEXPORT)BE_ERR beWriteVBRHeader(LPCSTR lpszFileName)。
__declspec(DLLEXPORT)BE_ERR beFlushNoGap(HBE_STREAM hbeStream、PBYTE POUTPUT、PDWORD pdwOutput)。
__declspec(DLLEXPORT)BE_ERR beWriteInfoTag(HBE_STREAM hbeStream、LPCSTR lpszFileName)。

実際には、それを行うことができますマルチスレッドの仕事は、あまりにも面倒、複数のコピーのDLLで、DLLをロード符号化です。255場合は、それはあまりにも処女としてピットの父、それを!!!である255枚のコピーを、コピーする必要がある、私は、ああ、舌の滑りは、乙女座は、私が容認されることはありません。さて、次回、本当にたくさんのではなく、その場を見つけるために、オンラインでそれを自分で書きます。最後に、元の作者があまりにも多くのグローバルまたは静的なものが追加されるため、LAMEエンコーダをもとに良いパッケージ、単一のコードをサポートすることができ、我々は推定値が大きな頭を持っている複数の同時エンコードを変更するようでした。

私たちは、オーディオやビデオ、写真など、非常に強力ために処理、IPPとそれは、インテル®IPPは、効率的なメディアライブラリで提供されていることを、何か他のものを試してみました。

私は入力したくて、それのコードポイントを掲載しません。

/ * //////////////////////////////////////////////// //////////////////////////////
//
//インテルコーポレーション専有情報は、
//このソフトウェアは、ライセンスの条件の下で供給され、契約または
インテルコーポレーションと//機密保持契約とはコピーされないことがあります
//またはその契約の条件に従う場合を除き開示します。
//著作権(C)2002から2008インテルコーポレーション。全著作権所有。
//
* /


の#include "umc_defs.h"
に定義(UMC_ENABLE_MP3_AUDIO_ENCODER)の#if


#ifndefの__UMC_MP3_ENCODER_H__
の#define __UMC_MP3_ENCODER_H__


の#include "umc_media_data.h"
の#include "umc_audio_codec.h"
#include "audio_codec_params.h"
の#include "mp3_status.hは"


_MP3Encをストラクト。


名前空間UMC {




/ * //////////////////////////////////////////////// /////////////////////////////
//クラス:MP3Encoder
//
//注:MPEG-I層3エンコーダの実装。
//
* /
クラスMP3Encoder:公共AudioCodec 
{


パブリック:


仮想ステータス初期化(BaseCodecParamsが* INIT)。
クローズ仮想ステータス();


仮想ステータス関数getframe(MediaData、中MediaData * *アウト)。
仮想ステータス関数getframe(charは*で、nInLen、char型int型*アウト、INT&nOutLen)。


仮想ステータスGetInfoは(BaseCodecParamsが* INIT)。
仮想ステータスGetDuration(Ipp32f *のp_duration)。


MP3Encoder(無効)。
仮想〜MP3Encoder();


仮想ステータスSetParamsメソッド(BaseCodecParams *のparams);
仮想ステータスリセット();


仮想IppBool CheckBitRate(Ipp32s sample_rate、
Ipp32s層、
Ipp32sビットレート、
Ipp32sステレオ)。


保護されました:
構造体_MP3Enc *状態。
Ipp32s m_stereo;
Ipp32s m_freq;
Ipp32s m_layer;
Ipp32s m_bitrate;
Ipp32s m_br_mode;
Ipp32s m_stereo_mode;
Ipp32s m_ns_mode;
Ipp32s M_ID;
Ipp32s m_frame_size;
Ipp32s m_upsample;
Ipp32s m_force_mpeg1;
Ipp32s m_mc_matrix_procedure;
Ipp32s m_mc_lfe_filter_off;
Ipp64fのm_pts_prev。
MemID stateMemId;
Ipp32sはm_initialized。


ステータスStatusMP3_2_UMC(MP3Status ST);
ステータスMemLock();
ステータスMemUnlock();
}。


}。//名前空間UMC


の#endif / * __UMC_MP3_ENCODER_H__ * /


#endifの// UMC_ENABLE_MP3_AUDIO_ENCODER

私は、プロセスが非常に困難である、OCXにパッケージが、最終的に成功してきました。クスクス笑いする陰スイング笑い

#pragma once
#include "Mp3Enc.h"


// Mp3encoderCtrl.h : CMp3encoderCtrl ActiveX 控件类的声明。




// CMp3encoderCtrl : 有关实现的信息,请参阅 Mp3encoderCtrl.cpp。


class CMp3encoderCtrl : public COleControl
{
DECLARE_DYNCREATE(CMp3encoderCtrl)


// 构造函数
public:
CMp3encoderCtrl();


// 重写
public:
virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid);
virtual void DoPropExchange(CPropExchange* pPX);
virtual void OnResetState();


// 实现
protected:
~CMp3encoderCtrl();


DECLARE_OLECREATE_EX(CMp3encoderCtrl)    // 类工厂和 guid
DECLARE_OLETYPELIB(CMp3encoderCtrl)      // GetTypeInfo
DECLARE_PROPPAGEIDS(CMp3encoderCtrl)     // 属性页 ID
DECLARE_OLECTLTYPE(CMp3encoderCtrl)// 类型名称和杂项状态


// 消息映射
DECLARE_MESSAGE_MAP()


// 调度映射
DECLARE_DISPATCH_MAP()


afx_msg void AboutBox();


// 事件映射
DECLARE_EVENT_MAP()


// 调度和事件 ID
public:
enum {
dispidFreeAll = 5L,
dispidClose = 4L,
dispidEncode = 3L,
dispidInit = 2L,
dispidInitCount = 1L
};


#define MP3COUNT 300
protected:
int m_nCount;
CMp3Enc *m_mp3[MP3COUNT];
void InitCount(LONG nCount);
void Init(LONG nIndex, LONG sample_frequency, LONG channel, LONG bitrate);
LONG Encode(LONG nIndex, BYTE* pInPCM, LONG nPCMLen, BYTE* pOutMp3);
void Close(LONG nIndex);
void FreeAll(void);
};
最多支持300路,当然再多也可以,这个看你自己需要啊,但是太多,多半CPU吃不消吧。。。

最后,贴下编码封装代码

#include "stdafx.h"
#include "Mp3Enc.h"


CMp3Enc::CMp3Enc(void)
{
m_pAudioEncoder=0;
m_pcmen=0;
m_mp3len=0;
int nSize=sizeof(MP3EncoderParams);
}


CMp3Enc::~CMp3Enc(void)
{
Close();
}


void CMp3Enc::Close()
{
if(m_pAudioEncoder)
{
delete m_pAudioEncoder;
m_pAudioEncoder=0;
}
m_pcmen=0;
m_mp3len=0;
}


void CMp3Enc::Init(int sample_frequency,int channel,int bitrate)
{
m_pcmen=0;
m_mp3len=0;
mp3enc_params.m_info_out.bitrate=bitrate;
AudioEncoderParams* par = (AudioEncoderParams*)(&mp3enc_params);

par->m_info.channel_mask = 0;
par->m_info.bitPerSample=16;
par->m_info.channels=channel;
par->m_info.sample_frequency=sample_frequency;
par->m_info.bitrate=bitrate;
par->m_info.stream_type=PCM_AUDIO;
m_pAudioEncoder=new MP3Encoder();
m_pAudioEncoder->Init(par);
}


BYTE* CMp3Enc::EncodeMp3(BYTE * in,int nInLen,int &nOutLen)
{
if(m_pcmen+nInLen<=sizeof(PCMBuf))
{
memcpy(PCMBuf+m_pcmen,in,nInLen);
m_pcmen+=nInLen;
}
AudioEncoderParams* par = (AudioEncoderParams*)(&mp3enc_params);
int nApplyPcmLen=2304*par->m_info.channels*par->m_info.sample_frequency/44100;
if(m_pcmen<nApplyPcmLen)//不够
{
nOutLen=0;
return Mp3Buf;
}
int nRead=0;
int nMp3Len=0;
BYTE BufMp3[1024*8];
for(;;)
{
BYTE *p=PCMBuf+nRead;
int nOut=4096;
BYTE *pOut=EncodeMp3_(p,nApplyPcmLen,nOut);
if(nOut>0)
{
memcpy(BufMp3+nMp3Len,pOut,nOut);
nMp3Len+=nOut;
}
nRead+=nApplyPcmLen;
m_pcmen-=nApplyPcmLen;
if(m_pcmen<nApplyPcmLen)
break;

}
if(m_pcmen>0)
memmove(PCMBuf,PCMBuf+nRead,m_pcmen);


nOutLen=nMp3Len;
return BufMp3;

}


BYTE* CMp3Enc::EncodeMp3_(BYTE * in,int nInLen,int &nOutLen)
{
char Buf[1024*4];
int nOut=sizeof(Buf);
try
{
Status s=m_pAudioEncoder->GetFrame((char*)in,nInLen,Buf,nOut);//只能输入2304*2=4608
if(s!=0)
{
nOutLen=0;
return Mp3Buf;
}
}
catch(...)
{
nOutLen=0;
return Mp3Buf;
}


memcpy(Mp3Buf+m_mp3len,Buf,nOut);
m_mp3len+=nOut;
MPADecodeContext ms;
if(m_mp3len)
{
int nReadLen=0;
nOutLen=0;
for(;;)
{
if(nReadLen>m_mp3len)
break;
int nCheck=check_header(*(uint32_t*)(Mp3Buf+nReadLen));
if(nCheck==-1)
break;
int nMp3FrameLen=decode_header(&ms,*(uint32_t*)(Mp3Buf+nReadLen));
if(m_mp3len>=nMp3FrameLen&&nMp3FrameLen>0&&nCheck==0)
{
memcpy(Buf+nReadLen,Mp3Buf+nReadLen,nMp3FrameLen);
nReadLen+=nMp3FrameLen;
m_mp3len-=nMp3FrameLen;
}
else
break;
}
nOutLen=nReadLen;
if(m_mp3len>0)
memmove(Mp3Buf,Mp3Buf+nReadLen,m_mp3len);
}


return (BYTE*)Buf;
}
编码看上去怎么这么复杂,先不害怕,理解好了其实一点也不复杂:

因为为了配合之前做的mp3解码库,解码需要输入完整的一帧或者多帧,我们也就需要这种编码器。编码后是完整的一帧或者多帧。

Status s=m_pAudioEncoder->GetFrame((char*)in,nInLen,Buf,nOut);//这句是核心编码语句,必须输入特定的PCM长度,才能编码成功!(你问我为什么知道,调试啊,经验啊),而这个大小就是下面这个公式计算出来的。

int nApplyPcmLen=2304*par->m_info.channels*par->m_info.sample_frequency/44100;

如输出44100,双声道的mp3,输入大小就是2304*2=4608Byte(下面都是这个参数来表述的哦)

但是不能保证每次输入的都是4608啊,所以,我们开一个全局变量保存PCM数据,没有就等,有4608就编码并输出。OK,输入解决了。再来解决输出吧

,输出我们要保证完整的一帧或者多帧,怎样保证呢,查了下mp3数据结构,(并没有很深入,我喜欢点到为止,并不是什么都要知道,需要什么了解什么,快速解决问题创造效益才是硬道理!),mp3一帧的前4个byte保存了这一帧的声道,采样率,帧大小等信息,所以我们根据这个,可以判断一帧后面的大小,如果编码出来一帧不够417,那么就等下一次编码,下一次累加到上一次的buf。如果编码出来超过417,那就输出完整的一帧或者多帧。看我上面的代码你就明白了。看下输出结果:

MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;16,长度:417
MP3编码时间;16,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;16,长度:417
MP3编码时间;16,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417
MP3编码时间;0,长度:417

标准的417,看上去好美,这一刻,感觉回到了初恋。。。シャイシャイシャイシャイシャイシャイ


行き、そして最終的に広告を作るための時間を見つけるためにコードをアップロードする場合:

協力の必要性は、私が持ってQQ35744025に連絡する作業03年、「堪能」のオーディオおよびビデオアプリケーションプログラミング技術(プラスかろうじて堪能、ハハ、注目を集めるために)VC、MFC、マルチメディア教育ソフト、録画放送ソフトウェア、放送ソフトウェアのコア技術に精通し、ほとんどは、このようなffmpegの技術、MP4、FLV合成コーディング、H264、AAC、MP3など、習得されている、IPPは、効率的な空間変換画像を使用することができ、およびインテルCUDAのハードウェアH264コーデックを使用することができ、リアルタイムエンコーディング240 1080Pを達成することができ、完全同期と滑らか度の高い、変換に精通RTMPライブプッシュ、RTMPサーバー、YV12、YUV422、NV12、RGB24、RGB32、スケーリング、WAV、AAC、MP3コーデック、ビデオトランジションエフェクトアルゴリズム、ビデオ透かし、ロゴ、テキスト。ビデオの画面キャプチャ、ビデオキャプチャカメラ、ビデオ画像、キャプチャカードをD3D効率的、OpenCVの、画像ライブラリのXImage、GDI、GDIPlusの熟練したアプリケーション、音声認識およびテキスト変換、認識やマッチング、LANリモート・コントロール、リアルタイムのオーディオおよびビデオ通話を表示再生には、SQLデータベース、アクセス、EXCELデータベース、DOC、抽出することが開いているPDFファイルに加えて、FTPSERVER、クライアントは、上記のコードの全ては、商業となっています。

ああああああああああああああああああああああああああああああ、ああ、私は本当に彼のああを賞賛、私はたくさんのことを学んできたことを、何の詳細な統計は存在しませんでした




おすすめ

転載: blog.csdn.net/xjb2006/article/details/78404523