1、mpd概述
1.定义:MPD文件本质上是一个描述性文件,它不包含实际的视频或音频数据,而是提供了获取这些数据的路径和方式。
2.结构:MPD文件的结构由多个元素组成,每个元素描述了一种媒体资源的不同表现形式,如不同的分辨率或码率。
3.分段传输:MPD文件中的媒体资源通常被分割成多个小片段,这些片段以m4s为扩展名,并通过HTTP进行传输。
4.自适应播放:MPD文件支持动态自适应流媒体播放,可以根据网络状况自动调整视频质量,以保证流畅播放
5.移动端播放:MPD格式适用于多种移动设备,特别是在iOS设备上有较好的兼容性。
6.实时流媒体:由于其自适应特性,MPD格式非常适合用于实时流媒体传输,如在线直播和视频点播服务
2、具体解析mpd文件
我们下载mpd链接后,会得到一个文件,使用记事本打开文件后,会得到一个类似如下例子的文本。(文字发不出来,就看图吧)
mpd内描述了两种类型(mimeType)的文件:
audio和video,即音频和视频。
视频又分为不同分辨率的video,如上图就分为720p和1080p
audio包括了一个*.mp4的初始段和一连串*.m4s媒体段
video包括了一个*.mp4的初始段和一连串*.m4s媒体段注:
1.上图的媒体段是一个MP4, Number通常是从1开始一直增加到某个整数,因为m4s有很多个,这个大家下载的时候可以试探一下。
2.有些mpd文件内的媒体段是一个列表,包含了要下载的媒体段。
3、下载mpd文件内视频的思路
操作思路是
1、合并音频的*.mp4+*.m4s > 得到 audio.mp4
2、合并视频的*.mp4+*.m4s > 得到 video.mp4
最后再合并音频和视频
3、合并audio.mp4和video.mp4 > 得到final.mp4
4、需要注意的一些问题
4.1 单独的m4s打不开
单独下载的音频或者视频的.mp4和.m4s,都是无法打开的。
只有分别合并后,成为audio.mp4和video.mp4才可以打开。
当然,audio.mp4只有声音,video.mp4只有视频
4.2 使用ffmpeg合并m4s报错
我在用ffmpeg合并音频的*.mp4+*.m4s 和视频的*.mp4+*.m4s时,报错了,如下图
之后查询了资料,发现是音视频的初始段内,一般用来存储解码器初始化参数和配置信息 SPS、PPS 等元数据。而媒体段内没有这些元数据,使用ffmpeg合并时,就显示文件不完整、损坏或格式不正确。
所以我是用了shutil.copyfileobj合并这些文件,不过最后的合并还是使用了ffmpeg,合并函数如下图
def mpd_merge_files_with_shutil(file_list, output_file):
"""
使用shutil库将多个文件合并为一个文件。
:param file_list: 要合并的文件列表
:param output_file: 输出文件的路径
"""
with open(output_file, 'wb') as outfile:
for fname in file_list:
with open(fname, 'rb') as infile:
shutil.copyfileobj(infile, outfile)