python_vlc 播放http流
由于工作需要,项目功能测试用到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是当做自定义函数的参数传进去的,可以避免被截断;以下贴出两种解决方案,区别是一个带字幕一个不带字幕;
- import sys
- import http.client
- import time
- from vlc import VideoMarqueeOption, Position, EventType,Instance
- class RTSP_Client():
- pass
- class VLC_Player():
- def __init__(self, url):
- self.url = url
- def start_with_marquee(self,timeout=60):
- u"""这种方案是可以带字幕的,根据vlc自带测试源码改写
- """
- movie = self.url
- # Need --sub-source=marq in order to use marquee below
- print(sys.argv[:])
- instance = Instance(["--sub-source=marq"] + sys.argv[1:])
- try:
- media = instance.media_new(movie)
- except (AttributeError, NameError) as e:
- sys.exit(1)
- player = instance.media_player_new()
- player.set_media(media)
- player.play()
- # Some marquee examples. Marquee requires '--sub-source marq' in the
- # Instance() call above, see <http://www.videolan.org/doc/play-howto/en/ch04.html>
- player.video_set_marquee_int(VideoMarqueeOption.Enable, 1)
- player.video_set_marquee_int(VideoMarqueeOption.Size, 24) # pixels
- player.video_set_marquee_int(VideoMarqueeOption.Position, Position.Bottom)
- player.video_set_marquee_int(VideoMarqueeOption.Timeout, 0) # millisec, 0==forever
- player.video_set_marquee_int(VideoMarqueeOption.Refresh, 1000) # millisec (or sec?)
- ##t = '$L / $D or $P at $T'
- t = '%Y-%m-%d %H:%M:%S'
- player.video_set_marquee_string(VideoMarqueeOption.Text, str_to_bytes(t))
- # Some event manager examples. Note, the callback can be any Python
- # callable and does not need to be decorated. Optionally, specify
- # any number of positional and/or keyword arguments to be passed
- # to the callback (in addition to the first one, an Event instance).
- event_manager = player.event_manager()
- event_manager.event_attach(EventType.MediaPlayerEndReached, end_callback)
- event_manager.event_attach(EventType.MediaPlayerPositionChanged, pos_callback, player)
- time.sleep(timeout)
- def start(self,timeout=60):
- u"""这种是最简方案,用来测试播放足够了
- """
- instance = Instance()
- player = instance.media_player_new()
- Media = instance.media_new(self.url)
- Media.get_mrl()
- player.set_media(Media)
- player.play()
- #如果是看直播这里直接写while True 即可
- time.sleep(timeout)
- def str_to_bytes(s):
- """Translate string or bytes to bytes.
- """
- if isinstance(s, str):
- return bytes(s, encoding="UTF-8")
- else:
- return s
- def end_callback(event):
- print('End of media stream (event %s)' % event.type)
- sys.exit(0)
- echo_position = False
- def pos_callback(event, player):
- if echo_position:
- sys.stdout.write('\r%s to %.2f%% (%.2f%%)' % (event.type,
- event.u.new_position * 100,
- player.get_position() * 100))
- sys.stdout.flush()
- if __name__ == "__main__":
- #测试url为浙江卫视直播流
- url = "http://14.29.60.40/live/5/30/847a4e1e97584d39a961f5604e90c1c4.m3u8?type=web.cloudplay"
- p = VLC_Player(url)
- p.start(6000)
这种播放用的是vlc的动态链接库而不是vlc.exe可执行文件,所以GUI是最简的,想要实现播放暂停之类的可以自己实现。
下面放出效果图:
在python通过vlc相关api下播放流视频已经达成目的了;后续会继续写一下觉得有必要分享的随笔包括但不限于linux驱动、python、go、流媒体等。
python_vlc 播放http流的更多相关文章
- Qt+mpg123+openal播放MP3流
#ifndef PLAYSTREAM_H #define PLAYSTREAM_H #include <QObject> #include "../libMPG123/mpg12 ...
- UWP 播放直播流 3MU8
UWP 播放直播流 3MU8 参考:http://www.c-sharpcorner.com/UploadFile/2b876a/http-live-streaming-in-windows-10-u ...
- 使用VLC发送TS流与播放TS流
使用VLC发送TS流与播放TS流 一.如何使用VLC发送TS流 1.添加一个文件至VLC 2.选择串流,继续 3.选择UDP,点击添加 4.输入地址及端口 5.选择h.264+mp3(TS) 6.ne ...
- IOS(苹果手机)使用video播放HLS流,实现在内部播放及全屏播放(即非全屏和全屏播放)。
需求: 实现PC及移动端播放HLS流,并且可以自动播放,在页面内部播放及全屏播放功能. 初步:PC及安卓机使用hls.js实现hls流自动播放及全屏非全屏播放 首先使用了hls.js插件,可以实现在P ...
- 利用Docker挂载Nginx-rtmp(服务器直播流分发)+FFmpeg(推流)+Vue.js结合Video.js(播放器流播放)来实现实时网络直播
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_75 众所周知,在视频直播领域,有不同的商家提供各种的商业解决方案,其中比较靠谱的服务商有阿里云直播,腾讯云直播,以及又拍云和网易云 ...
- 使用vlc播放器播放rtsp流视频
可参考: 使用vlc播放器做rtsp服务器 web网页中使用vlc插件播放相机rtsp流视频 使用vlc进行二次开发做自己的播放器 首先需要安装vlc播放器,下载及安装步骤略 使用vlc播放器播放rt ...
- 流媒体基础实践之——RTMP和HLS分发服务器nginx.conmf配置文件(解决了,只能播放RTMP流而不能够播放HLS流的原因)
user www www; worker_processes ; error_log logs/error.log debug; #pid logs/nginx.pid; events { worke ...
- 流媒体技术学习笔记之(二)RTMP和HLS分发服务器nginx.conmf配置文件(解决了,只能播放RTMP流而不能够播放HLS流的原因)
user www www; worker_processes ; error_log logs/error.log debug; #pid logs/nginx.pid; events { worke ...
- videojs集成--播放rtmp流
之前说到已经把流推送过来了,这时候就可以使用videojs来进行显示播放. 首先要先有一个文件,那就是video-js.swf 因为,这种播放方式html已经不能很好的进行播放了,需要用到flash来 ...
随机推荐
- 搭建rsync服务并同步重要数据
在主备机器上均安装rsync,在主机上以daemon的模式启动,在备机上定时执行同步命令.安装rsync的命令如下: 1.下载安装包(主备机均执行) [root@localhost home]# wg ...
- workbench使用小笔记(不定期持续更新)
1. 删除不使用的工作空间 在使用workbench时,之前可能建了好几个工作空间,现在有一些不使用了,每次打开都能还能看到它们,对于强迫症来说多少有一些不爽.如下图: 现在,就把那些不使用的工作空间 ...
- python generator用法
转自:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868196510 ...
- redis恢复(aof)
----------------redis备份恢复方法-----------------------------1.采用aof恢复方法若appendonly设置为no的情况下,在每个节点上执行bgre ...
- The dependency `XXX` is not used in any concrete target.
1.在新建项目,引入CocoaPod时,当创建了podfile文件后,执行pod install时报一下错误 2.这是因为 这个第三方不知道用于哪个target,所以必须指定target 解决方案 ...
- 如何在cisco官网上下载Cisco packet tracer模拟器
这个是“思科网络技术学院”提供的一个软件,需要注册成为学员以后才能用,注册名字可以更改. 进入网站后,上面七个选项,cisco Networking Academy.课程(下边第七个选项“Packet ...
- html常用meat头
<!-- 字体编码 --> <meta charset="utf-8" /> <!-- 关键字 --> <meta name=" ...
- java解压多层目录中多个压缩文件和处理压缩文件中有内层目录的情况
代码: package com.xiaobai; import java.io.File; import java.io.FileOutputStream; import java.io.IOExce ...
- 将vmware虚拟机转换成qcow2格式的方法
将vmware虚拟机转换成qcow2格式的方法 http://blog.51cto.com/13570993/2074071 关于qemu安装出现的问题 1.配置qemu是出现can't find p ...
- 使用NVM管理Node - Windows
安装 NVM NVM 下载:https://github.com/coreybutler/nvm-windows 安装 Node 注意:如果没有FQ默认源可能安装npm失败,请参考下一节“安装 NPM ...