Python 检查互联网广播流是不是可用/直播的方法

Posted

技术标签:

【中文标题】Python 检查互联网广播流是不是可用/直播的方法【英文标题】:Python Way to check whether internet radio stream is avaliable/livePython 检查互联网广播流是否可用/直播的方法 【发布时间】:2018-02-16 08:53:40 【问题描述】:

我致力于收集互联网广播流文件,例如 m3u,其中包含指向流的链接(例如 http://aska.ru-hoster.com:8053/autodj)

我没有找到关于如何检查链接是否可用/有效的示例。

感谢任何帮助

UPD:

也许主要问题应该是这样的:

可能是流中断了?如果是,该流的链接是否仍然可用,或者浏览器中只会出现 404 错误?如果即使流死了链接仍然可以打开,还有什么其他方法可以检查流?

【问题讨论】:

你有任何代码展示你当前的尝试吗?本质上,您只需“获取”m3u,并在失败时处理错误/异常。 ...如果您未能收集到它,它就不存在... @bryn 实际上我正在编写抓取工具以从网站下载所有文件,但问题与如何做到这一点无关。我的问题是如何检查这个流文件以确定流是否没有损坏,这样我就可以删除不必要的文件。好的,我可以改写一下这个任务:如何检查指向互联网广播流 (aska.ru-hoster.com:8053/autodj) 的链接是否可用,所以输出应该是:'Stream is working' / 'Stream is dead' @michael,请检查我的答案,如果有帮助请告诉我。 @Anil_M 感谢您回答朋友,您的回答很有帮助。我可能是错的,但可能会出现网站仍然存在流但它不再工作或损坏的情况。再说一次,我可能错了,如果您对此有更多了解,请告诉我,然后简单地检查 url 是否有 404 错误是有意义的。 @Michael ,查看我对基于vlc 的解决方案的编辑,以确定媒体链接是否损坏。也许你可以使用这两个部分来可靠地检测 URL 和 URL 上的媒体。 【参考方案1】:

您是否要检查流式传输 URL 是否存在? 如果是,则就像检查任何其他 url(如果存在)一样。

一种方法是尝试使用urllib 获取网址并检查返回的状态代码。

200 - 存在 其他任何内容(例如 404) - 不存在或您无法访问。

例如:

import urllib
url = 'http://aska.ru-hoster.com:8053/autodj'

code = urllib.urlopen(url).getcode()
#if code == 200:  #Edited per @Brad's comment
 if str(code).startswith('2') or str(code).startswith('3') :
    print 'Stream is working'
else:
    print 'Stream is dead'

EDIT-1

虽然上面会捕获一个 URL 是否存在。如果 URL 存在并且媒体链接断开,它将无法捕获。

使用vlc 的一种可能解决方案是从 url 获取媒体,尝试播放它并在播放时获取其状态。如果媒体不存在,我们会得到可以用来判断链接状态的错误。

我们得到有效的 URL

url = 'http://aska.ru-hoster.com:8053/autodj'
>>> 
Stream is working. Current state = State.Playing   

我们得到了损坏的 URL,

url = 'http://aska.ru-hoster.com:8053/autodj12345'
>>> 
Stream is dead. Current state = State.Error

下面是实现上述的基本逻辑。您可能需要检查 VLC site 以捕获其他错误类型和更好的方法。

import vlc
import time

url = 'http://aska.ru-hoster.com:8053/autodj'
#define VLC instance
instance = vlc.Instance('--input-repeat=-1', '--fullscreen')

#Define VLC player
player=instance.media_player_new()

#Define VLC media
media=instance.media_new(url)

#Set player media
player.set_media(media)

#Play the media
player.play()


#Sleep for 5 sec for VLC to complete retries.
time.sleep(5)
#Get current state.
state = str(player.get_state())

#Find out if stream is working.
if state == "vlc.State.Error" or state == "State.Error":
    print 'Stream is dead. Current state = '.format(state)
    player.stop()
else:
    print 'Stream is working. Current state = '.format(state)
    player.stop()

【讨论】:

这不太准确。任何状态码2xx 都是成功的,即使不是200。例如,有一些流服务器将返回206 Partial Content。您还缺少所有 3xx 形式的重定向。将流重定向到其他服务器以帮助平衡负载是很常见的。 您是正确的@Brad(根据en.wikipedia.org/wiki/List_of_HTTP_status_codes 确认)。我没有深入研究它,因为目的不是提供完整的解决方案,而只是指向它。我更新了我的答案,现在将2xx3xx 代码捕获为success。谢谢指点。

以上是关于Python 检查互联网广播流是不是可用/直播的方法的主要内容,如果未能解决你的问题,请参考以下文章

Python 3 从互联网广播流中获取歌曲名称

怎么使用阿里云直播服务应用到现在主流直播平台中

怎么使用阿里云直播服务应用到现在主流直播平台中

使用广播级别的Matrox Monarch HD硬件编码如何进行网络直播

检查 Twitch.tv 流是不是在线并使用 Pircbot 接收观众计数

搭建内网音频直播源基于天津相声广播音频