プログラミングメモ →目次

AVIにWAVをつける

AVISaveV() 関数とAVISaveOptions() 関数を利用して、AVIファイルに音声を付けることができます。この方法、複数の音声ファイルをAVIに混合させることもできます。

#include <vfw.h>
#pragma comment(lib, "vfw32.lib")

void MixVideoAndAudio(LPCTSTR lpszPathnameAvi, LPCTSTR lpszPahtnameWav, LPCTSTR lpszPathnameMix)
{
	PAVISTREAM pavistreamAvi;
	PAVISTREAM pavistreamWav;
	PAVISTREAM paviStreams[2];
	
	AVIFileInit();

	if (AVIStreamOpenFromFile(&pavistreamAvi, lpszPathnameAvi, streamtypeVIDEO, 0, OF_READ, NULL) != 0) 
	{
		AfxMessageBox(_T("Can Open Avi-File."));
		AVIFileExit();
		return;
	}

	if (AVIStreamOpenFromFile(&pavistreamWav, lpszPahtnameWav, streamtypeAUDIO, 0, OF_READ, NULL) != 0) 
	{
		AfxMessageBox(_T("Can Open Wav-File."));
		AVIStreamRelease(pavistreamAvi);
		AVIFileExit();
		return;
	}

	paviStreams[0] = pavistreamAvi;
	paviStreams[1] = pavistreamWav;
	
	AVICOMPRESSOPTIONS aviCompressoptions[2];
	LPAVICOMPRESSOPTIONS lpAviCompressoptions[2];

	ZeroMemory(aviCompressoptions, sizeof(aviCompressoptions));
	lpAviCompressoptions[0] = &aviCompressoptions[0];
	lpAviCompressoptions[1] = &aviCompressoptions[1];

	if (!AVISaveOptions(NULL, 0, 2, paviStreams, lpAviCompressoptions))
	{
		goto proc_end;
	}

	HRESULT hRes = AVISaveV(lpszPathnameMix, NULL, NULL, 2, paviStreams, lpAviCompressoptions);
	if (hRes != AVIERR_OK) 
	{
		CString strResult;
		strResult.Format(_T("Can not mix Avi and Wav(errno=%08x)."), hRes);
		AfxMessageBox(strResult);
		AVISaveOptionsFree(2, lpAviCompressoptions);
		goto proc_end;
	}

	AVISaveOptionsFree(2, lpAviCompressoptions);

proc_end:
	AVIStreamRelease(pavistreamAvi);
	AVIStreamRelease(pavistreamWav);
	AVIFileExit();
}




void CXXXXXDlg::OnBnClickedButton1()
{
	// TODO: Add your control notification handler code here

	MixVideoAndAudio(_T("d:\\video1.avi"), _T("d:\\sound.wav"), _T("d:\\video2.avi"));

}