回复 16楼 yxfangcs
已经被我找到问题所在,在此说一下,
问题的根源在于,对于没有音频的视频文件,代码中没有进行判断。
在palyer_seek 函数中调用了render_setparam来设置position
render_setparam(player->render, PARAM_MEDIA_POSITION, &ms);
在该函数里有下面的代码
if (render->adev && *papts != -1) *papts = *(int64_t*)param;
if (render->vdev && *pvpts != -1) *pvpts = *(int64_t*)param;
意思就是把音频和视频的pts都设置成外部传进来的postion,在vdev-gdi.cpp的VideoRenderThreadProc线程函数里
作者添加了一些同步音频和视频的代码,用到了这边设置的apts,从大概100行开始
if (apts != -1 && vpts != -1) {
if (apts - vpts > c->tickavdiff + 5) c->ticksleep-=2;
if (apts - vpts < c->tickavdiff - 5) c->ticksleep+=2;
}
if (c->ticksleep > 0) Sleep(c->ticksleep);
代码很好理解,视频在等音频同步,导致的问题就是sleep时间被无限+2,然后越播越慢。
当然还有d3d的错误也一样的。
临时的解决方法就是把palyer_seek 函数中调用的render_setparam注了,
更好的就是对只有视频或只有音频的文件做出判断,也减少了相关资源的创建。
剩下的问题等我有时间再看看。
[此贴子已经被作者于2017-5-6 17:27编辑过]