久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 音頻格式細(xì)節(jié) [打印本頁]

作者: 51黑tt    時間: 2016-3-5 17:36
標(biāo)題: 音頻格式細(xì)節(jié)

幾個格式細(xì)節(jié)備記(混)

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    更一步的細(xì)致說明
   formattype  
      包括有以下:其對應(yīng)的不同的數(shù)據(jù)格式
       FORMAT_None
       FORMAT_DvInfo
       FORMAT_MPEGVideo
       FORMAT_MPEG2Video
       FORMAT_VideoInfo
       FORMAT_VideoInfo2  
       FORMAT_WaveFormatEx   
       GUID_NULL
  cbForamt成員指定了格式塊pbFormat的大小.
  pbFormat指針指向格式子塊。
            pbFormat是一個void*的指針,因為格式塊會因為媒體類型
            的不同而有不同的指向。如音頻填充的是WAVEFORMATEX結(jié)構(gòu)
     數(shù)據(jù).
     可以從中取出傳來的數(shù)據(jù)格式。
     

//TWaveFormatEx 結(jié)構(gòu):
TWaveFormatEx = packed record
  wFormatTag: Word;       {指定格式類型; 默認(rèn) WAVE_FORMAT_PCM = 1;}
  nChannels: Word;        {指出波形數(shù)據(jù)的通道數(shù); 單聲道為 1, 立體聲為 2}
  nSamplesPerSec: DWORD;  {指定樣本速率(每秒的樣本數(shù))}一般為8000
  nAvgBytesPerSec: DWORD; {指定數(shù)據(jù)傳輸?shù)钠骄俾?每秒的字節(jié)數(shù))} 每秒的字節(jié)數(shù):
  nBlockAlign: Word;      {指定塊對齊(單位字節(jié)), 塊對齊是數(shù)據(jù)的最小單位}
  wBitsPerSample: Word;   {采樣大小(字節(jié))}每個樣本的BIT數(shù)目,一般為16
  cbSize: Word;           {應(yīng)該是該結(jié)構(gòu)的大小}
end;
nChannels       :   對于pcm,其nchannels不超過2,對于非pcm格式,則超過2.
nSamplesPerSec  :   通常為8kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz.
nAvgBytesPerSec :   每秒傳送字節(jié)數(shù) = nSamplesPerSec * nBlockAlign
nBlockAlign     :   對齊字節(jié)  = nChannels * wBitsPerSample / 8
                    就是表示一個樣本的最小字節(jié).
wBitsPerSample  :   在格式默認(rèn)情況下,一般為8,16,表示的是樣本的bit 數(shù)
對于一個8位,11k傳輸?shù)牧Ⅲw聲則
nChannels  = 2
nSamplesPerSec(每秒的樣本數(shù)) = 11025  就是取樣數(shù)
nBlockAlign  = 2 * 8 / 8= 2           對齊字節(jié),最小樣本字節(jié)數(shù)
nAvgBytesPerSec = 11025 *  2 = 22050
wBitsPerSample  = 8

下面的圖列清楚從另一個方面表達樣本

樣本1 樣本2...n
8位單聲道0聲道0聲道
8位立體聲0聲道L         1聲道R 0聲道L  1聲R道
16位單聲道0聲道(低字節(jié))    0聲道(高字節(jié))0聲道(低字節(jié))    0聲道(高字節(jié))
16位立體聲
0聲道(低字節(jié))0聲道(高字節(jié))1聲道(低) 1聲道(高)
同左
                                                                                                                     
                                       
                                    
---------
waveform-audio 緩存格式      
  typedef   struct   {     
          LPSTR     lpData;           //內(nèi)存指針,放置音頻pcm樣本數(shù)據(jù)
          DWORD     dwBufferLength;   //長度     
          DWORD     dwBytesRecorded;  //已錄音的字節(jié)長度   
          DWORD     dwUser;     
          DWORD     dwFlags;     
          DWORD     dwLoops;           //循環(huán)次數(shù)   
          struct   wavehdr_tag* lpNext; //保留     
          DWORD     reserved;           //保留
  }   WAVEHDR;  

  其中l(wèi)pdata 即為pcm格式樣本數(shù)據(jù)。
  
