@
Loserzhu 我已经很久没做这个了,而且这和浏览器相关吧,所以我不了解。但你 SEEK, 也就是在进度条点击的时候,是 SEEK 到下一个 /或者上一个 KEY FRAME 的,至少本地的视频播放器是这样的。比如说电影一开头你就点到 1 小时那个地方,代码里会请求 SEEK(1 小时),这样 FFMPEG 内部会把读的指针设置好,这样你下一个 readframe 读出来的就是 1 小时附近的内容了。
你缓冲文件可以啊,你要取下一个文件之前看看本地有没有,本地有就用本地的,不要 REQUEST SERVER. 但我觉得视频播放器,那就是读一帧显示一帧,你把解好的帧存起来我是没见过。这个东西难做吧,视频播放器是一个 WHILE 循环,把数据读出来,放到解码器里,返回一个 VIDEO FRAME, 显示在屏幕上,有的时候你要放好几段数据解码器才会解出一个 VIDEO FRAME 的,而且你也是解出来了,才知道这帧的 TIMESTAMP 。
哦对,我想一般播放器是两个线程,一个声音,一个图像,因为声音是连续的,所以一般声音是基准。每放一点声音,比如说到了 1:20:30 了,看一下有没有图像在这之前的,有就把图像也显示出来,因为声音的 STEP 小,检查会比较频繁,所以每帧图像都会被显示出来。
所以实现肯定是可以的,但这个也很 TRICKY, 比如说你现在到 1:20:30 了,你缓存了 1:20:25 和 1:20:27 的图像,当然你要把他们显示出来,那中间会不会还有别的图像?有些是可变 FPS 的吧,所以可能你缓存的两帧之间有一帧漏掉了,你要调用 DECODE 把他拿出来,但是我说了你也不知道那块数据能解出 1:20:26 的图像,当然这也是有办法做的,只要你播放过你总能记录下来,但其实我觉得挺麻烦的