RE: Extract PCM sample data from movie files

Tech-Archive recommends: Fix windows errors by optimizing your registry



Direct Show is the thing you need for your goal. It's seems that you dont
have any knowelge about DS so I hope for you that your job isn't a 911
request because in that case, you are in a DEEP ***.

I will give you some peace of code but do not expect that you would be able
to modify it without having somes basic understanding of DS... The tips I
can give you is the take the DirectX SDK and search for IMutiMediaStreaming.
(This would be the easiest way to do what you want.

it's work, but it's need little corrections...

//------------------------------------------------------------------------------------------------
// Header
//------------------------------------------------------------------------------------------------

class CXWavLoader
{
public:
IMultiMediaStream *m_pMMStream;
IMediaStream *m_pStream;
IAudioStreamSample *m_pSample;
IAudioMediaStream *m_pAudioStream;
IAudioData *m_pAudioData;

HWAVEOUT m_hwo;
WAVEHDR m_wh;
WAVEFORMATEX m_wfx;

DWORD m_dwSize;
BYTE *m_pWavBits;
CXStreamFile s;

public:
CXWaveStream();
~CXWaveStream();

bool Init(char *pszFile);
void Read();
void ReadNext();
};


//------------------------------------------------------------------------------------------------
// Core
//------------------------------------------------------------------------------------------------
/*CXWaveStream::CXWaveStream()
{
m_pMMStream = NULL;
m_pStream = NULL;
m_pSample = NULL;
m_pAudioStream = NULL;
m_pAudioData = NULL;

m_pWavBits = NULL;
m_dwSize = 0;
}




CXWaveStream::~CXWaveStream()
{
if( m_pMMStream )
m_pMMStream->Release();

if( m_pStream )
m_pStream->Release();

if( m_pSample )
m_pSample->Release();

//if( m_pAudioStream )
// m_pAudioStream->Release();

if( m_pAudioData )
m_pAudioData->Release();

if( m_pWavBits )
delete m_pWavBits;
}




bool CXWaveStream::Init(char *pszFile)
{
IAMMultiMediaStream *pAMStream;
WCHAR wszName[MAX_PATH + 1];
HRESULT hr;

hr = CoCreateInstance(CLSID_AMMultiMediaStream, NULL, CLSCTX_INPROC_SERVER,
IID_IAMMultiMediaStream, (void **)&pAMStream);
if( FAILED(hr) )
return false;

MultiByteToWideChar(CP_ACP, 0, pszFile, -1, wszName, MAX_PATH + 1);

pAMStream->Initialize(STREAMTYPE_READ, AMMSF_NOGRAPHTHREAD, NULL);
pAMStream->AddMediaStream(NULL, &MSPID_PrimaryAudio, 0, NULL);

hr = pAMStream->OpenFile(wszName, AMMSF_RUN);
if( SUCCEEDED(hr) )
hr = pAMStream->QueryInterface(IID_IMultiMediaStream, (void**)&m_pMMStream);

if( FAILED(hr) )
return false;

return true;
}




void CXWaveStream::Read()
{
int iSize;
HRESULT hr;

hr = m_pMMStream->GetMediaStream(MSPID_PrimaryAudio, &m_pStream);
if (FAILED(hr))
return;

m_pStream->QueryInterface(IID_IAudioMediaStream, (void
**)&m_pAudioStream);
//m_pStream->Release();
m_pAudioStream->GetFormat( &m_wfx );
m_wfx.nAvgBytesPerSec *= 2;
m_wfx.nChannels = 2;
m_wfx.nBlockAlign = 4;
hr = m_pAudioStream->SetFormat( &m_wfx );
//m_pAudioStream->GetFormat( &m_wfx );


hr = CoCreateInstance(CLSID_AMAudioData, NULL, CLSCTX_INPROC_SERVER,
IID_IAudioData, (void **)&m_pAudioData);
if( FAILED(hr) )
return;

iSize = m_wfx.nAvgBytesPerSec;
m_pWavBits = new BYTE[iSize];
if( m_pWavBits == NULL )
return;
m_pAudioData->SetBuffer(iSize, m_pWavBits, 0);

s.OpenWrite("wavtest.wav");
s.SetDWORD( 0x46464952 ); // RIFF Chunk tag
s.SetDWORD( 36 + (15 * iSize) ); // file size - 8 (riff+size)
s.SetDWORD( 0x45564157 ); // WAVE Chunk tag
s.SetDWORD( 0x20746D66 ); // 'fmt ' Chunk tag
s.SetDWORD( sizeof(WAVEFORMATEX) ); // size of fmt

s.SetBlock( (BYTE*)&m_wfx, sizeof(WAVEFORMATEX) ); // fmt block
s.SetDWORD( 0x61746164 ); // 'data' Chunk tag
s.SetDWORD( (15 * iSize) );

hr = m_pAudioStream->CreateSample(m_pAudioData, 0, &m_pSample);
if( FAILED(hr) )
return;


//hr = m_pMMStream->Seek( 10000000 * 5 );
//hr = m_pSample->Update(SSUPDATE_ASYNC, 0, NULL, 0);
//m_pAudioData->GetInfo(NULL, NULL, &m_dwSize);

for(int i=0; i<15; i++)
{
hr = m_pSample->CompletionStatus(COMPSTAT_WAIT, 10000);
hr = m_pSample->Update(SSUPDATE_CONTINUOUS, 0, NULL, 0);
if( FAILED(hr) || hr == MS_S_ENDOFSTREAM )
break;

//WaitForSingleObject(hEvent, 0);

DWORD dwLength;
m_pAudioData->GetInfo(NULL, NULL, &dwLength);

s.SetBlock(m_pWavBits, dwLength);
}
s.Close();

}




void CXWaveStream::ReadNext()
{
m_pSample->Update(SSUPDATE_ASYNC, 0, NULL, 0);
m_pAudioData->GetInfo(NULL, NULL, &m_dwSize);
}


Best regards, and sorry for my poor english :(
.


Quantcast