分享

TS流时间进度的处理

 ganyaofu 2010-11-12
    在做媒体播放器过程中,遇到了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)
 
   待续......
   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多