m3u8视频下载和转码mp4

看到一部电影很喜欢,想下载保存收藏,但是很多影视网站出于版权和成本(节省带宽)原因,都不提供下载功能了;

既然能通过网页播放,肯定可以想方法缓存起来;F12看下控制台,每隔几秒就会下载一个二进制文件。请求一开始会下载一个m3u8的文件,可以看作是一个索引目录(包含了所有数据分片的地址);

维基:
M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。“M3U” 和 “M3U8” 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放。
HLS 的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适> 应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的 extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。
HLS 只请求基本的 HTTP 报文,与实时传输协议(RTP)不同,HLS 可以穿过任何允许 HTTP 数据通>过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。

比如这个:《肖申克的救赎》

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:11
#EXTINF:10.427089,
https://ali6.a.yximgs.com/udata/music/music_bb8c3155635a46f19a0d6d953b86fdf60.jpg
#EXTINF:10.427078,
https://ali6.a.yximgs.com/udata/music/music_6fcca30eeade448aab28e23847cb62370.jpg
#EXTINF:10.427089,
https://ali6.a.yximgs.com/udata/music/music_7cfb3cc7aed241328edebb7b15e2a72a0.jpg
#EXTINF:10.427078,
https://ali6.a.yximgs.com/udata/music/music_353347189b484cf28e5bf72960a556b20.jpg
#EXTINF:10.427089,
https://ali6.a.yximgs.com/udata/music/music_d8dc644f4b784c079b77634aa86f02560.jpg...省略若干个分片#EXTINF:10.427078,
https://ali6.a.yximgs.com/udata/music/music_1def6db042a14f068ee95a5c8f06e5d10.jpg
#EXTINF:3.336667,
https://ali6.a.yximgs.com/udata/music/music_a3f184eb15404d93b1ebb1f90ab37b6e0.jpg
#EXT-X-ENDLIST

参考:https://developer.apple.com/streaming/

一部完整电影就是依靠这一个个的分片数据累计而成;
https://ali6.a.yximgs.com/udata/music/music_d8dc644f4b784c079b77634aa86f02560.jpg
> >
下载其中一个片段,修改直接修改后缀为mp4(现代化的播放器一般都支持直接播放m3u8和ts的),发现无法播放,正常m3u8视频串流文件为ts文件,显然该文件做了”处理“,看来这个jpg不是简单改个后缀名。

参考:https://blog.csdn.net/cheng448208985/article/details/54618323
参考:https://zhuanlan.zhihu.com/p/523606957

ts都是以 0x47 开始的,使用Hex Editor Neo观察下文件头,果不其然,伪造了文件头。

手动删掉前面字节,然后保存,再用播放器试试可以播放几秒钟视频,证明是可行的;

综合上面的实践;

下载思路如下:

  1. 下载分片文件(curl)
  2. 裁剪掉分片文件的伪造前缀(dd)
  3. 合并分片为mp4(ffmpeg)

考虑文件很多,决定写一个脚本来操作,由于文件是放置在远程服务器,而且文件经过”处理“,我们先统一下载下来,然后再统一截掉文件的伪造头,最后用ffmpeg神器合并成mp4;

ffmpeg安装参考这个链接:
https://www.cnblogs.com/wangjie20200529/p/15351205.html

# 编译方式安装ffmpeg
# 依赖包安装
yum install autoconf automake gcc gcc-c++ git libtool make nasm pkgconfig zlib-devel -y
# 下载安装源
wget http://www.ffmpeg.org/releases/ffmpeg-4.1.tar.gz
# 解压缩安装包
tar -zxvf ffmpeg-4.1.tar.gz
cd ffmpeg-4.1
./configure --prefix=/usr/local/ffmpeg
# 编译安装
make && make install
# 设置环境变量
echo "export PATH=$PATH:/usr/local/ffmpeg/bin" >> /etc/profile
# 环境变量生效
source /ect/profile
# 查看版本
ffmpeg -version# 注意
# 若安装过程中出现以下错误:
yasm/nasm not found or too old. Use –disable-yasm for a crippled build.
If you think configure made a mistake, make sure you are using the latest
version from Git. If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file “config.log” produced by configure as this will help
solve the problem.# 需要安装yasm
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar -zxvf yasm-1.3.0.tar.gz
cd yasm-1.3.0 # ./configure
make && make install

