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命令行最简单可靠。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SQL中字符串截取函数(SUBSTRING)

    SQL中字符串截取函数(SUBSTRING)1、left(name,4)截取左边的4个字符列:SELECTLEFT(201809,4)年结果:20182、right(name,2)截取右边的2个字符SELECTRIGHT(201809,2)月份结果:093、SUBSTRING(name,5,3)截取name这个字段从第五个字符开始只截取之后的3个字符SELECTSUBSTRING(‘成都融资事…

    2022年5月24日
    84
  • 2018——2019 20165239Exp9 Web安全基础

    2018——2019 20165239Exp9 Web安全基础

    2021年7月7日
    77
  • 太阳高度角方位角计算公式_太阳高度角方位角

    太阳高度角方位角计算公式_太阳高度角方位角太阳高度角/方位角计算公式本文不在此介绍太阳高度角、方位角是什么,相关概念请移步Wikipedia。鉴于很多相关专业人员需要计算太阳高度角、方位角,而网上介绍的公式多数或是不正确,或是杂乱无章。作者

    2022年8月1日
    5
  • 日志格式规范「建议收藏」

    日志格式规范「建议收藏」1简介在程序中写日志是一件非常重要,但是很容易被开发人员忽视的地方。写好程序的日志可以帮助我们大大减轻后期维护压力。在实际的工作中,开发人员往往迫于巨大时间压力,而写日志又是一个非常繁琐的事情,往往没有引起足够的重视。开发人员应在一开始就养成良好的日志撰写习惯,并且应在实际的开发工作中为写日志预留足够的时间。1.1日志的作用一般程序日志出自下面几个方面的需求:1.记…

    2022年5月1日
    61
  • Spring Boot整合RabbitMQ详细教程

    Spring Boot整合RabbitMQ详细教程1.首先我们简单了解一下消息中间件的应用场景异步处理场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种1.串行的方式;2.并行的方式(1)串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西.(2)并行方式:将注册信…

    2022年5月14日
    40
  • IntelliJ IDEA主题背景设置护眼色「建议收藏」

    IntelliJIDEA主题背景设置护眼色(豆绿色)虽然idea的默认黑色,编码很有范,但是对于长期在电脑旁工作,对眼睛很有伤害。对于设置豆绿色对于眼睛可以减少疲劳,可以保护视力。1、Setting设置中,找到”Editor”—>ColorScheme—>General—>…

    2022年4月12日
    816

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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