分享
 
 
 

DirectShow音视频同步实验报告(1)

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

陆其明 2004-09-09

一. 单一音频流

Filter Graph如图1:

图1 单一音频流的Filter Graph

注意:紧靠Audio Renderer的上一级Filter的Audio输出Pin,其GetMediaType函数提供的Media Type的WAVEFORMATEX结构要求填写完整,不仅包括音频格式(wFormatTag须指定为WAVE_FORMAT_PCM)、采样频率(nSamplesPerSec)、通道数(nChannels)、量化精度(wBitsPerSample),还包括由上述几个参数可以计算获得的nBlockAlign和nAvgBytesPerSec。代码参考如下:

WAVEFORMATEX mWaveInfo;

ZeroMemory(&mWaveInfo, sizeof(WAVEFORMATEX));

mWaveInfo.wFormatTag = WAVE_FORMAT_PCM;

mWaveInfo.nSamplesPerSec = 44100;

mWaveInfo.nChannels = 2;

mWaveInfo.wBitsPerSample = 16;

mWaveInfo.nBlockAlign = mWaveInfo.nChannels * mWaveInfo.wBitsPerSample / 8;

mWaveInfo.nAvgBytesPerSec = mWaveInfo.nSamplesPerSec * mWaveInfo.nBlockAlign;

使用Filter Graph Manager默认的参考时钟(Audio Renderer作为参考时钟)

确认Filter Graph的参考时钟

HRESULT CheckReferenceClock(void)

{

if (!m_pClock)

{

DbgLog((LOG_TRACE, 0, TEXT("No reference clock.")));

return E_FAIL;

}

// Get downstream connected filter

IPin * pin = mAudioOutPin->GetConnected();

PIN_INFO pinInfo;

HRESULT hr = pin->QueryPinInfo(&pinInfo);

if (SUCCEEDED(hr))

{

// Audio renderer acts as reference clock

pinInfo.pFilter->Release();

BOOL isSame = IsEqualObject(m_pClock, pinInfo.pFilter);

if (isSame)

{

DbgLog((LOG_TRACE, 0, TEXT("Audio renderer acts as reference clock.")));

return NOERROR;

}

}

// Is CLSID_SystemClock?

IPersist * pPersist = NULL;

hr = m_pClock->QueryInterface(IID_IPersist, (void**) &pPersist);

if (SUCCEEDED(hr))

{

pPersist->Release();

CLSID clsid;

pPersist->GetClassID(&clsid);

BOOL isSame = (CLSID_SystemClock == clsid);

if (isSame)

{

DbgLog((LOG_TRACE, 0, TEXT("System clock acts as reference clock.")));

return NOERROR;

}

}

return NOERROR;

}

1.1 Audio Sample(0.25s数据)不打时间戳、连续送出

现象:播放正常。流时间(从参考时钟获得)线性增加。

MsiRlsrc.ax(tid 870) 10980 : stream time: 90920000

MsiRlsrc.ax(tid 870) 11181 : stream time: 92930000

MsiRlsrc.ax(tid 870) 11483 : stream time: 95950000

MsiRlsrc.ax(tid 870) 11684 : stream time: 97960000

MsiRlsrc.ax(tid 870) 11986 : stream time: 100980000

……

MsiRlsrc.ax(tid 870) 29113 : stream time: 270520000(最后一个Sample)

注:上述流时间均在输出Pin数据线程调用FillBuffer函数时获取。(下同。)

1.2 Audio Sample不打时间戳、间隙送出(模拟网络阻塞情况)

现象:有数据时播放正常,间隙性静音。流时间线性增加,间隙休眠的时间反映在前后两次获得的流时间上。

MsiRlsrc.ax(tid 578) 12292 : stream time: 106000000

MsiRlsrc.ax(tid 578) 12493 : stream time: 108010000

MsiRlsrc.ax(tid 578) 15494 : Sleep(3000)... (出现声音播放的间隙静音)

MsiRlsrc.ax(tid 578) 15511 : stream time: 138190000(反映出Sleep的3s,Sleep的时候流时间仍然在走)

MsiRlsrc.ax(tid 578) 15612 : stream time: 139200000

……

MsiRlsrc.ax(tid 578) 38727 : stream time: 374570000(最后一个Sample)

1.3 Audio Sample打(连续)时间戳、连续送出

