这是我在这里的第一个问题,请不要太严厉。
我正在使用AVPlayer从网络播放视频。 我使用附加到AVPlayerItem的AVPlayerItemVideoOutput输出当前帧。为了检查新帧是否已准备好,我调用[AVPlayerItemVideoOutput hasNewPixelBufferForItemTime],然后使用OpenGL ES进行输出。 如果我读取mp4,一切都完美无缺,但如果我尝试读取m3u8,则仅在大约1秒钟(~ 30帧)的时间内工作,但此后[AVPlayerItemVideoOutput hasNewPixelBufferForItemTime]始终返回假值,因此当前帧未更新。
如果在出现此问题之前使用[AVPlayer seekToTime]寻找当前帧,所有操作都正常。
我使用的测试m3u8视频位于此处:
http://195.16.112.71/adaptive/3006a26a-9154-4b38-a327-4fa2a2381ae6.video/3006a26a-9154-4b38-a327-4fa2a2381ae6.m3u8
为了重现此问题,我修改了苹果的示例AVPlayerDemo,以下是它:https://yadi.sk/d/T2aVGoKnWmf5Z
主要更改在于我调用了[AVPlayerDemoPlaybackViewController update],它调用了上述的[AVPlayerItemVideoOutput hasNewPixelBufferForItemTime]。该函数具有静态变量counter,用于存储成功调用[AVPlayerItemVideoOutput copyPixelBufferForItemTime]的次数。
视频网址在[AVPlayerDemoPlaybackViewController setURL]中设置,它在函数开头是硬编码的。默认情况下,其值指向m3u8视频,这会导致问题出现,在这种情况下,counter的平均值约为30,在帧索引达到该值后,[AVPlayerItemVideoOutput hasNewPixelBufferForItemTime]仅返回FALSE。
在使用其他视频网址时(请参见[AVPlayerDemoPlaybackViewController setURL]的开头 - 有一个可取消注释的备用网址),所有帧都可以成功读取。
将不胜感激地接受任何帮助!