我将从电台收到的RTP流的数据的payload,通过WINDOWS MEDIA SDK将数据写入文件,输出的sample特别少,字节数也非常少,听起来都是杂音,实在不知道问题出在那里了,可能会在哪里出错呢? 以下是在某位大侠在CSDN上将CD转WAV的代码改进吧. #ifndef WMV_WRITER_H #define WMV_WRITER_H
#pragma once
// CWmvWriter command target
#include <wmsdk.h> // windows media SDK header file #include <wmsdkidl.h> // windows media SDK header file #include <Mmreg.h> #include <wmsysprf.h> // windows media SDK header file
#ifndef SAFE_RELEASE #define SAFE_RELEASE( x ) \\ if ( NULL != x ) \\ { \\ x->Release( ); \\ x = NULL; \\ } #endif // SAFE_RELEASE
#ifndef SAFE_ARRAYDELETE #define SAFE_ARRAYDELETE( x ) \\ if( x ) \\ { \\ delete [] x; \\ x = NULL; \\ } #endif //SAFE_ARRAYDELETE
const LPWSTR wszDefaultConnectionName = L"CDTOWMA";
typedef struct MediaTypeTAG{ WAVEFORMATEX m_pWFX; GUID m_Type; }MEDIATYPE, *PMEDIATYPE; class TLog; class CWmvWriter { public: CWmvWriter(TLog* pLog); virtual ~CWmvWriter(); HRESULT Initial(TCHAR* ptszInFile, TCHAR* ptszOutFile, IWMProfile* pProfile); HRESULT AddAudioStream(IWMProfile * pIWMProfile, DWORD dwSampleRate, DWORD dwChannels, WORD wBitsPerSample, WORD* pwStreamNum, WCHAR ** pwszConnectionName); HRESULT UpdateProfile(IWMProfile * pProfile); public: IWMWriter *m_pWMWriter; WM_MEDIA_TYPE mt; MEDIATYPE m_MediaType; HRESULT SetStreamBasics(IWMStreamConfig * pIWMStreamConfig, IWMProfile * pIWMProfile, LPWSTR pwszStreamName, LPWSTR pwszConnectionName, DWORD dwBitrate, WM_MEDIA_TYPE * pmt); HRESULT CreateEmptyProfile(IWMProfile ** ppIWMProfile); HRESULT WriteSample(BYTE* pBuffer, DWORD Length); DWORD m_AudioInput; DWORD m_MsAudioTime; TLog* m_pLog; };
#endif
#include "stdafx.h" #include "WmaWriter.h" #include "tlog.h"
CWmvWriter::CWmvWriter(TLog* pLog) : m_AudioInput(0) , m_MsAudioTime(0) , m_pLog(pLog) { m_pWMWriter = NULL; ZeroMemory(&m_MediaType, sizeof(MEDIATYPE)); }
CWmvWriter::~CWmvWriter() { }
HRESULT ConvertTCharToWChar( TCHAR * ptszInput, WCHAR ** pwszOutput ) { int cchOutput = 0;
if( NULL == ptszInput || NULL == pwszOutput ) { return( E_INVALIDARG ); }
// // Get output buffer size // #ifdef UNICODE cchOutput = wcslen( ptszInput ) + 1; #else //UNICODE cchOutput = MultiByteToWideChar( CP_ACP, 0, ptszInput, -1, NULL, 0 ); if( 0 == cchOutput ) { return( HRESULT_FROM_WIN32( GetLastError() ) ); } #endif // UNICODE
*pwszOutput = new WCHAR[ cchOutput ]; if( NULL == *pwszOutput) { return( E_OUTOFMEMORY ); }
#ifdef UNICODE wcsncpy( *pwszOutput, ptszInput, cchOutput ); #else //UNICODE if( 0 == MultiByteToWideChar( CP_ACP, 0, ptszInput, -1, *pwszOutput, cchOutput ) ) { SAFE_ARRAYDELETE( *pwszOutput ); return( HRESULT_FROM_WIN32( GetLastError() ) ); } #endif // UNICODE
return( S_OK ); }
HRESULT CWmvWriter::Initial(TCHAR* ptszInFile, TCHAR* ptszOutFile, IWMProfile* pProfile) { HRESULT hr = S_OK; if((ptszOutFile == NULL) || (pProfile == NULL)) return E_INVALIDARG; hr = WMCreateWriter(NULL, &m_pWMWriter); if(FAILED(hr)) { m_pLog->print("Failed to Create WMWriter.\\n"); return (hr); }
hr = UpdateProfile(pProfile); if(FAILED(hr)) { m_pLog->print("Failed to Call UpdateProfile.\\n"); return (hr); }
hr = m_pWMWriter->SetProfile(pProfile); if(FAILED(hr)) { m_pLog->print("Failed to Call SetProfile.\\n"); return hr; }
if( NULL != ptszOutFile ) { WCHAR * pwszOutFile = NULL; hr = ConvertTCharToWChar( ptszOutFile, &pwszOutFile ); hr = m_pWMWriter->SetOutputFilename( pwszOutFile ); SAFE_ARRAYDELETE( pwszOutFile ); if(FAILED(hr)) { m_pLog->print("Failed to Call SetOutputFilename.\\n"); return (hr); } } return hr; }
HRESULT CWmvWriter::UpdateProfile(IWMProfile * pProfile) { HRESULT hr = S_OK; if(pProfile == NULL) return E_INVALIDARG;
m_MediaType.m_Type = WMMEDIATYPE_Audio; m_MediaType.m_pWFX.wFormatTag=1 ; m_MediaType.m_pWFX.nChannels=2; m_MediaType.m_pWFX.nSamplesPerSec=22050; m_MediaType.m_pWFX.nAvgBytesPerSec=88200; m_MediaType.m_pWFX.wBitsPerSample=8; m_MediaType.m_pWFX.nBlockAlign = 4; m_MediaType.m_pWFX.cbSize=0;
WORD wStreamNum = 0; WCHAR *pwszConnectionName; hr = AddAudioStream( pProfile, m_MediaType.m_pWFX.nSamplesPerSec, m_MediaType.m_pWFX.nChannels, m_MediaType.m_pWFX.wBitsPerSample, &wStreamNum, &pwszConnectionName); if(FAILED(hr)) { m_pLog->print("Failed to Call AddAudioStream.\\n"); return hr; } return hr; }
(iwgh) |