现象:播放正常。流时间折线上升(周期性出现几个连续Sample发送时流时间停止不走)。

MsiRlsrc.ax(tid 4b0) 11282 : stream time: 93489570

MsiRlsrc.ax(tid 4b0) 11483 : stream time: 102985035

MsiRlsrc.ax(tid 4b0) 11785 : stream time: 103507279

MsiRlsrc.ax(tid 4b0) 11986 : stream time: 103507279

MsiRlsrc.ax(tid 4b0) 12187 : stream time: 103507279

MsiRlsrc.ax(tid 4b0) 12489 : stream time: 113049003

MsiRlsrc.ax(tid 4b0) 12690 : stream time: 113049003

MsiRlsrc.ax(tid 4b0) 12992 : stream time: 113078028

MsiRlsrc.ax(tid 4b0) 13193 : stream time: 113078028

……

MsiRlsrc.ax(tid 4b0) 28351 : stream time: 263460114 (最后一个Sample)

1.4 Audio Sample打时间戳(中途复位一次,时间戳从0重打)、连续送出

现象:播放正常。当时间戳复位后,流时间停止走动,直到复位后重打的时间戳再次达到复位时的流时间,之后流时间继续走动。Audio Sample上的时间戳会影响流时间!

MsiRlsrc.ax(tid 954) 9448 : stream time: 82866667

MsiRlsrc.ax(tid 954) 9750 : stream time: 83388005

MsiRlsrc.ax(tid 954) 9951 : stream time: 83388005

MsiRlsrc.ax(tid 954) 9952 : Reset time stamp...

MsiRlsrc.ax(tid 954) 10253 : stream time: 83424286

MsiRlsrc.ax(tid 954) 10454 : stream time: 83424286

MsiRlsrc.ax(tid 954) 10756 : stream time: 83424286

MsiRlsrc.ax(tid 954) 10957 : stream time: 83424286

MsiRlsrc.ax(tid 954) 11259 : stream time: 83424286

MsiRlsrc.ax(tid 954) 11460 : stream time: 83424286

MsiRlsrc.ax(tid 954) 11762 : stream time: 83424286

…… (流时间停止在83424286)

……

MsiRlsrc.ax(tid 954) 19205 : stream time: 83424286

MsiRlsrc.ax(tid 954) 19507 : stream time: 83458527 (流时间继续走动)

MsiRlsrc.ax(tid 954) 19708 : stream time: 83458527

MsiRlsrc.ax(tid 954) 20010 : stream time: 83488005

MsiRlsrc.ax(tid 954) 20211 : stream time: 83488005

MsiRlsrc.ax(tid 954) 20412 : stream time: 92508844

……

MsiRlsrc.ax(tid 954) 28258 : stream time: 163470091(最后一个Sample)

1.5 Audio Sample打时间戳(时间戳超前流时间一个delta)、连续送出

现象:声音等待delta之后再播放,播放正常。(设delta=5s)整个流时间为:原始流时间+delta。

MsiRlsrc.ax(tid 25c) 4077 : stream time: 340000

MsiRlsrc.ax(tid 25c) 4178 : stream time: 1350000(这个Sample送出后阻塞)

MsiRlsrc.ax(tid 25c) 9308 : stream time: 52700000(delta在此反映出来)

MsiRlsrc.ax(tid 25c) 9610 : stream time: 53213402

MsiRlsrc.ax(tid 25c) 9811 : stream time: 53213402

MsiRlsrc.ax(tid 25c) 10113 : stream time: 53241520

MsiRlsrc.ax(tid 25c) 10314 : stream time: 62750567

MsiRlsrc.ax(tid 25c) 10616 : stream time: 63270998

MsiRlsrc.ax(tid 25c) 10817 : stream time: 63270998

MsiRlsrc.ax(tid 25c) 11118 : stream time: 63290477

……

MsiRlsrc.ax(tid 25c) 36064 : stream time: 313247642(最后一个Sample)

1.6 Audio Sample打时间戳(时间戳随机乱序)、连续送出

现象:播放正常。播放中,即使时间戳不对,声音照常播放。如果新Sample的时间戳比上一个Sample的时间戳超前,流时间会被修正到新Sample的时间;如果新Sample的时间戳滞后上一个Sample的时间戳,则流时间在当前时刻停止,直到Sample时间戳再次达到停止时刻的流时间。这一次取得流时间总是大于或等于上一次取得流时间,不可能小于!