分片伪装成jpg,这是个相当有意思的事情,这样处理,我原以为是为了混淆加密,实际上应该不是,这”加密“太简单一眼识破。我在这个小视频网站下载了好几部电影,才发现了分片的url对应的服务器,居然都是快手之类的文件存储服务器;
这小站点把视频化整为零,白嫖大厂文件存储服务器,为了绕过厂家的限制,还将其视频伪装成图片文件(类似于图床);我又想起进站的公告提示,hahaha牛皮,还是他们会玩。

最后给出脚本:

#!/bin/bash
# 本脚本批量下载m3u8分片,再合并成mp4,依赖ffmpeg
# 使用方法:sh downm3u8.sh xxx.m3u8 119
# --参数1:m3u8文件名字,带后缀(和本脚本放在同级目录)
# --参数2:分片跳过的开头字节数,不用跳过请输入0 (处理伪装成jpg/png的情况)
# 最终合并输出路径:同级目录,target/xxx.m3u8/final/xxx.m3u8.mp4# 输出文件夹相对脚本路径
origin_path=target/$1/origin
transfer_path=target/$1/transfer
# 合并后的mp4文件路径
final_path=target/$1/final
# 分片url匹配前缀
url_prifix="http"
# 新生成的链接本地分片的m3u8文件
merge_m3u8=$1.m3u8
# 跳过的分片头的字节数
skip_byte=$2
# 分片处理计数器
declare -i num=0;
start_time=$(date +%s)# 下载片段和裁剪字节
dealDown(){# tr -d '\r' 去掉文本文件中行末的换行符,要进行删除url=$(echo "$1" | tr -d '\r')# 源文件名origin_name=$(echo ${url##*/})# 处理后文件名transfer_name=$(echo ${origin_name%\.*}).mp4# 下载文件curl -s -o $origin_path/$origin_name $url# 下载后,改后缀名,再删除前n个字节,jpg伪装origin_file=$origin_path/$origin_nametransfer_file=$transfer_path/$transfer_namedd if=$origin_file of=$transfer_file bs=16M iflag=skip_bytes skip=$skip_byte >/dev/null 2>&1echo $transfer_file >> $merge_m3u8num=$((num+1))printf "已下载:\r%d 个,进行中..." $num
}# 创建保存目录
mkdir -p $origin_path $transfer_path $final_path# 创建m3u8合并索引文件,并置空
cat /dev/null > $merge_m3u8while read line
doif [[ $line =~ http ]]thendealDown $lineelseecho $line >> $merge_m3u8fi
done < $1 echo 下载完成# 处理 ffmpeg合并m3u8串流
ffmpeg -i $merge_m3u8 -c copy $final_path/$1.mp4echo ffmpeg合并视频完成end_time=$(date +%s)
cost_time=$[ $end_time-$start_time ]echo "开始时间: $start_time"
echo "结束时间: $end_time"
echo "累计耗时: $(($cost_time/60))min $(($cost_time%60))s"

