使用LibVLC播放时保存流
使用LibVLC,我正在尝试在播放流时保存它。这是python代码:
import osimport sys
import vlc
if __name__ == '__main__':
filepath = <either-some-url-or-local-path>
movie = os.path.expanduser(filepath)
if 'http://' not in filepath:
if not os.access(movie, os.R_OK):
print ( 'Error: %s file is not readable' % movie )
sys.exit(1)
instance = vlc.Instance("--sub-source marq --sout=file/ps:example.mpg")
try:
media = instance.media_new(movie)
except NameError:
print ('NameError: % (%s vs Libvlc %s)' % (sys.exc_info()[1],
vlc.__version__, vlc.libvlc_get_version()))
sys.exit(1)
player = instance.media_player_new()
player.set_media(media)
player.play()
#dont exit!
while(1):
continue
它将视频流保存到文件中example.mpg
。按照此文档,保存流的命令是这样的:
--sout=file/ps:example.mpg
创建实例时使用的vlc.Instance
:
instance = vlc.Instance("--sub-source marq --sout=file/ps:example.mpg")
但是问题在于,它 仅 保存流,而不能同时播放流。
虽然,我正在寻找解决方案,Python 3.3.1
但是如果有C或C ++解决方案,那是很好的。
回答:
回答:
基本思想很简单。您必须复制输出流并将其重定向到文件。正如Maresh正确指出的那样,这是使用
指令完成的。
回答:
以下解决方案适用于我的机器™。我已经在带有VLC v2.0.3(TwoFlower)和Python 2.7.1的Ubuntu
12.10上对其进行了测试。我认为它也应该在Python 3上工作,因为大多数繁重的工作还是由libVlc完成的。
import osimport sys
import vlc
if __name__ == '__main__':
#filepath = <either-some-url-or-local-path>
movie = os.path.expanduser(filepath)
if 'http://' not in filepath:
if not os.access(movie, os.R_OK):
print ( 'Error: %s file is not readable' % movie )
sys.exit(1)
instance = vlc.Instance("--sout=#duplicate{dst=file{dst=example.mpg},dst=display}")
try:
media = instance.media_new(movie)
except NameError:
print ('NameError: % (%s vs Libvlc %s)' % (sys.exc_info()[1],
vlc.__version__, vlc.libvlc_get_version()))
sys.exit(1)
player = instance.media_player_new()
player.set_media(media)
player.play()
#dont exit!
while(1):
continue
回答:
- 在命令行帮助是必不可少的破译的VLC命令行选项过多。
- VLC流式处理方法的第3章。解释流输出的结构,其指令并描述各种可用模块。第4章显示了一些示例。
- LibVLC API文档,如果您想在运行时更改媒体选项
更新-保存YouTube视频:
上面的代码不适用于YouTube。我四处搜寻,发现transcode
可以使用其他指令将YouTube的视频流转换为常规视频格式。我用了#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}
- vcodec = mp4v是您要编码的视频格式(mp4v是MPEG-4,mpgv是MPEG-1,还有h263,DIV1,DIV2,DIV3,I420,I422,I444,RV24,YUY2)。
- acodec = mpga是您要编码的音频格式(mpga是MPEG音频层2,a52是A52,即AC3声音)。
- vb = 800是视频比特率,单位为Kbit / s。
- ab = 128是音频比特率,单位为Kbit / s。
- 反交错告诉VLC即时对视频反交错。
更新后的代码如下所示:
import osimport sys
import vlc
if __name__ == '__main__':
#filepath = <either-some-url-or-local-path>
filepath = "http://r1---sn-nfpnnjvh-1gil.c.youtube.com/videoplayback?source=youtube&newshard=yes&fexp=936100%2C906397%2C928201%2C929117%2C929123%2C929121%2C929915%2C929906%2C929907%2C929125%2C929127%2C925714%2C929917%2C929919%2C912512%2C912515%2C912521%2C906838%2C904485%2C906840%2C931913%2C904830%2C919373%2C933701%2C904122%2C932216%2C936303%2C909421%2C912711%2C907228%2C935000&sver=3&expire=1373237257&mt=1373214031&mv=m&ratebypass=yes&id=1907b7271247a714&ms=au&ipbits=48&sparams=cp%2Cid%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&itag=45&key=yt1&ip=2a02%3A120b%3Ac3c6%3A7190%3A6823%3Af2d%3A732c%3A3577&upn=z3zzcrvPC0U&cp=U0hWSFJOVV9KUUNONl9KSFlDOmt4Y3dEWFo3dDFu&signature=D6049FD7CD5FBD2CC6CD4D60411EE492AA0E9A77.5D0562CCF4E10A6CC53B62AAFFF6CB3BB0BA91C0"
movie = os.path.expanduser(filepath)
savedcopy = "yt-stream.mpg"
if 'http://' not in filepath:
if not os.access(movie, os.R_OK):
print ( 'Error: %s file is not readable' % movie )
sys.exit(1)
instance = vlc.Instance("--sout=#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:duplicate{dst=file{dst=%s},dst=display}" % savedcopy)
try:
media = instance.media_new(movie)
except NameError:
print ('NameError: % (%s vs Libvlc %s)' % (sys.exc_info()[1],
vlc.__version__, vlc.libvlc_get_version()))
sys.exit(1)
player = instance.media_player_new()
player.set_media(media)
player.play()
#dont exit!
while(1):
continue
回答:
我在转码指令中使用了MPEG音频和视频编解码器。对于输出文件(在这种情况下为mpg)使用匹配的扩展名似乎很重要。否则,打开保存的文件进行播放时,VLC会感到困惑。如果您决定切换到其他视频格式,请记住这一点。
Maresh:
我认为您需要复制输出以便同时播放和记录它:
vlc.Instance("--sub-source marq --sout=#stream_out_duplicate{dst=display,dst=std{access=file,mux=ts,dst=/path/file.mpg}}")
要么
libvlc_media_add_option(media, ":sout=#stream_out_duplicate{dst=display,dst=std{access=file,mux=ts,dst=/path/file.mpg}}")
以上是 使用LibVLC播放时保存流 的全部内容, 来源链接: utcz.com/qa/401229.html