m3u8文件内容剖析

转自http://blog.youkuaiyun.com/afeng0007/article/details/6765105

m3u8 笔记:

 m3u8格式用来流播放,直播流或者点播形式,目的是实现时实性及保密性它会不让你获取它的视频所在地址,所以你做视频软件的

时候就不能实现下载的功能。

其实大部分我们做视频推荐类的应用时候,使用的视频都是从优酷及土豆上获取的,其实它们提供了开放的API,可以获取视频地址

以及视频的多个标签,视频的同类视频推荐,视频同类目下的视频等,开发者可以去申请。

优酷视频开放平台:

http://open.youku.com/

土豆视频开放平台:

http://api.tudou.com/apps/main.php

在IOS device和mac上可以用http的方式进行分发,其中playlist标准为由m3u扩展而来的m3u8文件,媒体文件为MPEG2-TS或者AAC文件(audio only)。

m3u8文件有两种应用场景

multi bitrate adaptive streaming

#EXTM3U

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000

http://example.com/low.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000

http://example.com/mid.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000

http://example.com/hi.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"

http://example.com/audio-only.m3u8

sbr bitrate adaptive streaming

#EXTM3U

#EXT-X-TARGETDURATION:5220

#EXTINF:5220,

http://media.example.com/entire.ts

#EXT-X-ENDLIST

 

rfc doc:

http://tools.ietf.org/html/draft-pantos-http-live-streaming-06

m3u8 文件是m3u文件的扩展。在该rfc中定义了扩展的关键字:
其中:

#EXT-X-TARGETDURATION
定义每个TS的最大的duration。
#EXT-X-MEDIA-SEQUENCE
定义当前m3u8文件中第一个文件的序列号,每个ts文件在m3u8文件中都有固定唯一的序列号,该序列号用于在MBR时切换码率进行对齐。

#EXT-X-KEY

定义加密方式和key文件的url,用于取得16bytes的key文件解码ts文件。

属性:
METHOD
URL
#EXT-X-PROGRAM-DATE-TIME

第一个文件的绝对时间

#EXT-X-ALLOW-CACHE

是否允许cache。
#EXT-X-ENDLIST
表明m3u8文件的结束。live m3u8没有该tag。
#EXT-X-STREAM-INF
属性:
BANDWIDTH
PROGRAM-ID
CODECS
#EXT-X-DISCONTINUITY
当遇到该tag的时候说明以下属性发生了变化:
file format 
number and type of tracks
encoding parameters
encoding sequence

timestamp sequence

#EXT-X-VERSION

 

转载于:https://www.cnblogs.com/jiangshiyong/archive/2012/12/25/2831378.html

### 如何下载并保存m3u8文件 m3u8文件本质上是一个文本文件,包含视频片段(通常是.ts格式)的URL列表以及播放信息。要下载并保存m3u8文件及其对应的视频内容,可以按照以下方法实现[^1]。 #### 获取m3u8文件 m3u8文件通常可以通过分析目标网站的网络请求来获取。使用浏览器开发者工具(如Chrome的开发者工具),在网络选项卡中查找与“.m3u8”相关的请求,即可找到视频的m3u8文件地址。 #### 下载m3u8文件中的视频片段 m3u8文件可能包含多个层级的播放列表,最终指向实际的视频片段(.ts文件)。下载这些片段需要解析m3u8文件内容,并逐个下载每个片段。以下是使用Python实现这一过程的示例代码: ```python import requests from pathlib import Path def download_m3u8_playlist(m3u8_url, save_directory): # 创建保存目录 save_directory = Path(save_directory) save_directory.mkdir(parents=True, exist_ok=True) # 下载m3u8文件内容 response = requests.get(m3u8_url) m3u8_content = response.text # 保存m3u8文件 m3u8_file_path = save_directory / "playlist.m3u8" with open(m3u8_file_path, "w", encoding="utf-8") as f: f.write(m3u8_content) # 解析m3u8文件中的ts片段 ts_urls = [line for line in m3u8_content.splitlines() if line.endswith(".ts")] # 下载每个ts片段 for idx, ts_url in enumerate(ts_urls): ts_response = requests.get(ts_url) ts_file_path = save_directory / f"segment_{idx}.ts" with open(ts_file_path, "wb") as f: f.write(ts_response.content) # 示例调用 download_m3u8_playlist("http://example.com/playlist.m3u8", "./video_segments") ``` 上述代码首先下载m3u8文件并保存到本地,然后解析其中的.ts片段链接,并逐一下载这些片段[^2]。 #### 合并ts文件 下载所有.ts文件后,需要将它们合并为一个完整的视频文件。可以使用FFmpeg工具完成此操作。以下是一个简单的命令行示例: ```bash ffmpeg -i "concat:segment_0.ts|segment_1.ts|segment_2.ts" -c copy output.mp4 ``` 如果片段数量较多,可以先将所有片段路径写入一个文本文件,然后通过以下命令进行合并: ```bash ffmpeg -f concat -safe 0 -i segments.txt -c copy output.mp4 ``` #### 处理解密问题 某些m3u8文件可能包含加密的ts片段,通常使用AES-128加密。在这种情况下,m3u8文件中会提供解密密钥的URL。需要在下载ts片段后,使用该密钥对其进行解密[^3]。 以下是一个处理加密ts片段的示例代码: ```python def decrypt_ts_segment(encrypted_file, key_url, decrypted_file): key_response = requests.get(key_url) key = key_response.content from Crypto.Cipher import AES cipher = AES.new(key, AES.MODE_CBC) with open(encrypted_file, "rb") as f_in: encrypted_data = f_in.read() decrypted_data = cipher.decrypt(encrypted_data) with open(decrypted_file, "wb") as f_out: f_out.write(decrypted_data) # 示例调用 decrypt_ts_segment("encrypted_segment.ts", "http://example.com/key", "decrypted_segment.ts") ``` --- ### 注意事项 - 确保遵守相关法律法规,未经授权下载和分发受版权保护的内容可能涉及侵权行为。 - 部分网站可能会对m3u8文件的访问设置限制,例如要求特定的User-Agent或Referer头信息。可以在请求中添加这些头信息以绕过限制。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值