采樣大小為8位,則采樣的動態(tài)范圍為20*log(256)分貝=48db。
樣本大小為16位,則采樣動態(tài)范圍為20*log(65536)大約是96分貝
振幅大小:   20*log(A1/A2)分貝,A1,A2為兩個聲音的振幅。
則對于的音頻:
          8位       20 * lg( lpData[0] /256)
   16位      20 * lg( lpData[0]--lpData[1] / 65536)
考慮到單雙道,還需要相應(yīng)取出左右聲道的值。
考慮到lg求值為負(fù)48至0之間,則在實際轉(zhuǎn)換中需要+48or96.

樣本大小  數(shù)據(jù)格式      最大值  最小值
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

其實復(fù)原并查找該ax很簡單,安裝暴風(fēng)后在graphedit中,拖一個rm文件,
查看解碼過程,然后在filter列表中找出該ax文件名,即可構(gòu)建到自己的
播放器中。
posted @ 2008-12-28 11:21 kenlistian| 編輯 收藏


2008年12月27日 #
directsound的一些基本札記
1、配置DirectDound的開發(fā)環(huán)境
包含以下
#include <mmsystem.h>
#include <dsound.h>
添加Dsound.lib庫
comctl32.lib dxerr9.lib winmm.lib dsound.lib dxguid.lib odbc32.lib odbccp32.lib,
2 DiectDound幾個對象

  創(chuàng)建一個設(shè)備對象,后通過設(shè)備對象創(chuàng)建緩沖區(qū)對象。
  輔助緩沖區(qū)由應(yīng)用程序創(chuàng)建和管理,DirectSound會自動地創(chuàng)建和管理主緩沖區(qū),

3 播放音頻文件開發(fā)的基本流程
 a 創(chuàng)建一個設(shè)備對象,設(shè)置設(shè)備對象的協(xié)作度。
    調(diào)用DirectSoundCreat8創(chuàng)建一個支持IDirectSound8接口的對象,
      這個對象通常代表缺省的播放設(shè)備。
   
       如果沒有聲音輸出設(shè)備,這個函數(shù)就返回error,或者,在VXD驅(qū)動程序下,
      如果聲音輸出設(shè)備正被某個應(yīng)用程序通過waveform格式的api函數(shù)所控制,
      該函數(shù)也返回error。
LPDIRECTSOUND8 lpDirectSound;
HRESULT hr
= DirectSoundCreate8(NULL,&lpDirectSound, NULL));

      當(dāng)創(chuàng)建完設(shè)備對象后,調(diào)用IDirectSound8::SetCooperativeLevel來設(shè)置
      協(xié)作度,否則聽不到聲音.

  b.創(chuàng)建一個輔助Buffer,也叫后備緩沖區(qū)
      (IDirectSound8::CreateSoundBuffer)
      創(chuàng)建的buffer稱作輔助緩沖區(qū),Direcsound通過把幾個后備緩沖區(qū)的聲音
      混合到主緩沖區(qū)中,然后輸出到聲音輸出設(shè)備上,達到混音的效果。
  c. 獲取PCM類型的數(shù)據(jù)
   
  將WAV文件或者其他資源的數(shù)據(jù)讀取到緩沖區(qū)中。
  d. 將數(shù)據(jù)讀取到緩沖區(qū)
       其中用到以下來鎖緩沖區(qū)。
          IDirectSoundBuffer8::Lock
          IDirectSoundBuffer8::Unlock.
  e. 播放緩沖區(qū)中的數(shù)據(jù)
       IDirectSoundBuffer8::Play  播放緩沖區(qū)中的音頻數(shù)據(jù),
       IDirectSoundBuffer8::Stop 暫停播放數(shù)據(jù),
      
       獲取或者設(shè)置正在播放的音頻的音量的大小
   IDirectSoundBuffer8::GetVolume
         IDirectSoundBuffer8::SetVolume
      獲取設(shè)置音頻播放的頻率
    IDirectSoundBuffer8::GetFrequency
         IDirectSoundBuffer8::SetFrequency   
              主緩沖區(qū)的頻率不允許改動,
      設(shè)置音頻在左右聲道播放的位置
          IDirectSoundBuffer8::GetPan
          IDirectSoundBuffer8::SetPan
  包含全部音頻數(shù)據(jù)的緩沖區(qū)我們稱為靜態(tài)的緩沖區(qū),
        盡管不同的聲音可能會反復(fù)使用同一個內(nèi)存buffer,但靜態(tài)緩沖區(qū)的數(shù)據(jù)只寫入一次。
        靜態(tài)緩沖區(qū)只填充一次數(shù)據(jù),然后就可以play,

 給靜態(tài)緩沖區(qū)加載數(shù)據(jù)分下面幾個步驟
  1、用IDirectSoundBuffer8::Lock函數(shù)來鎖定所有的內(nèi)存,
            指定你鎖定內(nèi)存中你開始寫入數(shù)據(jù)的偏移位置,并且取回該偏移位置的地址。
  2、采用標(biāo)準(zhǔn)的數(shù)據(jù)copy方法,將音頻數(shù)據(jù)復(fù)制到返回的地址。
  3、調(diào)用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;

