Как объединить (Mix) два стерео mp3 аудио файла

У меня есть два стереофайла: 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

Решение

Вы можете достичь этого, выполнив следующие действия:

  1. Расшифруйте файлы 1.mp3 и 2.mp3

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

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

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

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

  6. Конвертировать файл 3.wav в формат файла 3.mp3

Выполнение этих шагов требует, чтобы вы знали:

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

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

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

  • Как конвертировать WAV в mp3

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

0

Другие решения

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

0

По вопросам рекламы [email protected]