m3u8视频文件转换(m3u8文件下载合并的一种方法)

1.背景

大家好,又见面了,我是你们的朋友全栈君。

1 背景

利用UC浏览器App可以很方便地将一些网页视频下载至本地,如果运气好,打开缓存目录就可以看到对应的mp4文件。但大多数时候,你看到的却是m3u8文件加上一个由数字和字母组成的文件夹,如下所示。
在这里插入图片描述
进入该文件夹,你会发现一堆数据文件,虽然没有后缀名,但其实它们都是ts(Transport Stream)媒体分片文件。其中每一个都可以用播放器单独打开,也都是几秒钟的分段视频。如果想观看完整版,也只能在手机浏览器中离线体验了。
在这里插入图片描述

2 HLS和M3U8简介

HLS(HTTP Live Streaming)是苹果公司针对iPhone、iPod、iTouch和iPad等移动设备而开发的基于HTTP协议的流媒体解决方案。在HLS技术中,Web服务器向客户端提供接近实时的音视频流,同时采用标准的HTTP协议。所以,只要使用HLS的技术,就能在普通的HTTP应用上直接提供点播和直播。在App Store中的视频相关应用,基本都是应用的此种技术。其基本原理是将视频文件或视频流切分成小片(ts)并建立索引文件(m3u8)。支持的视频流编码为H.264,音频流编码为AAC。
也就是说,真正的视频文件是在第一张图中文件夹里,每一个文件夹对应的m3u8用来告诉视频插件如何依次播放里面的ts文件,从而呈现给用户一个完整的视频。

3 命令行操作

3.1 软件工具

需要用到ffplay和ffmpeg命令行。

3.2 利用ffplay观看

将m3u8文件视为文本打开,可以看到里面存储着每一个ts文件的绝对路径。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:4.000000,
/storage/896D-1F02/Android/data/com.UCMobile/files/UCDownloads/VideoData//94bad5572f90065418914b4481bf7d1ae19403dc/Y2hlbmppbmdjb25n0
#EXTINF:6.360000,
/storage/896D-1F02/Android/data/com.UCMobile/files/UCDownloads/VideoData//94bad5572f90065418914b4481bf7d1ae19403dc/Y2hlbmppbmdjb25n1
#EXTINF:4.000000,
/storage/896D-1F02/Android/data/com.UCMobile/files/UCDownloads/VideoData//94bad5572f90065418914b4481bf7d1ae19403dc/Y2hlbmppbmdjb25n2
#EXTINF:2.080000,
……

毫无疑问,视频文件拷到linux文件系统中后,首先就要将这些指向安卓机的绝对路径替换成电脑上的绝对路径或相对路径。如下所示。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:4.000000,
./94bad5572f90065418914b4481bf7d1ae19403dc/Y2hlbmppbmdjb25n0
#EXTINF:6.360000,
./94bad5572f90065418914b4481bf7d1ae19403dc/Y2hlbmppbmdjb25n1
#EXTINF:4.000000,
./94bad5572f90065418914b4481bf7d1ae19403dc/Y2hlbmppbmdjb25n2
#EXTINF:2.080000,
……

此时,在保证m3u8文件和对应的94bad5572f90065418914b4481bf7d1ae19403dc文件夹处于同一父目录的条件下,再键入

ffplay XXX.m3u8

好了,真以为这就大功告成了吗?请看下面的报错。

Filename extension of './94bad5572f90065418914b4481bf7d1ae19403dc/Y2hlbmppbmdjb25n1395' is not a common multimedia extension, blocked for security reasons.

显然,基于安全考虑,官方补丁将没有后缀名的ts文件屏蔽掉了,具体可参见FFmpeg任意文件读取漏洞分析。

最直接的解决办法,就是分别在m3u8文件和对应文件夹中批量加上后缀名ts。前一个好说,后一个得在该文件目录下借助命令

ls -A | xargs -i mv { 
   } { 
   }.ts

当然,我们有更简单的办法,就是在ffplay命令中添加选项

ffplay -allowed_extensions ALL XXX.m3u8

ffplay命令成功运行后,会出来一个播放界面,但是没有控制按钮,只能通过鼠标和快捷键进行一些简单的互动操作。如空格是暂停/继续,方向键的左右是前进和后退,鼠标左键双击是全屏,鼠标右键左右滑动是快进和快退等。
在这里插入图片描述

3.3 利用ffmpeg转码

只需很简单的一行命令就能将整个视频转成mp4格式。

ffmpeg -allowed_extensions ALL -i XXX.m3u8 -c copy aaa.mp4

其中:
-i选项后面跟输入文件,即m3u8索引;
-c copy表明要拷贝所有的流,等价于-acodec copy -vcodec copy;
aaa.mp4是输出文件。

4 图形界面操作

如果安装了Videos等图形操作界面,那么只需要将m3u8中的路径信息参照上一节修改后,就可以直接添加播放了,根本不用考虑filename extension的事(当然,这会存在一定的安全隐患),而且控制按钮会比较齐全。
然而在转码时,我实在没有找到很好的图形界面操作软件。试用了一下wine+格式工厂,即不管m3u8索引信息,强行合并ts媒体流,却发现格式工厂在合并时,添加的视频数量是有限的,对于一些大电影来讲,成百上千的ts文件早就超了。而且,格式工厂默认好像不会直接拷贝拼接ts流,而是把所有音视频流都从头到尾再编码一遍,硬件资源开销不小。个人感觉,针对m3u8的转码,好多图形界面都是坑,还是ffmpeg命令行最简单可靠。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129157.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • xshell的安装和使用_git详细教程

    xshell的安装和使用_git详细教程1、Xshell6的安装废话不多说直接上链接:链接:https://pan.baidu.com/s/1WCOxkdhLIZj7yLakWu4Tdw提取码:t3ak2、了解Xshell及其使用2.1、Xshell是什么东西?首先我们要知道Xshell是用来干什么的。Xshell其实就是一个远程终端工具,它可以将你的个人pc(个人电脑)和你在远端的机器连接起来,通过向Xshell输入命令然后他通过网络将命令传送给远端Linux机器然后远端的Linux机器将其运行结果通过网络传回个人电脑。.

  • github 项目地址

    github 项目地址AutoSize:implementation’me.jessyan:autosize:1.2.1’2021/01/22https://github.com/JessYanCoding/AndroidAutoSize

  • idea2022 3.4激活码【2022免费激活】[通俗易懂]

    (idea2022 3.4激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html40ZKSWCX8G-eyJsaWNlbnNlSW…

  • 电阻参数_关于电阻的相关参数

    实际应用时,通常采用平均电阻温度系数,定义式:TCR(平均)=(R2-R1)/R1(T2-T1)有负温度系数、正温度系数及在某一特定温度下电阻只会发生突变的临界温度系数。紫铜的电阻温度系数为1/234.5℃。不同类型电阻温度稳定性从优到次,依次为:金属箔、线绕、金属膜、金属氧化膜、碳膜、有机实芯。1。镀金并不是为了减小电阻,而是因为金的化学性质非常稳定,不容易氧化,接头上镀金是为了防止接触不良(不…

  • VB程序设计教程(第四版)龚沛曾-实验8-6「建议收藏」

    VB程序设计教程(第四版)龚沛曾-实验8-6「建议收藏」实验8-6VB程序题:编写一个随机文件程序。要求:(1)建立一个具有5个学生的学号、姓名和成绩的随机文件(Random.dat)。(2)读出Random.dat文件中的内容,然后按成绩排序,最后按顺序写入另一个随机文件(Randoml.dat)。(3)再一次读出文件的内容,按文件中的顺序将学生的信息显示在屏幕上,检查正确性。解题,画3个按钮控件,代码如下:PrivateTy…

  • [Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法

    [Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法本系列文章主要结合Python语言实现知识图谱构建相关工程,具有一定创新性和实用性,非常希望各位博友交流讨论,相互促进成长。第一篇文章主要介绍哈工大pytltp工具,包括安装过程、中文分词、词性标注和实体识别等。基础性文章,希望对您有所帮助。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号