请问全志R329如何解决在线mp3流媒体seek异常?
本回答来源全志R329如何解决在线mp3流媒体seek异常?
相似现象可参考以下解决方法
现象
tplayerdemo播放任意在线mp3 http/https流,刚开始播放约几秒后,执行命令 seek to: 100 ,会从0开始播放。
注意:出现以上问题的码流为包含ID3V2.3标签的mp3流,且仅在网络播放时才会复现该问题。该类问题码流可通过工具HxD查看识别,如下图所示:
红框是在文件的首部顺序记录的10个字节的ID3V2.4的头部。数据结构如下:
char Header[3]; //必须为"ID3"否则认为标签不存在
char Ver; //版本号 ID3V2.4就记录4
char Revision; //副版本号 此版本记录为0
char Flag; //存放标志的字节,这个版本只定义了三位
char Size[4]; //标签大小,包括标签头的10 个字节和所有的标签帧的大小
具有以上类似标签的为问题码流,可复现以上seek失败的问题。
问题码流
问题分析
因为客户提供的MP3文件包含ID3V2部分,该ID3 tag信息位于文件开头,所以文件播放时会有一个 baseOffset 偏移。在执行seek时,由于 baseOffset 的偏移值非0,导致控制流函数进入了错误的else分支,startPos未能正确的设置给函数 CdxHttpSetField(httpHdr, str) ,而是错误的将baseOffset设置给函数 CdxHttpSetField(httpHdr, str) ,导致每次seek都会从头开始播放。
解决方法
添加限制条件,将原来的 if(pos == 0) 改为 if(pos == 0 || pos < d->startPos),使开始播放的位置正确,即设置正确的Range值。
(patch见原文,基于tina-v3.5)