我試圖使用LibVLC Python綁定來播放內存流(Python 3.4,Windows 7,LibVLC 3.x)。最終,我的目標是將數據提供給一個BytesIO實例,然後VLC將讀取並播放它。但目前,我決定修改一個快速腳本來嘗試從文件流中讀取數據。這裏的代碼和回溯 - 說我對ctypes很陌生會是輕描淡寫,所以有人知道我做錯了什麼?將文件類對象傳遞給ctypes回調
import ctypes
import io
import sys
import time
import vlc
MediaOpenCb = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p, ctypes.POINTER(ctypes.c_void_p), ctypes.POINTER(ctypes.c_uint64))
MediaReadCb = ctypes.CFUNCTYPE(ctypes.c_ssize_t, ctypes.c_void_p, ctypes.c_char_p, ctypes.c_size_t)
MediaSeekCb = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p, ctypes.c_uint64)
MediaCloseCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p)
def media_open_cb(opaque, data_pointer, size_pointer):
data_pointer.value = opaque
size_pointer.contents.value = sys.maxsize
return 0
def media_read_cb(opaque, buffer, length):
stream = ctypes.cast(opaque, ctypes.py_object).value
new_data = stream.read(length.contents)
buffer.contents.value = new_data
return len(new_data)
def media_seek_cb(opaque, offset):
stream = ctypes.cast(opaque, ctypes.py_object).value
stream.seek(offset)
return 0
def media_close_cb(opaque):
stream = ctypes.cast(opaque, ctypes.py_object).value
stream.close()
callbacks = {
'open': MediaOpenCb(media_open_cb),
'read': MediaReadCb(media_read_cb),
'seek': MediaSeekCb(media_seek_cb),
'close': MediaCloseCb(media_close_cb)
}
def main(path):
stream = open(path, 'rb')
instance = vlc.Instance()
player = instance.media_player_new()
media = instance.media_new_callbacks(callbacks['open'], callbacks['read'], callbacks['seek'], callbacks['close'], ctypes.byref(ctypes.py_object(stream)))
player.set_media(media)
player.play()
while True:
time.sleep(1)
if __name__ == '__main__':
try:
path = sys.argv[1]
except IndexError:
print('Usage: {0} <path>'.format(__file__))
sys.exit(1)
main(path)
[02f87cb0] imem demux error: Invalid get/release function pointers
Traceback (most recent call last):
File "_ctypes/callbacks.c", line 234, in 'calling callback function'
File "memory_stream.py", line 21, in media_read_cb
stream = ctypes.cast(opaque, ctypes.py_object).value
ValueError: PyObject is NULL
上述追蹤被重複,直到我殺死程序。
我想「謝謝你!」評論通常在這裏附近引起,但是這真棒。我已經放棄了希望,我會永遠解決這個問題,或者這會得到回答。我將把它包裝到一個類中,並嘗試使用它來加載一個HLS塊的隊列。如果我可以不止一次地讚揚你,我會。 –
不客氣。我偶然發現了這個問題,因爲我有類似的問題。 另請注意,libvlc不喜歡收到比它所要求的更少的字節。所以,在media_read_cb函數中等待更多數據是一個好方法(我認爲它會使事情崩潰)。 – Munchhausen
任何想法,爲什麼我一直看到錯誤:[03527320] imem demux error:開始播放時無效的獲取/釋放函數指針?媒體仍然很好。 –