c – 在使用LibVLC播放时保存流

使用LibVLC,我试图在播放时保存流。这是python代码:

import os
import 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。根据this文档,保存流的命令是:

--sout=file/ps:example.mpg

创建vlc.Instance实例时使用的:

instance = vlc.Instance("--sub-source marq --sout=file/ps:example.mpg")

但问题是它只保存流,它不会同时播放流。

有没有办法(在LibVLC中)我可以在支付时保存流(到本地文件)?

虽然,我正在寻找Python 3.3.1中的一个解决方案,但是如果有任何C或C解决方案,这是很好的。

我昨天创建了一个类似但不重复的topic

理念:

基本思想很简单。您必须复制输出流并将其重定向到文件。正如Maresh正确地指出的那样,使用了sout =#duplicate {…}指令。

工作解决方案:

以下解决方案适用于我的机器™。我已经在Ubuntu 12.10上使用VLC v2.0.3(TwoFlower)和Python 2.7.1进行了测试。我认为它也应该在Python 3上工作,因为大部分的重型操作都是由libVlc完成的。

import os
import 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

有用的网址

> Command-Line help是破译大量VLC的关键
命令行选项。
> Chapter 3 of VLC streaming HowTo.解释流输出的结构,其指令和各种可用模块的描述。 Chapter 4显示了一些例子。
> LibVLC API documentation,以防您想要更改媒体选项
运行

更新 – 保存YouTube视频:

以上代码与YouTube不兼容。我搜索了一下,发现可以使用额外的转码指令将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为单位的音频比特率。
> deinterlace告诉VLC在视频中去除视频。

更新的代码如下所示:

import os
import 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会感到困惑。记住,如果你决定切换到另一种视频格式。

您无法将常规YouTube网址添加为文件路径。相反,您必须指定视频本身的位置。这就是为什么我使用的文件路径看起来很神秘。该文件路径对应于http://www.youtube.com/watch?v=GQe3JxJHpxQ上的视频。 VLC本身能够从给定的YouTube网址中提取视频位置,但是libVLC并不会在开箱即可。你必须编写自己的解析器来做到这一点。 See this related SO question.我followed this approach手动解析我的测试的视频位置。

http://stackoverflow.com/questions/16515099/saving-a-stream-while-playing-it-using-libvlc

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 在使用LibVLC播放时保存流