使用管道时VLC无法打开MRL

问题描述

我想从管道中播放视频,并且尝试使用python-vlc。(我不喜欢使用subprocess.Popen,因为我需要将VLC窗口嵌入pyqt中)

我尝试了一个像这样的简单代码

import os,time,vlc

r,w = os.pipe()

instance = vlc.Instance()
mediaplayer = instance.media_player_new()
mediaplayer.set_media(instance.media_new_fd(r))
mediaplayer.play()
time.sleep(5)

但是收到以下错误消息:

filesystem stream error: cannot open file \\3 (Bad file descriptor)
main input error: 您的输入无法被打开(Your input cannot be open)
main input error: VLC 无法打开 MRL「fd://3」。详情请检查日志。(VLC is unable to open the MRL fd://3,please check the log for detial)

我试图将管道切换到打开的fd,但是没有任何改变。

...
fd = os.open('test.mp4')
...
mediaplayer.set_media(instance.media_new_fd(fd))
...

我尝试直接使用文件名,然后一切顺利。

mediaplayer.set_mrl('test.mp4')

我不确定我的代码有什么问题。谢谢您的帮助!

我在使用Python 3.8,VLC 3.0.11的Win 10 x64上运行脚本。

解决方法

似乎media_new_fd在Windows上不起作用。最后,我发现有一个命令行参数--drawable-hwnd可以在hwnd中显示vlc窗口。我通过完整的命令行vlc - -I dummy --drawable-hwnd=<hwnd>来解决问题,并将stdin用作流输入。

这个问题Passing file-like objects to ctypes callbacks提供了另一个解决方案。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...