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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 阿里云部署django实现公网访问

    本博的主要目的是对阿里云部署django实现公网访问进行一次简单的记录,方便日后查询。内容目录:(1)申请阿里云服务器及安全组配置(2)实现ssh远程控制(3)实现ftp文件传输(4)安装p

    2021年12月29日
    41
  • win7蓝屏错误代码对照表(windows蓝屏合集)

    windows蓝屏错误对照表00×00000000作业完成。10×00000001不正确的函数。20×00000002系统找不到指定的档案。30×00000003系统找不到指定的路径。40×00000004系统无法开启档案。50×00000005拒绝存取。60×00000006无效的代码。70×00000007储存体控制区块已毁。80×00000008储存体空间

    2022年4月15日
    693
  • pycharm 条件断点_linux打断点

    pycharm 条件断点_linux打断点前言遇到一个问题,由于数据量较大,直接debug调试太费时间,看了上面链接的博文,结合自身实践,于是有了这篇博文。流程打断点,右键断点,condition填入条件(当条件为true时会进入断点,开始调试),debug运行。具体如图。注:循环内赋值的变量可能无法使用,可用赋值前的变量代替,如b=A.a;条件里写A.a<100等等。其他debug用法只记录,不进行debug…

    2025年7月22日
    0
  • navicat15的激活码[免费获取]

    (navicat15的激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWN…

    2022年3月21日
    96
  • Android上图片文字识别

    Android上图片文字识别最近做了一款Android应用需要输入大量的数据,为了提高体验我想了很多种输入数据的方式,最终采用了两种:二维码扫描和图片识别。前者顾名思义有个短板,就是需要生成二维码,下面就介绍下图片文字识别实现。本应用是基于是OCR引擎,故需要第三方的jar包tess-two.tesseract3.01-leptonica1.68-LibJPEG6b.jar下载链接:点击打开链接另外tessdat…

    2022年6月12日
    29
  • 自定义Appfabric Cache 配置提供程序「建议收藏」

    自定义Appfabric Cache 配置提供程序「建议收藏」默认情况下,AppFabric缓存提供了两种配置存储:一个SQLServer存储和XML文件存储。该解决方案提供和供AppFabric缓存自定义配置提供程序,使用AmazonS3存储缓存的配置。您可以创建您通过实现IDataStoreProxy接口和注入新的实施将自己的数据存储TransactionContext看看现有AmazonProxy指导。该解决方案包含4个项目一…

    2022年10月10日
    0

发表回复

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

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