2016-01-21 87 views
2

我有一個問題,那就是當用pyglet播放視頻時,顯然不能正確處理流的開始和結束。播放器會忽略第一個關鍵幀,然後顯示毛刺圖像,直到找到第二個關鍵幀。同樣,on_eos事件不是火,而是python崩潰,因爲它顯然試圖加載更多的幀。pyglet/avbin錯過了視頻的開頭和結尾

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

所以你試過不同的視頻文件?他們是哪種格式? '.mkv'? – Torxed

回答

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的工作太(只是ffmpeg替換avconv)。我只用h264編碼的視頻流在linux上測試它,使用avbin10和本地從their git master branch構建的libav。

這是一個黑客,而不是一個解決方案,因爲它沒有告訴你爲什麼pyglet會在流的早期忽略關鍵幀,也不會導致pyglet正確讀取它們。但它使問題消失。

相關問題