由于工作需要,项目功能测试用到python调用vlc,用于播放一些直播流,各种尝试后终于可以了,其实蛮简单的,就是由于没有参考自己折腾挺浪费时间的,所以把结果贴出来给需要用到的人。

准备工作:  

    1、首先python环境肯定得有;

    2、其次需要用到vlc的python-blindings,其实就是一个vlc.py文件,里边封装了很多常用api供调用(如果只要用系统调用的方式,这一步可以省略);

    3、需要下载一个和python位数相同的vlc播放器,32位或64位,要保证一致,否则又要各种折腾了;

进入正题

  如果要播放的流是很标准的,就是不包含类似“&”这种特殊字符的url,举个例子:浙江卫视[高清]:http://14.29.60.40/live/5/30/847a4e1e97584d39a961f5604e90c1c4.m3u8?type=web.cloudplay;像这种url你可以直接用system()系统调用的方式直接启动vlc.exe,并附加参数url便可播放;如果目的达到了那不用往下看了,否则,继续。

  很不幸我自己项目中要用的url是包含“&”的,这种url通过系统调用的方式将发生截断,效果就是“&”后面的东西被当做非法字段扔掉了,这样一来要测试的url肯定不对,经过各种尝试最终放弃system这种简单方式;选择用python-blindings,下载vlc.py之后各种尝试最终达到播放url的目的,这种情况下url是当做自定义函数的参数传进去的,可以避免被截断;以下贴出两种解决方案,区别是一个带字幕一个不带字幕;

  1. import sys
  2. import http.client
  3. import time
  4. from vlc import VideoMarqueeOption, Position, EventType,Instance
  5.  
  6. class RTSP_Client():
  7.   pass
  8.  
  9. class VLC_Player():
  10.  
  11. def __init__(self, url):
  12. self.url = url
  13.  
  14. def start_with_marquee(self,timeout=60):
  15.      u"""这种方案是可以带字幕的,根据vlc自带测试源码改写
  16.      """
  17.  
  18. movie = self.url
  19. # Need --sub-source=marq in order to use marquee below
  20. print(sys.argv[:])
  21. instance = Instance(["--sub-source=marq"] + sys.argv[1:])
  22. try:
  23. media = instance.media_new(movie)
  24. except (AttributeError, NameError) as e:
  25. sys.exit(1)
  26. player = instance.media_player_new()
  27. player.set_media(media)
  28. player.play()
  29.  
  30. # Some marquee examples. Marquee requires '--sub-source marq' in the
  31. # Instance() call above, see <http://www.videolan.org/doc/play-howto/en/ch04.html>
  32. player.video_set_marquee_int(VideoMarqueeOption.Enable, 1)
  33. player.video_set_marquee_int(VideoMarqueeOption.Size, 24) # pixels
  34. player.video_set_marquee_int(VideoMarqueeOption.Position, Position.Bottom)
  35. player.video_set_marquee_int(VideoMarqueeOption.Timeout, 0) # millisec, 0==forever
  36. player.video_set_marquee_int(VideoMarqueeOption.Refresh, 1000) # millisec (or sec?)
  37. ##t = '$L / $D or $P at $T'
  38. t = '%Y-%m-%d %H:%M:%S'
  39. player.video_set_marquee_string(VideoMarqueeOption.Text, str_to_bytes(t))
  40.  
  41. # Some event manager examples. Note, the callback can be any Python
  42. # callable and does not need to be decorated. Optionally, specify
  43. # any number of positional and/or keyword arguments to be passed
  44. # to the callback (in addition to the first one, an Event instance).
  45. event_manager = player.event_manager()
  46. event_manager.event_attach(EventType.MediaPlayerEndReached, end_callback)
  47. event_manager.event_attach(EventType.MediaPlayerPositionChanged, pos_callback, player)
  48. time.sleep(timeout)
  49.  
  50. def start(self,timeout=60):
  51.      u"""这种是最简方案,用来测试播放足够了
  52.      """
  53.  
  54. instance = Instance()
  55. player = instance.media_player_new()
  56. Media = instance.media_new(self.url)
  57. Media.get_mrl()
  58. player.set_media(Media)
  59. player.play()
  60.      #如果是看直播这里直接写while True 即可
  61. time.sleep(timeout)
  62.  
  63. def str_to_bytes(s):
  64. """Translate string or bytes to bytes.
  65. """
  66. if isinstance(s, str):
  67. return bytes(s, encoding="UTF-8")
  68. else:
  69. return s
  70.  
  71. def end_callback(event):
  72. print('End of media stream (event %s)' % event.type)
  73. sys.exit(0)
  74.  
  75. echo_position = False
  76. def pos_callback(event, player):
  77. if echo_position:
  78. sys.stdout.write('\r%s to %.2f%% (%.2f%%)' % (event.type,
  79. event.u.new_position * 100,
  80. player.get_position() * 100))
  81. sys.stdout.flush()
  82.  
  83. if __name__ == "__main__":
  84.    #测试url为浙江卫视直播流
  85. url = "http://14.29.60.40/live/5/30/847a4e1e97584d39a961f5604e90c1c4.m3u8?type=web.cloudplay"
  86. p = VLC_Player(url)
  87. p.start(6000)

  这种播放用的是vlc的动态链接库而不是vlc.exe可执行文件,所以GUI是最简的,想要实现播放暂停之类的可以自己实现。

  下面放出效果图:

  

  在python通过vlc相关api下播放流视频已经达成目的了;后续会继续写一下觉得有必要分享的随笔包括但不限于linux驱动、python、go、流媒体等。

