簡體   English   中英

C ++:將float []轉換為unsigned char *或BYTE *

[英]C++: Convert float[] to unsigned char* or BYTE*

我正在開發一個項目,我需要將PCM 16位2通道聲音轉換為IEEE Float 32位2通道。

為此,我使用以下代碼:

void CAudioConverter::ConvI16ToF32(BYTE* pcmFrom, BYTE* floatTo, int length)
{
    short* src = reinterpret_cast<short*>(pcmFrom);
    float* dst = reinterpret_cast<float*>(floatTo);
    for (int n = 0; n < length; n++)
    {
        dst[n] = static_cast<float>(src[n]) / 32768.0f;
    }
}

我用以下內容初始化了變量__pcm32_bytesPerFrame:

WAVEFORMATEX* closestFormat;
ws->default_pb_dev->GetMixFormat(&closestFormat);
__pcm32_bytesPerFrame = closestFormat->nAvgBytesPerSec * (prm->samples_per_frame * 1000 / (prm->clock_rate * closestFormat->nChannels)) / 1000;

strm-> pb_max_frame_count是:

hr = ws->default_pb_dev->GetBufferSize(&ws->pb_max_frame_count);

我在專用線程中有一個while循環,它具有以下特點:

hr = strm->default_pb_dev->GetCurrentPadding(&padding);
incoming_frame = __pcm32_bytesPerFrame / 4;
frame_to_render = strm->pb_max_frame_count - padding;
if (frame_to_render >= incoming_frame)
{ 
    frame_to_render = incoming_frame;
} else {
    /* Don't get new frame because there's no space */
    frame_to_render = 0;
}

if (frame_to_render > 0)
{
    pjmedia_frame frame;

hr = strm->pb_client->GetBuffer(frame_to_render, &cur_pb_buf);
if (FAILED(hr)) {
    continue;
}

void* destBuffer = (void*)malloc(strm->bytes_per_frame*frame_to_render*sizeof(pj_uint16_t));

if (strm->fmt_id == PJMEDIA_FORMAT_L16) {



/* PCM mode */
    frame.type = PJMEDIA_FRAME_TYPE_AUDIO;
    frame.size = strm->bytes_per_frame;
    frame.timestamp.u64 = strm->pb_timestamp.u64;
    frame.bit_info = 0;
    frame.buf = destBuffer;
}

status = (*strm->pb_cb)(strm->user_data, &frame);

CAudioConverter* conv = new CAudioConverter();
conv->ConvI16ToF32((BYTE*)destBuffer, cur_pb_buf, frame_to_render);

hr = strm->pb_client->ReleaseBuffer(frame_to_render, 0);
(...)

但是,要將聲音發送到WASAPI捕獲緩沖區,我需要一個BYTE *。 我如何填寫我的'floatTo'參數?

有任何想法嗎?

謝謝

那這個呢:

void CAudioConverter::ConvI16ToF32(BYTE* pcmFrom, BYTE* floatTo, int length)
{
    short* src = reinterpret_cast<short*>(pcmFrom);
    float* dst = reinterpret_cast<float*>(floatTo);
    for (int n = 0; n < length; n++)
    {
        dst[n] = static_cast<float>(src[n]) / 32768.0f;
    }   
}

另外,確保length表示pcmFromfloatTo中的pcmFrom floatTo ,而不是分配的字節數。 在你的情況下, pcmFrom應該有分配length*2字節,而floatTo需要空間length*4字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM