欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
音頻格式細節
[打印本頁]
作者:
51黑tt
時間:
2016-3-5 17:36
標題:
音頻格式細節
幾個格式細節備記(混)
typedef struct _MediaType {
GUID majortype;
GUID subtype;
BOOL bFixedSizeSamples;
BOOL bTemporalCompression;
ULONG lSampleSize;
GUID formattype;
IUnknown *pUnk; //not use
ULONG cbFormat;
BYTE *pbFormat;
} AM_MEDIA_TYPE;
主要有
majortype 媒體類型大致說明
subtype 更一步的細致說明
formattype
包括有以下:其對應的不同的數據格式
FORMAT_None
FORMAT_DvInfo
FORMAT_MPEGVideo
FORMAT_MPEG2Video
FORMAT_VideoInfo
FORMAT_VideoInfo2
FORMAT_WaveFormatEx
GUID_NULL
cbForamt成員指定了格式塊pbFormat的大小.
pbFormat指針指向格式子塊。
pbFormat是一個void*的指針,因為格式塊會因為媒體類型
的不同而有不同的指向。如音頻填充的是WAVEFORMATEX結構
數據.
可以從中取出傳來的數據格式。
//TWaveFormatEx 結構:
TWaveFormatEx = packed record
wFormatTag: Word; {指定格式類型; 默認 WAVE_FORMAT_PCM = 1;}
nChannels: Word; {指出波形數據的通道數; 單聲道為 1, 立體聲為 2}
nSamplesPerSec: DWORD; {指定樣本速率(每秒的樣本數)}一般為8000
nAvgBytesPerSec: DWORD; {指定數據傳輸的平均速率(每秒的字節數)} 每秒的字節數:
nBlockAlign: Word; {指定塊對齊(單位字節), 塊對齊是數據的最小單位}
wBitsPerSample: Word; {采樣大小(字節)}每個樣本的BIT數目,一般為16
cbSize: Word; {應該是該結構的大小}
end;
nChannels : 對于pcm,其nchannels不超過2,對于非pcm格式,則超過2.
nSamplesPerSec : 通常為8kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz.
nAvgBytesPerSec : 每秒傳送字節數 = nSamplesPerSec * nBlockAlign
nBlockAlign : 對齊字節 = nChannels * wBitsPerSample / 8
就是表示一個樣本的最小字節.
wBitsPerSample : 在格式默認情況下,一般為8,16,表示的是樣本的bit 數
對于一個8位,11k傳輸的立體聲則
nChannels = 2
nSamplesPerSec(每秒的樣本數) = 11025 就是取樣數
nBlockAlign = 2 * 8 / 8= 2 對齊字節,最小樣本字節數
nAvgBytesPerSec = 11025 * 2 = 22050
wBitsPerSample = 8
下面的圖列清楚從另一個方面表達樣本
樣本1
樣本2
...n
8位單聲道
0聲道
0聲道
8位立體聲
0聲道L 1聲道R
0聲道L 1聲R道
16位單聲道
0聲道(低字節) 0聲道(高字節)
0聲道(低字節) 0聲道(高字節)
16位立體聲
0聲道(低字節)0聲道(高字節)1聲道(低) 1聲道(高)
同左
---------
waveform-audio 緩存格式
typedef struct {
LPSTR lpData; //內存指針,放置音頻pcm樣本數據
DWORD dwBufferLength; //長度
DWORD dwBytesRecorded; //已錄音的字節長度
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops; //循環次數
struct wavehdr_tag* lpNext; //保留
DWORD reserved; //保留
} WAVEHDR;
其中lpdata 即為pcm格式樣本數據。
采樣大小為8位,則采樣的動態范圍為20*log(256)分貝=48db。
樣本大小為16位,則采樣動態范圍為20*log(65536)大約是96分貝
振幅大小: 20*log(A1/A2)分貝,A1,A2為兩個聲音的振幅。
則對于的音頻:
8位 20 * lg( lpData[0] /256)
16位 20 * lg( lpData[0]--lpData[1] / 65536)
考慮到單雙道,還需要相應取出左右聲道的值。
考慮到lg求值為負48至0之間,則在實際轉換中需要+48or96.
樣本大小 數據格式 最大值 最小值
8位PCM unsigned int 256 0
16位PCM int 32767 -32767
8位音頻是unsigned 存放波形,取振幅要-127.
而16位因其存放為int 類型,直接套用公式.
audiometer左右聲道音量探測程序(參考代碼(delphi版)
posted @ 2009-01-05 14:16 kenlistian 閱讀(274) | 評論 (0) | 編輯 收藏
2008年12月28日 #
可播放rm,rmvb格式播放器的方法
RealMediaSplitter.ax
Source(.rm/.rmvb)->RealMediaSplitter->Video(Audio)->real a/v decoder->A/V Render
其實復原并查找該ax很簡單,安裝暴風后在graphedit中,拖一個rm文件,
查看解碼過程,然后在filter列表中找出該ax文件名,即可構建到自己的
播放器中。
posted @ 2008-12-28 11:21 kenlistian| 編輯 收藏
2008年12月27日 #
directsound的一些基本札記
1、配置DirectDound的開發環境
包含以下
#include <mmsystem.h>
#include <dsound.h>
添加Dsound.lib庫
comctl32.lib dxerr9.lib winmm.lib dsound.lib dxguid.lib odbc32.lib odbccp32.lib,
2 DiectDound幾個對象
創建一個設備對象,后通過設備對象創建緩沖區對象。
輔助緩沖區由應用程序創建和管理,DirectSound會自動地創建和管理主緩沖區,
3 播放音頻文件開發的基本流程
a 創建一個設備對象,設置設備對象的協作度。
調用DirectSoundCreat8創建一個支持IDirectSound8接口的對象,
這個對象通常代表缺省的播放設備。
如果沒有聲音輸出設備,這個函數就返回error,或者,在VXD驅動程序下,
如果聲音輸出設備正被某個應用程序通過waveform格式的api函數所控制,
該函數也返回error。
LPDIRECTSOUND8 lpDirectSound;
HRESULT hr
=
DirectSoundCreate8(NULL,
&
lpDirectSound, NULL));
當創建完設備對象后,調用IDirectSound8::SetCooperativeLevel來設置
協作度,否則聽不到聲音.
b.創建一個輔助Buffer,也叫后備緩沖區
(IDirectSound8::CreateSoundBuffer)
創建的buffer稱作輔助緩沖區,Direcsound通過把幾個后備緩沖區的聲音
混合到主緩沖區中,然后輸出到聲音輸出設備上,達到混音的效果。
c. 獲取PCM類型的數據
將WAV文件或者其他資源的數據讀取到緩沖區中。
d. 將數據讀取到緩沖區
其中用到以下來鎖緩沖區。
IDirectSoundBuffer8::Lock
IDirectSoundBuffer8::Unlock.
e. 播放緩沖區中的數據
IDirectSoundBuffer8::Play 播放緩沖區中的音頻數據,
IDirectSoundBuffer8::Stop 暫停播放數據,
獲取或者設置正在播放的音頻的音量的大小
IDirectSoundBuffer8::GetVolume
IDirectSoundBuffer8::SetVolume
獲取設置音頻播放的頻率
IDirectSoundBuffer8::GetFrequency
IDirectSoundBuffer8::SetFrequency
主緩沖區的頻率不允許改動,
設置音頻在左右聲道播放的位置
IDirectSoundBuffer8::GetPan
IDirectSoundBuffer8::SetPan
包含全部音頻數據的緩沖區我們稱為靜態的緩沖區,
盡管不同的聲音可能會反復使用同一個內存buffer,但靜態緩沖區的數據只寫入一次。
靜態緩沖區只填充一次數據,然后就可以play,
給靜態緩沖區加載數據分下面幾個步驟
1、用IDirectSoundBuffer8::Lock函數來鎖定所有的內存,
指定你鎖定內存中你開始寫入數據的偏移位置,并且取回該偏移位置的地址。
2、采用標準的數據copy方法,將音頻數據復制到返回的地址。
3、調用IDirectSoundBuffer8::Unlock.,解鎖該地址。
用static buffer 播放wav方法
LPDIRECTSOUNDBUFFER8 g_pDSBuffer8
=
NULL;
//
buffer
LPDIRECTSOUND8 g_pDsd
=
NULL;
//
dsound
CWaveFile
*
g_pWaveFile
=
NULL;
//
初始化DirectSound工作
HRESULT hr;
if
(FAILED(hr
=
DirectSoundCreate8(NULL,
&
g_pDsd,NULL)))
return
FALSE;
//
設置設備的協作度
if
(FAILED(hr
=
g_pDsd
->
SetCooperativeLevel(m_hWnd,DSSCL_PRIORITY)))
return
FALSE;
g_pWaveFile
=
new
CWaveFile;
g_pWaveFile
->
Open(_T(
"
c:\\test.wav
"
), NULL, WAVEFILE_READ);
DSBUFFERDESC dsbd;
ZeroMemory(
&
dsbd,
sizeof
(DSBUFFERDESC) );
dsbd.dwSize
=
sizeof
(DSBUFFERDESC);
dsbd.dwFlags
=
DSBCAPS_GLOBALFOCUS
//
設置主播
|
DSBCAPS_CTRLFX
|
DSBCAPS_CTRLPOSITIONNOTIFY
|
DSBCAPS_GETCURRENTPOSITION2;
dsbd.dwBufferBytes
=
g_pWaveFile
->
GetSize();
dsbd.lpwfxFormat
=
g_pWaveFile
->
m_pwfx;
LPDIRECTSOUNDBUFFER lPBuffer;
//
創建輔助緩沖區對象
if
(FAILED(hr
=
g_pDsd
->
CreateSoundBuffer(
&
dsbd,
&
lpbuffer,NULL)))
return
;
if
( FAILED(hr
=
lpbuffer
->
QueryInterface( IID_IDirectSoundBuffer8, (LPVOID
*
)
&
g_pDSBuffer8) ) )
return
;
lpbuffer
->
Release();
//
播放
LPVOID lplockbuf;
DWORD len;
DWORD dwWrite;
g_pDSBuffer8
->
Lock(
0
,
0
,
&
lplockbuf,
&
len, NULL, NULL, DSBLOCK_ENTIREBUFFER);
//
g_pWaveFile 聲音寫入到lplockbuf所指地址
g_pWaveFile
->
Read((BYTE
*
)lplockbuf, len,
&
dwWrite);
g_pDSBuffer8
->
Unlock(lplockbuf,len,NULL,
0
);
g_pDSBuffer8
->
SetCurrentPosition(
0
);
g_pDSBuffer8
->
Play(
0
,
0
,DSBPLAY_LOOPING);
f 流緩沖區播放超大型的wave文件
流緩沖區就是播放那些比較長的音頻文件,邊播放,邊填充DirectSound緩沖區。
DirectSound的通知機制
因為Stream buffer 大小只夠容納一部分數據,在播放完緩沖區中的數據后,
DirectSound就會通知應用程序,將新的數據填充到DirectSound的緩沖區中。
#define
MAX_AUDIO_BUF 4
//
設置4個buffer
#define
BUFFERNOTIFYSIZE 1920
//
每個buffer尺寸為1920
BOOL g_bPlaying
=
FALSE;
//
是否正在播放
LPDIRECTSOUNDNOTIFY8 g_pDSNotify
=
NULL;
DSBPOSITIONNOTIFY g_aPosNotify[MAX_AUDIO_BUF];
//
設置通知標志的數組
HANDLE g_event[MAX_AUDIO_BUF];
for
(
int
i
=
0
; i
<
MAX_AUDIO_BUF;i
++
)
{
g_aPosNotify
.dwOffset
=
i
*
BUFFERNOTIFYSIZE ;
g_aPosNotify
.hEventNotify
=
g_event
;
}
if
(FAILED(hr
=
g_pDSBuffer8
->
QueryInterface(IID_IDirectSoundNotify,(LPVOID
*
)
&
g_pDSNotify )))
return
;
g_pDSNotify
->
SetNotificationPositions(MAX_AUDIO_BUF,g_aPosNotify);
g_pDSNotify
->
Release();
當DirectSound播放到buffer的1920,3840,5760,7680等位置時,
Directsound就會通知應用程序,將g_event,設置為通知態;
應用程序就通過WaitForMultipleObjects 函數等待DirectSound的通知,
將數據填充到DirectSoun的輔助緩沖區。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1