python_vlc 播放http流的更多相关文章

  1. Qt+mpg123+openal播放MP3流

    #ifndef PLAYSTREAM_H #define PLAYSTREAM_H #include <QObject> #include "../libMPG123/mpg12 ...

  2. UWP 播放直播流 3MU8

    UWP 播放直播流 3MU8 参考:http://www.c-sharpcorner.com/UploadFile/2b876a/http-live-streaming-in-windows-10-u ...

  3. 使用VLC发送TS流与播放TS流

    使用VLC发送TS流与播放TS流 一.如何使用VLC发送TS流 1.添加一个文件至VLC 2.选择串流,继续 3.选择UDP,点击添加 4.输入地址及端口 5.选择h.264+mp3(TS) 6.ne ...

  4. IOS(苹果手机)使用video播放HLS流,实现在内部播放及全屏播放(即非全屏和全屏播放)。

    需求: 实现PC及移动端播放HLS流,并且可以自动播放,在页面内部播放及全屏播放功能. 初步:PC及安卓机使用hls.js实现hls流自动播放及全屏非全屏播放 首先使用了hls.js插件,可以实现在P ...

  5. 利用Docker挂载Nginx-rtmp(服务器直播流分发)+FFmpeg(推流)+Vue.js结合Video.js(播放器流播放)来实现实时网络直播

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_75 众所周知,在视频直播领域,有不同的商家提供各种的商业解决方案,其中比较靠谱的服务商有阿里云直播,腾讯云直播,以及又拍云和网易云 ...

  6. 使用vlc播放器播放rtsp流视频

    可参考: 使用vlc播放器做rtsp服务器 web网页中使用vlc插件播放相机rtsp流视频 使用vlc进行二次开发做自己的播放器 首先需要安装vlc播放器,下载及安装步骤略 使用vlc播放器播放rt ...

  7. 流媒体基础实践之——RTMP和HLS分发服务器nginx.conmf配置文件(解决了,只能播放RTMP流而不能够播放HLS流的原因)

    user www www; worker_processes ; error_log logs/error.log debug; #pid logs/nginx.pid; events { worke ...

  8. 流媒体技术学习笔记之(二)RTMP和HLS分发服务器nginx.conmf配置文件(解决了,只能播放RTMP流而不能够播放HLS流的原因)

    user www www; worker_processes ; error_log logs/error.log debug; #pid logs/nginx.pid; events { worke ...

  9. videojs集成--播放rtmp流

    之前说到已经把流推送过来了,这时候就可以使用videojs来进行显示播放. 首先要先有一个文件,那就是video-js.swf 因为,这种播放方式html已经不能很好的进行播放了,需要用到flash来 ...

随机推荐

  1. 搭建rsync服务并同步重要数据

    在主备机器上均安装rsync,在主机上以daemon的模式启动,在备机上定时执行同步命令.安装rsync的命令如下: 1.下载安装包(主备机均执行) [root@localhost home]# wg ...

  2. workbench使用小笔记(不定期持续更新)

    1. 删除不使用的工作空间 在使用workbench时,之前可能建了好几个工作空间,现在有一些不使用了,每次打开都能还能看到它们,对于强迫症来说多少有一些不爽.如下图: 现在,就把那些不使用的工作空间 ...

  3. python generator用法

    转自:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868196510 ...

  4. redis恢复(aof)

    ----------------redis备份恢复方法-----------------------------1.采用aof恢复方法若appendonly设置为no的情况下,在每个节点上执行bgre ...

  5. The dependency `XXX` is not used in any concrete target.

    1.在新建项目,引入CocoaPod时,当创建了podfile文件后,执行pod install时报一下错误   2.这是因为 这个第三方不知道用于哪个target,所以必须指定target 解决方案 ...

  6. 如何在cisco官网上下载Cisco packet tracer模拟器

    这个是“思科网络技术学院”提供的一个软件,需要注册成为学员以后才能用,注册名字可以更改. 进入网站后,上面七个选项,cisco Networking Academy.课程(下边第七个选项“Packet ...

  7. html常用meat头

    <!-- 字体编码 --> <meta charset="utf-8" /> <!-- 关键字 --> <meta name=" ...

  8. java解压多层目录中多个压缩文件和处理压缩文件中有内层目录的情况

    代码: package com.xiaobai; import java.io.File; import java.io.FileOutputStream; import java.io.IOExce ...

  9. 将vmware虚拟机转换成qcow2格式的方法

    将vmware虚拟机转换成qcow2格式的方法 http://blog.51cto.com/13570993/2074071 关于qemu安装出现的问题 1.配置qemu是出现can't find p ...

  10. 使用NVM管理Node - Windows

    安装 NVM NVM 下载:https://github.com/coreybutler/nvm-windows 安装 Node 注意:如果没有FQ默认源可能安装npm失败,请参考下一节“安装 NPM ...