У меня есть два стереофайла: 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 в правильном канале
Вы можете достичь этого, выполнив следующие действия:
Расшифруйте файлы 1.mp3 и 2.mp3
Сохранение декодированных необработанных данных (в разных файлах формата WAVE или в памяти)
Замените значения первого или второго канала декодированных данных 1.mp3 на значения первого или второго канала исходных данных декодированных 2.mp3 по одному (обратите внимание, что это приводит к потере качества звука)
Создайте заголовок WAVE (формат необработанных аудиоданных) на основе объединенных функций аудиоданных
Создайте форматированный WAVE файл 3.wav, используя созданный заголовок WAVE и объединенные аудиоданные
Конвертировать файл 3.wav в формат файла 3.mp3
Выполнение этих шагов требует, чтобы вы знали:
Как декодировать mp3 файлы, чтобы получить необработанные данные
Как манипулировать байтами данных в буфере
WAVE формат звукового файла
Как конвертировать WAV в mp3
Для декодирования и кодирования аудиофайлов в разных форматах вы можете использовать соответствующую звуковую библиотеку (например, BASS) — это поможет вам сделать 1 и 6 шагов. Для построения аудиоформатов в формате WAVE вы должны быть знакомы с Формат файла WAVE и как каналы аудиоданных выровнены в буфере — это поможет вам сделать 3, 4 и 5 шагов
mp3 — это сжатые аудиоданные. Вы не можете напрямую смешивать их с помощью файловых операций.
Единственное, что вы можете сделать, это использовать библиотеку ffmpeg, чтобы конвертировать mp3 в raw PCM, смешивать каналы и затем конвертировать их обратно в mp3.