//設(shè)置設(shè)備的協(xié)作度
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               //設(shè)置主播
                                | DSBCAPS_CTRLFX
                                
| DSBCAPS_CTRLPOSITIONNOTIFY
                                
| DSBCAPS_GETCURRENTPOSITION2;

dsbd.dwBufferBytes
= g_pWaveFile->GetSize();   
dsbd.lpwfxFormat
= g_pWaveFile->m_pwfx;

LPDIRECTSOUNDBUFFER lPBuffer;

//創(chuàng)建輔助緩沖區(qū)對象
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  流緩沖區(qū)播放超大型的wave文件
   流緩沖區(qū)就是播放那些比較長的音頻文件,邊播放,邊填充DirectSound緩沖區(qū)。
   DirectSound的通知機制
      因為Stream buffer 大小只夠容納一部分?jǐn)?shù)據(jù),在播放完緩沖區(qū)中的數(shù)據(jù)后,
      DirectSound就會通知應(yīng)用程序,將新的數(shù)據(jù)填充到DirectSound的緩沖區(qū)中。


#define MAX_AUDIO_BUF 4                        //設(shè)置4個buffer
#define BUFFERNOTIFYSIZE 1920               //每個buffer尺寸為1920

BOOL g_bPlaying     
= FALSE;                                            //是否正在播放
LPDIRECTSOUNDNOTIFY8 g_pDSNotify = NULL;
DSBPOSITIONNOTIFY        g_aPosNotify[MAX_AUDIO_BUF];     
//設(shè)置通知標(biāo)志的數(shù)組

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();


     當(dāng)DirectSound播放到buffer的1920,3840,5760,7680等位置時,
Directsound就會通知應(yīng)用程序,將g_event,設(shè)置為通知態(tài);
  應(yīng)用程序就通過WaitForMultipleObjects 函數(shù)等待DirectSound的通知,
將數(shù)據(jù)填充到DirectSoun的輔助緩沖區(qū)。









歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久中文字幕一区 | 亚洲国产看片 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 我要看免费一级毛片 | 二区中文字幕 | 最近日韩中文字幕 | 九七午夜剧场福利写真 | 国产精品一区二区三 | 久久免费视频1 | 免费一区 | 999国产精品视频 | 亚洲欧洲一区二区 | 日韩中文字幕在线视频 | 蜜月va乱码一区二区三区 | 午夜男人免费视频 | 免费黄色录像片 | 婷婷久久网| 欧美激情精品久久久久久 | 青青草av在线播放 | 久久久久亚洲 | 美女久久久久 | 搞av.com| 91伦理片 | www.亚洲一区| 天天干在线播放 | 国产一区二区电影 | 欧美精品一区三区 | 日本精品久久久久久久 | 欧美一级片 | 精品久久一区 | 日韩精品久久一区二区三区 | 一区二区三区亚洲精品国 | 亚洲精品二三区 | 依人成人 | 欧美99 | 亚州精品天堂中文字幕 | 伊人免费网 | 激情小说综合网 | 蜜桃视频在线观看免费视频网站www | 日本精品裸体写真集在线观看 | 亚洲一区二区三区免费 |