使用Python下载m3u8流媒体并嵌入到AMP网页中
在短视频和直播流行的年代,很多时候视频的存在形式不再是mp4,mkv等传统视频格式,而是m3u8这种流媒体格式,那么如果想下载喜欢的视频的话就需要做另外的处理。本文将以实际例子,详细介绍如何在Python环境下,下载m3u8流媒体数据,并将其嵌入到AMP网页中进行播放。下面就让我们详细了解一下全过程。
1. 什么是m3u8?
M3U8格式基于HTTP Live Streaming (HLS)技术,可以对整个视频进行分割,形成一系列小的文件,然后创建一个索引文件(.m3u8),通过该索引文件可以加载流媒体。这意味着视频播放时,客户端只需要加载索引文件,之后根据索引文件逐个下载小的视频文件进行播放,从而支持了视频边下边播的功能。
2. 根据m3u8文件下载所有视频文件
我们首先需要获取到m3u8文件,并解析出文件中视频片段(.TS文件)的URL。为了处理网络请求,我们需要使用Python的requests库。以下是一段代码:
import m3u8
import requests
import os
def check_path(path):
if not os.path.exists(path):
os.makedirs(path)
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0"
}
domain = 'www.bobobk.com'
def download_m3u8(m3u8url):
print(m3u8url)
playlist_filename = os.path.join(*m3u8url.split('/')[3:])
if os.path.exists(playlist_filename):
pass
check_path(os.path.dirname(playlist_filename))
host = m3u8url.split("://")[1].split('/')[0]
baseurl, m3u8url = m3u8url.split("://")
if not os.path.exists(playlist_filename):
text = requests.get(m3u8url, headers=headers).text
open(playlist_filename, 'w').write(text.replace(host, domain))
m3u8_obj = m3u8.load(playlist_filename)
print(f"playlist:{playlist_filename}")
baseurl += "://" + m3u8url.split("/")[0]
print("start check playlist")
if len(m3u8_obj.playlists) != 0:
m3u8url = m3u8_obj.playlists[0].uri
if '://' not in m3u8url:
if m3u8url[0] == '/':
m3u8url = baseurl + m3u8_obj.playlists[0].uri
else:
m3u8url = baseurl + '/' + os.path.dirname(playlist_filename)+ '/' + m3u8_obj.playlists[0].uri
print(m3u8url)
text = requests.get(m3u8url, headers=headers).text
playlist_filename = os.path.join(*m3u8url.split('/')[3:])
check_path(os.path.dirname(playlist_filename))
open(playlist_filename, 'w').write(text.replace(host, domain))
m3u8_obj = m3u8.load(playlist_filename)
baseurl, m3u8url = m3u8url.split("://")
host = m3u8url.split('/')[0]
print(f"playlist:{playlist_filename}")
output = os.path.join(*m3u8_obj.segments[0].absolute_uri.split('/')[3:])
check_path(os.path.dirname(output))
print("check subdir")
for segment in m3u8_obj.segments:
segment_url = segment.absolute_uri
segment_file_name = os.path.join(*segment_url.split('/')[3:])
r = requests.get(segment_url, headers=headers, stream=True)
print(f"{segment_url}\t{segment_file_name}")
if os.path.exists(segment_file_name):
continue
with open(segment_file_name, 'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
m3u8url = "https://pptv.sd-play.com/202308/01/PfdfHWiJa43/video/index.m3u8"
download_m3u8(m3u8url)
3. 将m3u8视频嵌入到amp网页
AMP(Accelerated Mobile Pages)网页是一种专为移动设备优化的开源框架,利用该框架,可以创建出快速,美观的网页应用。它用标准化但是灵活的方式,规定了HTML的使用,使得开发响应式网页变得更加简单。
直接将m3u8视频嵌入到AMP中,存在一个问题:目前,AMP并不支持直接播放m3u8文件。因此,我们需要将其转换为MP4格式,再将其嵌入到AMP网页中。
我们可以使用ffmpeg工具来合并.ts文件,并转换为.mp4文件。以下是代码:
for tsfile in "202308/01/PfdfHWiJa43/video/900k_0X480_64k_25/hls/"*.ts;do
echo "file '${tsfile}'" >> tsfile.txt
done
ffmpeg -f concat -safe 0 -i tsfile.txt -c copy 202308/01/PfdfHWiJa43/video/900k_0X480_64k_25/hls/202308.mp4
然后,我们可以在AMP网页中使用amp-video组件来播放这个mp4视频: https://www.bobobk.com/m3u8.html
<!doctype html>
<html amp>
<head>
<meta charset="utf-8">
<script async src="https://cdn.ampproject.org/v0.js"></script>
<title>使用Python下载m3u8流媒体并嵌入到AMP网页中(amp video page)</title>
<link rel="canonical" href="self.html">
<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
<style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style>
<noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>
<script async custom-element="amp-video" src="https://cdn.ampproject.org/v0/amp-video-0.1.js"></script>
</head>
<body>
<amp-video controls width="640" height="360" layout="responsive" > <source src="/202308/01/PfdfHWiJa43/video/900k_0X480_64k_25/hls/202308.mp4" type="video/mp4"> </amp-video>
</body>
</html>
4. 总结
本文详细介绍了使用Python下载m3u8流媒体并嵌入到amp网页中的整个过程,希望对你有所帮助。在实际应用中,请确保你完全遵循了使用流媒体服务的协议,并尊重相关的版权法律。
- 原文作者:春江暮客
- 原文链接:https://www.bobobk.com/892.html
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。