yt-dlp和streamlink目前都没有对应实时抓流Instagram live stream,pyinstalive又停止维护了(其实还没试),这几天自己开ins直播研究了一下,整出了个相对简单的方法。
至于为什么要挑战live抓流,因为有人开ins live不留回放(悲),但大多数人都是会贴心地留回放的,基本上要应对的只有这种不留档的情况。
准备三大件:ffmpeg、N_m3u8DL-RE、浏览器插件猫抓
N_m3u8DL-RE要配合ffmpeg工作,ffmpeg记得加入系统变量或者和N_m3u8DL-RE放在同一文件夹下 或者可以加一行代码自定义ffmpeg的位置,下面有提
首先等对方开播,打开https://www.instagram.com/coco_hayashi.official/live/,点击播放开播,然后查看猫抓,下载MPD文件
猫抓的DASH部分文档:https://o2bmm.gitbook.io/cat-catch/docs/mpdparse
选择mpd文件,点击这里解析
右键复制这段链接
在N_m3u8DL-RE所在的文件夹内打开CMD输入:
N_m3u8DL-RE --save-name <保存文件名> --save-dir <你的保存路径> --download-retry-count 5 --auto-select --custom-proxy http://127.0.0.1:7890 --thread-count 16 --check-segments-count -H "referer: https://www.instagram.com/" --live-pipe-mux "<url>"
命令内容解说:
--save-name <保存文件名>
--save-dir <你的保存路径>
--custom-proxy http://127.0.0.1:7890 # 你的代理端口
"<url>" # 输入刚才复制的mpd地址 url格式比较复杂,建议前后加上英文双引号
不过我还挺意外的,ins直播这块访问MPD和视频切片本身不需要Cookie,只要加一下Referer就可以了。
还有就是如果ffmpeg所在的路径没有加入系统变量,可以加入下面那一行
--ffmpeg-binary-path <PATH> # 自定义ffmpeg文件的路径
然而这里还没有结束,N_m3u8DL-RE在下载DASH直播这里有点小问题,ins直播流停止之后,N_m3u8DL-RE不会进入后续转码处理,所以这里我加入了「--live-pipe-mux」选项,让N_m3u8DL-RE在下载时可以实时把内容输入进<保存文件名>.ts文件(N_m3u8DL-RE文档里的描述:录制直播并开启实时合并时通过管道+ffmpeg实时混流到TS文件)
当推流结束,N_m3u8DL-RE的下载流程卡住的时候,使用快捷键Ctrl+C强行关闭,然后查看<你的保存路径>下的文件夹,会有名称为<保存文件名> 的文件夹和<保存文件名> .ts文件,那个ts文件就是已经合并好的ins直播流文件了。这时候已经可以把缓存文件夹删掉了
配合猫抓设置,一键复制下载命令
打开猫抓的设置,找到这里:
在DASH mpd文件这里输入:
N_m3u8DL-RE --save-name "${title}_${now}" --custom-proxy http://127.0.0.1:7890 #记得换成你自己的代理端口 --download-retry-count 5 --auto-select --thread-count 16 --check-segments-count --live-pipe-mux ${referer|exists:'--header "referer: *"'} "${url}"
以后在ins直播界面点击这里就可以直接复制了:
复制完之后把这个往命令行界面里一丢(和minyami的情况有点类似)就OK了
ONE MORE THING
但这里还有个方法,就是手动合并缓存文件,使用这种方法的话可以把--live-pipe-mux给去掉,然后打开缓存文件夹,差不多是这么个格式:
上面两个分别是音频和视频的文件夹
音频和视频的文件夹差不多是这个格式:
分别打开音频和视频的文件夹,按shift+文件夹空白处右键打开cmd,输入
copy /b _init.mp4+*.m4s output.mp4
这行内容对两个文件夹的效果是一样的
这时候如果你点开output.mp4的话,虽然内容确实是合并了,但是是只有_init.mp4的2秒内容的,但别急,打开ffmepg把两个output.mp4复制流并合并:
ffmpeg -i <音频mp4文件路径> -i <视频mp4文件路径> -c copy ins_stream.mp4
这时候出来的视频就是完整内容长度的了。