Как объединить (Mix) два стерео mp3 аудио файла - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть два стереофайла: 1.mp3, 2.mp3 Я хочу объединить эти два аудиофайла особым образом

с этим кодом, я могу объединить их так 3.mp3 содержит данные обоих файлов, когда я играю 3.mp3 Он воспроизводит 1.mp3 , а затем 2.mp3 без перерыва

#include <windows.h>


INT ReadMyFile(LPCWSTR lpcszFilePath, PBYTE* pbytReadBuffer, DWORD* dwSize)
{
    HANDLE hndlRead;
    OVERLAPPED ol = {0};
    BOOL bRetValCheck;
    INT nReturnValue = TRUE;

    hndlRead = CreateFileW(lpcszFilePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hndlRead != INVALID_HANDLE_VALUE)
    {
        *dwSize = GetFileSize(hndlRead, NULL);
        *pbytReadBuffer = (PBYTE) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, *dwSize);

        if (pbytReadBuffer != NULL)
        {
            bRetValCheck = ReadFile(hndlRead, *pbytReadBuffer, *dwSize, NULL, &ol);

            if (!bRetValCheck)
            {
                nReturnValue = FALSE;
                HeapFree(GetProcessHeap(), 0, pbytReadBuffer);
            }
        }
        else
        {       
            nReturnValue = FALSE;
        }
        CloseHandle(hndlRead);
    }
    else
    {
        nReturnValue = FALSE;
    }   
    return nReturnValue;
}
int main()
{
    DWORD dwSiaze_IN = 0;
    DWORD dwSiaze_OUT = 0;
    PBYTE pbytPlainText_IN = NULL;
    PBYTE pbytPlainText_OUT = NULL;
    PBYTE pOutputBuffer;
    DWORD dwOutputSize = 0;
    DWORD dwBytesWritten;
    HANDLE hndlWrite;

    if (ReadMyFile(L"1.mp3", &pbytPlainText_IN, &dwSiaze_IN) && ReadMyFile(L"2.mp3", &pbytPlainText_OUT, &dwSiaze_OUT))
    {

        dwOutputSize = dwSiaze_IN + dwSiaze_OUT;
        pOutputBuffer = (PBYTE) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwOutputSize);

        int i = 0;
        // For mp3 Header
        for (i=0; i<11; i++)
        {
            pOutputBuffer[i] = pbytPlainText_IN[i];
        }

        for (i=11; i<dwOutputSize/2; i++)
        {
            pOutputBuffer[i] = pbytPlainText_IN[i];
        }
        int tmp = 11;
        for (i=dwOutputSize/2; i<dwOutputSize; i++)
        {
            pOutputBuffer[i] = pbytPlainText_OUT[tmp];
            tmp++;
        }

        hndlWrite = CreateFileW(L"3.mp3", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if (hndlWrite != INVALID_HANDLE_VALUE)
        {
            SetFilePointer(hndlWrite, 0, 0, FILE_END);
            WriteFile(hndlWrite, pOutputBuffer, dwOutputSize, &dwBytesWritten, NULL);
            CloseHandle(hndlWrite);
        }
    }
    return 0;
}

Но я хочу синхронизировать данные ...

Я хочу, чтобы 3.mp3 был стереофайлом с 1..mp3 в левом канале и 2.mp3 в правом канале

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

mp3 - сжатые аудиоданные.Вы не можете напрямую смешивать их с помощью файловых операций.Единственное, что вы можете сделать, это использовать библиотеку ffmpeg, чтобы конвертировать mp3 в raw PCM, смешивать каналы и затем конвертировать их обратно в mp3.

0 голосов
/ 19 декабря 2018

Это можно сделать, выполнив следующие действия:

  1. Декодирование файлов 1.mp3 и 2.mp3

  2. Сохранение декодированных необработанных данных (в различных форматированных файлах WAVE или в памяти)

  3. Замена значений первого или второго канала необработанных данных в формате 1.mp3 на значения первого или второго канала исходных данных в формате 2.mp3 по одному (обратите внимание, что это приводит к потере качества звука)

  4. Построить заголовок WAVE (формат необработанных аудиоданных) на основе объединенных функций аудиоданных

  5. СоздатьWAVE-форматированный 3.wav-файл с использованием встроенного WAVE-заголовка и объединенных аудиоданных

  6. Преобразование 3.wav-файла в формат 3.mp3

Doingэти шаги требуют, чтобы вы знали:

  • Как декодировать mp3-файлы для получения необработанных данных

  • Как манипулировать байтами данных в буфере

  • Формат звукового файла WAVE

  • Как преобразовать WAV в MP3

Для декодирования и кодирования аудиофайлов в различных форматах вы можете использовать подходящую звуковую библиотеку (например, BASS ) - это поможет вам выполнить шаги 1 и 6.Для создания форматированных аудиоданных WAVE вы должны быть знакомы с форматом файла WAVE и с тем, как каналы аудиоданных выровнены в буфере - это поможет вам выполнить 3, 4 и 5 шагов

...