我遇到一个问题,当使用pyglet播放视频时,显然流的开头和结尾处理不正确。播放器忽略第一个关键帧,从而显示毛刺图像,直到它找到第二个关键帧。同样,on_eos-event不是fire,而是python chrashes,因为它显然会尝试加载更多的帧。
import pyglet
vidPath = "test.mp4"
window = pyglet.window.Window()
player = pyglet.media.Player()
source = pyglet.media.load(vidPath)
player.queue(source)
player.play()
@player.event
def on_eos():
print('video end')
@window.event
def on_draw():
window.clear()
if player.source and player.source.video_format:
player.get_texture().blit(0, 0)
pyglet.app.run()
我在OSX 10.11.3上使用Python 3.4.3,pyglet 1.2.4和AVbin 10。
在Ubuntu上尝试相同的代码和视频我在开始时遇到了同样的问题和以下错误:
Non-reference picture received and no reference available
[h264 @ 0x3386700] decode_slice_header error
Non-reference picture received and no reference available
[h264 @ 0x33880e0] decode_slice_header error
Non-reference picture received and no reference available
[h264 @ 0x3388520] decode_slice_header error
[h264 @ 0x3388a80] illegal short term buffer state detected
Non-reference picture received and no reference available
[h264 @ 0x3388a80] decode_slice_header error
[h264 @ 0x338c2e0] reference picture missing during reorder
[h264 @ 0x338c2e0] reference picture missing during reorder
[h264 @ 0x338c2e0] reference picture missing during reorder
这些视频一旦到达终点:
[h264 @ 0x23bde00] no frame!
[h264 @ 0x23bf7e0] AVC: nal size 0
[h264 @ 0x23bf7e0] AVC: nal size 0
[h264 @ 0x23bf7e0] no frame!
[h264 @ 0x23bfc20] AVC: nal size 0
[h264 @ 0x23bfc20] AVC: nal size 0
任何想法这里有什么问题?我有一些视频可以正常启动,但最终却无法识别。
答案 0 :(得分:1)
我也遇到过这样的问题,当通过pyglet播放时,文件的开头很小。我通过重新编码并在文件开头强制添加一些额外的关键帧来“修复”它:
avconv -i glitchy-file.mp4 -force_key_frames 0.01,0.02,0.03 \
-c:v h264 -c:a copy not-glitchy-file.mp4
此方法也适用于最近版本的ffmpeg(只需将avconv
替换为ffmpeg
)。我只使用h264编码的视频流,在linux上,使用avbin10,以及从their git master branch本地构建的libav进行测试。
这是一个黑客,而不是一个解决方案,因为它没有告诉你为什么pyglet在流的早期忽略关键帧,也不会导致pyglet正确地读取它们。但这会让问题消失。