织梦CMS - 轻松建站从此开始!

罗索

RTP流数据用WINDOWS MEDIA SDK写录像,再播放时出现杂音

罗索客 发布于 2007-07-13 10:16 点击:次 
我将从电台收到的RTP流的数据的payload,通过WINDOWS MEDIA SDK将数据写入文件,输出的sample特别少,字节数也非常少,听起来都是杂音,实在不知道问题出在那里了,可能会在哪里出错呢?
TAG:

我将从电台收到的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)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200707/6742.html]
本文出处:本站原创 作者:iwgh
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容