全志科技
直播中

golabs

8年用户 903经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 测量仪表
私信 关注
[问答]

如何去解决问题码流复现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失败的问题。
https://openfreetystvip.migu.cn/ ... 2/2020/10/0117/2020年10月01日14点12分紧急内容准入咪咕音乐自有版权4222首/标清高清/MP3_128_16_Stero/69905304100175532.mp3?channelid=08&msisdn=c9ae4994-20fb-4019-a62f-462bf83f4841&k=0112e08c04770255&t=1603096249914
  • 因为客户提供的MP3文件包含ID3V2部分,该ID3 tag信息位于文件开头,所以文件播放时会有一个 baseOffset 偏移。在执行seek时,由于 baseOffset 的偏移值非0,导致控制流函数进入了错误的else分支,startPos未能正确的设置给函数 CdxHttpSetField(httpHdr, str) ,而是错误的将baseOffset设置给函数 CdxHttpSetField(httpHdr, str) ,导致每次seek都会从头开始播放。


回帖(1)

黄淳

2021-12-29 13:48:13
解决方法
添加限制条件,将原来的 if(pos == 0) 改为 if(pos == 0 || pos < d->startPos),使开始播放的位置正确,即设置正确的Range值。
(patch见附件,基于tina-v3.5)
0001-libcedarx-Solve-seek-abnormal-problem-of-online-MP3-.patch
举报

更多回帖

发帖
×
20
完善资料,
赚取积分