在做媒体播放器过程中,遇到了TS流字幕不同步的问题。经过对源码进行分析、与windows上的播放器进行对比,发现是时间进度与视频帧没有对应起来,而字幕的显示又是根据时间来刷新的,所以也就导致了字幕与视频不同步的结果。
最终几经周折,通过获取PCR的值来计算时间进度。以下对解决问题的过程做一下记录:
一、首先希望能通过TS流PES包中的PTS来计算时间进度,毕竟PTS就是所谓的“显示时间戳”,而且PTS能通过应用程序已有的接口获取到。
数据分析:
1.通过在windows上使用EasyICE来分析TS码流,提取其中的PTS信息如下:
PTS:90000
PTS:93753(3753) PTS:97507(3754) PTS:101261(3754) PTS:105015(3754) PTS:108768(3753) PTS:112522(3754) PTS:116276(3754) PTS:120030(3754) PTS:123783(3753) PTS:127537(3754) PTS:131291(3754) PTS:135045(3754) PTS:138798(3753) PTS:142552 PTS:146306 PTS:150060 PTS:153813 PTS:157567 PTS:161321 PTS:165075 PTS:168828 PTS:172582 PTS:176336 PTS:180090 PTS:183843 PTS:187597 PTS:191351 PTS:195105 PTS:198858 PTS:202612 PTS:206366 PTS:210120 PTS:213873 PTS:217627 PTS:221381 PTS:225135 PTS:232642 PTS:236396 可以看到,每隔固定的时间就会有一个PTS。
2.程序运行中的实际效果。以下是通过调用已有接口取得的实际PTS的值:
V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 97552
V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 114444(16892) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 118198(3754) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 120075(1877) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 123828(3753) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 125705(1877) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 129459(3754) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 131336(1877) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 135090(3754) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 136966(1876) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 140720(3754) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 142597(1877) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 146351(3754) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 148228(1877) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 151981(3753) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 153858(1877) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 157612(3754) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 159489(1877) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 180135(20646) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 683675(503540) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 685552(1877) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 687429(1877) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 689306(1877) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 691183(1877) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 709951(18768) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 711828(1877) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 713705(1877) V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 715582 V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 717459 V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 719336 V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 721213 V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 723089 V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 723089 V/ ( 1555): [../src/rmlibplay.c:454] videoPTS: 724966 可以看出,与文件中实际的PTS值并不一致,而且有两个地方前后两帧视频的PTS相差很大,足足有10来秒,出现这种状况的原因是刚开始播放时该视频文件会卡好几秒,然后跳转到%60之后,播放了几秒后又开始卡10来秒,所以造成了前后两帧的PTS间隔很大。
从以上分析可以知道,程序中打印出来的PTS是经过了程序处理之后的值,而不是打包在TS文件中的原始值。这样就导致了不能简单地通过PTS值来作为实践进度来显示。
3.分析程序中PCR的值
经尝试,文件中的PCR的值也是可以通过程序接口来获取到得,如下:
V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 1433606
V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 1441708(8102) V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 1449810(8102) V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 1457906(8096) V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 1466008(8102) V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 1474106(8096) V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 1482206(8100) V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 1563208(81002) V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 1571306(8098) V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 1619906(48600) V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 1628006(8100) V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 1636108(8102) V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 1644206(8098) V/ ( 1555): [../src/main_psfdemux.c:1042] pcr32: 3118406(1474200) 待续......
|
|