看到一部电影很喜欢,想下载保存收藏,但是很多影视网站出于版权和成本(节省带宽)原因,都不提供下载功能了;
既然能通过网页播放,肯定可以想方法缓存起来;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观察下文件头,果不其然,伪造了文件头。

手动删掉前面字节,然后保存,再用播放器试试可以播放几秒钟视频,证明是可行的;
综合上面的实践;
下载思路如下:
考虑文件很多,决定写一个脚本来操作,由于文件是放置在远程服务器,而且文件经过”处理“,我们先统一下载下来,然后再统一截掉文件的伪造头,最后用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_name
transfer_file=$transfer_path/$transfer_name
dd if=$origin_file of=$transfer_file bs=16M iflag=skip_bytes skip=$skip_byte >/dev/null 2>&1
echo $transfer_file >> $merge_m3u8
num=$((num+1))
printf "已下载:\r%d 个,进行中..." $num
}
# 创建保存目录
mkdir -p $origin_path $transfer_path $final_path
# 创建m3u8合并索引文件,并置空
cat /dev/null > $merge_m3u8
while read line
do
if [[ $line =~ http ]]
then
dealDown $line
else
echo $line >> $merge_m3u8
fi
done < $1
echo 下载完成
# 处理 ffmpeg合并m3u8串流
ffmpeg -i $merge_m3u8 -c copy $final_path/$1.mp4
echo 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"

我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1
这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e
我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案