MsiRlsrc.ax(tid 8f4) 4863 : stream time: 33095488

MsiRlsrc.ax(tid 8f4) 5064 : stream time: 33095488

MsiRlsrc.ax(tid 8f4) 5065 : Add 5 second delta...

MsiRlsrc.ax(tid 8f4) 5366 : stream time: 33129502

MsiRlsrc.ax(tid 8f4) 5567 : stream time: 92632200(5sdelta修正在流时间上,仍连续播放)

……

MsiRlsrc.ax(tid 8f4) 10094 : stream time: 133389819

MsiRlsrc.ax(tid 8f4) 10096 : Add -3 second delta...

MsiRlsrc.ax(tid 8f4) 10395 : stream time: 133424740(流时间停止不走)

MsiRlsrc.ax(tid 8f4) 10597 : stream time: 133424740

MsiRlsrc.ax(tid 8f4) 10898 : stream time: 133424740

MsiRlsrc.ax(tid 8f4) 11100 : stream time: 133424740

MsiRlsrc.ax(tid 8f4) 11401 : stream time: 133424740

……

MsiRlsrc.ax(tid 8f4) 18046 : stream time: 133424740

MsiRlsrc.ax(tid 8f4) 18247 : stream time: 133424740

MsiRlsrc.ax(tid 8f4) 18549 : stream time: 143400477(流时间继续走动)

MsiRlsrc.ax(tid 8f4) 18750 : stream time: 143400477

MsiRlsrc.ax(tid 8f4) 18750 : Do not add delta...(时间戳不加delta)

MsiRlsrc.ax(tid 8f4) 19052 : stream time: 143435397

MsiRlsrc.ax(tid 8f4) 19253 : stream time: 172941724(流时间根据Sample时间戳进行修正?)

MsiRlsrc.ax(tid 8f4) 19555 : stream time: 183459887

MsiRlsrc.ax(tid 8f4) 19756 : stream time: 183459887

MsiRlsrc.ax(tid 8f4) 20058 : stream time: 183489819

……

MsiRlsrc.ax(tid 8f4) 28306 : stream time: 263471452(最后一个Sample)

1.7 Audio Sample打(连续)时间戳、间隙送出(模拟网络阻塞情况)

现象:有数据时播放正常,间隙性静音。在无数据时,流时间并不走动!(请同时参考1.2进行比较。)

MsiRlsrc.ax(tid 86c) 4177 : stream time: 23056939

MsiRlsrc.ax(tid 86c) 4378 : stream time: 32565080

MsiRlsrc.ax(tid 86c) 4679 : stream time: 33075964

MsiRlsrc.ax(tid 86c) 4881 : stream time: 33075964

MsiRlsrc.ax(tid 86c) 7882 : Sleep(3000)...(出现声音播放的间隙静音)

MsiRlsrc.ax(tid 86c) 7899 : stream time: 40170000(没有反映出Sleep的3s,说明Sleep的时候流时间没有走动)

MsiRlsrc.ax(tid 86c) 8000 : stream time: 48500000

MsiRlsrc.ax(tid 86c) 8100 : stream time: 48500000

MsiRlsrc.ax(tid 86c) 8201 : stream time: 48500000

MsiRlsrc.ax(tid 86c) 8302 : stream time: 48500000

MsiRlsrc.ax(tid 86c) 8503 : stream time: 53315874

……

MsiRlsrc.ax(tid 86c) 38578 : stream time: 263365556(最后一个Sample)

1.8 将音频的采样频率写错(原来44.1K,现改成32K或48K)

现象:声音播放变调。

Filter Graph使用系统时钟(组件)

2.1 Audio Sample(0.25s数据)不打时间戳、连续送出

现象:同1.1。

2.2 Audio Sample不打时间戳、间隙送出(模拟网络阻塞情况)

现象:同1.2。

2.3 Audio Sample打(连续)时间戳、连续送出

现象:播放正常。流时间线性增加,没有出现1.3的“折线上升”现象。另外一个特点,流时间的尾数比较“干净”。

Msiavsrc.ax(tid 714) 14505 : stream time: 91880000

Msiavsrc.ax(tid 714) 14807 : stream time: 94900000

Msiavsrc.ax(tid 714) 15008 : stream time: 96910000

