pyglet / avbin错过了视频的开头和结尾

时间:2016-01-21 11:45:41

标签: python video pyglet

我遇到一个问题,当使用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

任何想法这里有什么问题?我有一些视频可以正常启动,但最终却无法识别。

1 个答案:

答案 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正确地读取它们。但这会让问题消失。