DELI
DELI
> 我看了没有发现掉帧啊,你是怎么判定的? https://www.hostize.com/zh/v/3ANA_Bw0jN 我做了一个合并了VLC的播放器作为对比你打开看一下就可以发现左边的视频一直在卡顿
> 你录制这个对比很明显有问题,你播放的是你给我的切片吗? 我播放切片很流畅的,你用的机器太老了? 播放的就是我给你的切片,iphone12跟14都会,应该不算旧,系统都是最新的,你那边能不能录前10秒出来我看一下
> 好的,我抽空看下。 字幕这块的基本思路是开辟一个线程预先渲染,等到视频时间根据播放时间找到合适的字幕,然后分配生成纹理,最后并渲染。 好的,感谢大佬
> 好的,我抽空看下。 字幕这块的基本思路是开辟一个线程预先渲染,等到播放视频时根据时间戳找到合适的字幕,然后打包生成纹理,最后一并渲染。 找了挺久,错误大概是这样,字幕在这个函数就报错了: ``` Frame *sp = frame_queue_peek_writable_noblock(com->frameq); if (!sp) { ff_subtitle_buffer_release(&buffer); result = -7; break; } ``` 原因是执行frame_queue_peek_writable_noblock的时候,f->size还是没有更新,导致无法触发f->size >= f->max_size ``` Frame *frame_queue_peek_writable_noblock(FrameQueue *f) { SDL_LockMutex(f->mutex); if (f->size...
> 好的,我抽空看下。 字幕这块的基本思路是开辟一个线程预先渲染,等到播放视频时根据时间戳找到合适的字幕,然后打包生成纹理,最后一并渲染。 今天周末又针对这个问题排查了很久,现在我确定是在frame_queue_peek_writable_noblock这个函数,我把它修改成同步的函数frame_queue_peek_writable就没问题了,代价就是刷出去重新进来,画面会卡住! frame_queue_peek_writable_noblock这个地方我找不到更上一级,目前知道了触发这个字幕问题,是因为字幕还没渲染(写的太慢/读的太快),这个异步的函数就开始去取下一条字幕,结果导致f->size永远==f->max_size,感觉真的太复杂了,异步的状态下,建议不要搞末位递增,而是判断消耗完毕之后,一次性再加载16条字幕进来似乎比较合理。