Msiavsrc.ax(tid 714) 15310 : stream time: 99930000

Msiavsrc.ax(tid 714) 15511 : stream time: 101940000

Msiavsrc.ax(tid 714) 15812 : stream time: 104950000

Msiavsrc.ax(tid 714) 16014 : stream time: 106970000

Msiavsrc.ax(tid 714) 16315 : stream time: 109980000

……

Msiavsrc.ax(tid 714) 16315 : stream time: 267900000(最后一个Sample)

2.4 Audio Sample打时间戳(中途复位一次,时间戳从0重打)、连续送出

现象:时间戳复位后播放不连续,有部分数据没有被播放。短暂波动后,后续数据仍能正常播放。时间戳复位后的一段时间内流时间仍在缓慢走动。(注:“缓慢走动”说明输出Pin发送Sample的速度很快,也就是说这些Sample达到Audio Renderer后可能被直接丢弃,而并没有根据Sample上的时间戳去安排播放。)

Msiavsrc.ax(tid 21c) 12998 : stream time: 82820000

Msiavsrc.ax(tid 21c) 13199 : stream time: 84830000

Msiavsrc.ax(tid 21c) 13501 : stream time: 87850000

Msiavsrc.ax(tid 21c) 13502 : Reset time stamp...

Msiavsrc.ax(tid 21c) 13702 : stream time: 89860000(流时间仍在缓慢走动)

Msiavsrc.ax(tid 21c) 13703 : stream time: 89870000

Msiavsrc.ax(tid 21c) 13705 : stream time: 89890000

Msiavsrc.ax(tid 21c) 13705 : stream time: 89890000

Msiavsrc.ax(tid 21c) 13706 : stream time: 89900000

Msiavsrc.ax(tid 21c) 13707 : stream time: 89910000

Msiavsrc.ax(tid 21c) 13707 : stream time: 89910000

……

Msiavsrc.ax(tid 21c) 13707 : stream time: 220620000(最后一个Sample)

2.5 Audio Sample打时间戳(时间戳超前流时间一个delta)、连续送出

现象:同1.5。

2.6 Audio Sample打时间戳(时间戳随机乱序)、连续送出

现象:播放断断续续。如果新Sample的时间戳比上一个Sample的时间戳超前,静音等待,直到流时间达到Sample上时间戳再开始播放;如果新Sample的时间戳滞后上一个Sample的时间戳,则流时间非常缓慢地增加,跳过部分数据不播放,直到Sample时间戳达到当前的流时间。

Msiavsrc.ax(tid 794) 8169 : stream time: 37570000

Msiavsrc.ax(tid 794) 8171 : Add 5 second delta...

Msiavsrc.ax(tid 794) 8471 : stream time: 40590000(此Sample发出后就阻塞(静音),等待流时间达到Sample上的时间戳再开始播放)

Msiavsrc.ax(tid 794) 13701 : stream time: 92890000(5sdelta反映在流时间上,后续数据连续播放)

Msiavsrc.ax(tid 794) 13902 : stream time: 94900000

……

Msiavsrc.ax(tid 794) 18127 : stream time: 137150000

Msiavsrc.ax(tid 794) 18127 : Add -3 second delta...

Msiavsrc.ax(tid 794) 18328 : stream time: 139160000(流时间仍在缓慢走动,声音播放不正常,一些数据没有播放)

Msiavsrc.ax(tid 794) 18329 : stream time: 139170000

Msiavsrc.ax(tid 794) 18329 : stream time: 139170000

Msiavsrc.ax(tid 794) 18330 : stream time: 139180000

Msiavsrc.ax(tid 794) 18331 : stream time: 139190000

Msiavsrc.ax(tid 794) 18331 : stream time: 139190000

Msiavsrc.ax(tid 794) 19133 : stream time: 147210000

……

Msiavsrc.ax(tid 794) 19133 : Do not add delta...

Msiavsrc.ax(tid 794) 19334 : stream time: 149220000(此Sample发出后就阻塞(静音),等待流时间达到Sample上的时间戳再开始播放)

Msiavsrc.ax(tid 794) 21849 : stream time: 174370000(与上次流时间有个较大跨度)

Msiavsrc.ax(tid 794) 22854 : stream time: 184420000

Msiavsrc.ax(tid 794) 23056 : stream time: 186440000

……