m3u8视频下载和转码mp4相关推荐

  1. Python 实现 m3u8 视频下载

    Python 实现 m3u8 视频下载 m3u8 是一种基于文本的媒体播放列表文件格式,通常用于指定流媒体播放器播放在线媒体流.它是一个简单的文本文件,其中包含多个由 URI 引用的媒体资源文件的 U ...

  2. M3U8视频下载合并工具

    M3U8视频下载合并工具 M3U8视频下载合并工具是一款将网络上切片的M3U8文件下载合并成视频的工具,软件操作简单实用方便. 使用方法 将M3U8地址填入文件地址内,填入文件名 点击添加任务,在点击 ...

  3. 如何将视频下载并且转码拼接

    简单来说每个视频网站,每个视频网站都会有自己的视频播放格式.具体事例为优酷KUX,爱奇艺QSV,腾讯QLV.而腾讯视频目前还没有具备转码功能,所以视频下载的时候经常会出现一些困扰,那就是不使用腾讯播放 ...

  4. M3U8视频下载实现

    前段时间由于业务需要,需要做一个视频下载的功能,包括m3u8视频和mp4视频等,于是在Github上找了几个相关的下载库,发现要不是太久没有更新了,要不就是不太符合我们的需求,所以干脆就手撸了一个M3 ...

  5. 加密的m3u8视频下载支持本地m3u8

    m3u8合并解密下载2.3版本 qq群:366950911 支持QQ.UC浏览器等缓存视频合并解密(此软件免费使用),以及KEY大小是16字节的都可以解密,如下图: 如果您无法获取KEY,或者KEY二 ...

  6. 【探索】“m3u8” 视频下载

    缘由 今天搜FAGNHUA电影种子,只找到了一个在线播放的,并没有提供下载入口.这两天刚好又学了点前端知识,心血来潮想找出视频源地址给下下来. 分析过程 在线播放地址:http://www.a2dy. ...

  7. 海康威视Android开发 视频下载以及转码

    下载: 初始化连接登录就不说了直接说下载通过下面这句代码 HCNetSDK.getInstance() .NET_DVR_GetFileByTime("登录返回的userid", ...

  8. QQ视频下载并转化为mp4

    QQ对视频的地址进行了严格的保密,是无法通过读取网页源码来获取地址并下载的,只能通过QQ软件下载并转化. 找到嵌套在任意页面的QQ视频,正常播放之后,直接拖到结尾处,会出现添加到收藏的的按钮,点击之后 ...

  9. m3u8视频下载器,可下载各大视频网站资源(自动合并切片)

    简介: m3u8下载器让你轻松下载各种给不同类型的文件数据,支持离线下载还有强大的搜索引擎还有丰富的功能等你来体验,下载的同时还可以浏览视频文件,支持m3u8格式视频的转换还有强大的且流畅的播放体验, ...

  10. 【Python实战案例】Python3网络爬虫:“可惜你不看火影,也不明白这个视频的分量......”m3u8视频下载,那些事儿~

    前言 哈喽!上午好嘞,各位小可爱们!有没有等着急了呀~ 由于最近一直在学习新的内容,所以耽搁了一下下,抱歉.jpg 双手合十. 所有文章完整的素材+源码都在

最新文章

  1. UI设计师必备技能,看看你都学会了吗?
  2. 医药信息化:GMP/GSP之后
  3. GPT-3 1750亿参数少样本无需微调,网友:「调参侠」都没的当了
  4. Ril分析五——ril学习总结
  5. VS2013打包VC++程序
  6. java中队列链表栈的作用_Java用链表实现栈和队列
  7. R-3.1.1 编译安装
  8. java 等待几秒_问懵逼:请站在 JVM 角度谈谈 Java 的锁?
  9. 下列关于线程调度的叙述中,错误的是()。
  10. Java排序之归并排序
  11. 0xc0000225无法进系统_win10系统出现0xc0000225无法进入系统的恢复方法
  12. CentOS7.6安装VNC
  13. 图片云存储服务商在阿里云和又拍云之间如何选择?
  14. iOS-内购注意 沙盒二次验证
  15. 「NOI2018」冒泡排序
  16. 简单电脑版微信双开方法多开bat分身代码教程
  17. 各种 PNG图片压缩对比分析
  18. final修饰的变量就是常量?final修饰局部变量在栈还是堆还是常量池中?
  19. 什么是Beta Finance
  20. MySQL鲜为人知的排序方式

热门文章

  1. ios和Android的PK
  2. GCD栅栏函数和信号量
  3. “新元宇宙”奇科幻小说原创作品系列连载《地球人奇游天球记》第三回零点惊魂
  4. Node.js版-七夕无事,人艰勿拆,求别说...
  5. 红月服务器制作过程,红月3.8C私服架设教程
  6. 深信服 SANGFOR 设备密码恢复和配置备份恢复
  7. 团队展示——我说的都队
  8. 谁说技术男没有人文情怀:当旅途遇到生命赞歌
  9. 如何给linux预装一些工具,linux 下的一些基本工具的使用方法
  10. Python 微信公众号文章爬取 简单记录一下