Msiavsrc.ax(tid 794) 31505 : stream time: 270930000(最后一个Sample)

2.7 Audio Sample打(连续)时间戳、间隙送出(模拟网络阻塞情况)

现象:播放断断续续。无数据时,静音等待,此时流时间仍正常走动;随后数据到来时一部分数据会被跳过不播放,数据不播放时流时间走动非常缓慢;最新的Sample时间戳赶上流时间候仍然能正常播放。

Msiavsrc.ax(tid 768) 9092 : stream time: 32520000

Msiavsrc.ax(tid 768) 9394 : stream time: 35540000

Msiavsrc.ax(tid 768) 9595 : stream time: 37550000

Msiavsrc.ax(tid 768) 12596 : Sleep(3000)...(静音等待,流时间在走动)

Msiavsrc.ax(tid 768) 12596 : stream time: 67560000(流时间非常缓慢增加,一些数据不播放)

Msiavsrc.ax(tid 768) 12597 : stream time: 67570000

Msiavsrc.ax(tid 768) 12597 : stream time: 67570000

Msiavsrc.ax(tid 768) 12598 : stream time: 67580000

Msiavsrc.ax(tid 768) 12599 : stream time: 67590000

Msiavsrc.ax(tid 768) 12600 : stream time: 67600000

Msiavsrc.ax(tid 768) 12600 : stream time: 67600000

Msiavsrc.ax(tid 768) 12601 : stream time: 67610000

Msiavsrc.ax(tid 768) 12602 : stream time: 67620000

Msiavsrc.ax(tid 768) 12613 : stream time: 67730000(流时间增加幅度增大,开始慢慢正常播放)

Msiavsrc.ax(tid 768) 12713 : stream time: 68730000

Msiavsrc.ax(tid 768) 12814 : stream time: 69740000

Msiavsrc.ax(tid 768) 12915 : stream time: 70750000

Msiavsrc.ax(tid 768) 13015 : stream time: 71750000

Msiavsrc.ax(tid 768) 13216 : stream time: 73760000

Msiavsrc.ax(tid 768) 13417 : stream time: 75770000

Msiavsrc.ax(tid 768) 13719 : stream time: 78790000

Msiavsrc.ax(tid 768) 13920 : stream time: 80800000

Msiavsrc.ax(tid 768) 14222 : stream time: 83820000

Msiavsrc.ax(tid 768) 14423 : stream time: 85830000

Msiavsrc.ax(tid 768) 17424 : Sleep(3000)... (静音等待,流时间在走动)

Msiavsrc.ax(tid 768) 17424 : stream time: 115840000(流时间非常缓慢增加,一些数据不播放)

Msiavsrc.ax(tid 768) 17425 : stream time: 115850000

Msiavsrc.ax(tid 768) 17426 : stream time: 115860000

Msiavsrc.ax(tid 768) 17427 : stream time: 115870000

Msiavsrc.ax(tid 768) 17427 : stream time: 115870000

……

Msiavsrc.ax(tid 768) 32328 : stream time: 264880000(最后一个Sample)

Filter Graph不使用参考时钟

现象:不管Audio Sample打不打时间戳,也不管时间戳打得是否正确,声音都能正常播放。如果Audio Sample送出过程中有间隙性停顿,声音播放也会有间隙性的静音。

小结:

v Filter Graph使用Audio Renderer作为参考时钟时,Audio Sample上的时间戳可能会影响整个Filter Graph的流时间;使用系统时钟作为参考时钟时则不会。

v 以Audio Renderer作为参考时钟,音频数据的播放性能较好;不管Audio Sample上有无时间戳,不管时间戳是否正确,一般都能连续播放。但以系统时钟作为参考时钟时,Audio Renderer会严格按照Sample上的时间戳来播放,早到的数据会被阻塞,直到流时间到达Sample时间后再播放,晚到的数据会被直接丢弃,因此整体的播放效果不佳。

v 以Audio Renderer作为参考时钟,Audio Sample打时间戳,Audio数据流如果中途短缺(如果数据源自网络,可能出现网络阻塞情况),将导致Filter Graph的流时间停止不走。如果Audio Sample一开始就不打时间戳的,则Audio数据的中途短缺不会影响Filter Graph的流时间。

v

如果您能从上述数据中得到更多重要的结论,请告诉我luqiming@263.net。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有