楼主是个爱偷懒的奇葩,希望在不依赖于 Chrome 插件的情况下,楼主企图利用自定义协议去启动本地的 FFMPEG 来保存 M3U8 的视频。
FFmpeg自定义协议注册表- Windows Registry Editor Version 5.00
-
- [HKEY_CLASSES_ROOT\ffmpeg]
- @="URL:ffmpeg Protocol"
- "URL Protocol"=""
-
- [HKEY_CLASSES_ROOT\ffmpeg\shell]
-
- [HKEY_CLASSES_ROOT\ffmpeg\shell\open]
-
- [HKEY_CLASSES_ROOT\ffmpeg\shell\open\command]
- @="\"D:\\Software_Temp\\M3U8 Downloader 0.1.1\\Tools\\ffmpeg.bat\" \"%1\""
复制代码 Bat 内容- @echo off
- cd /d %~p0
- for /f "tokens=1,2 delims=," %%i in (%1) do (
- set url=%%i
- set filename=%%j
- )
-
- ffmpeg.exe -i "%url:~9%" -c copy -y -bsf:a aac_adtstoasc "F:\Download_M3U8\%filename%.mp4"
- rem ffmpeg.exe" -i "%%i" -c copy -y -bsf:a aac_adtstoasc "%%j.mp4"
- echo.
- echo 视频下载完成
- pause
复制代码 但 URL Protocol 传送的参数会进行URI编码,导致无法使用传送的中文内容来保存
如:- ffmpeg://www.baidu.com,百度
复制代码 得到的是- ffmpeg://www.baidu.com,%E7%99%BE%E5%BA%A6
复制代码 我想尝试改为使用 JS 来运行ffmpeg,但是 JS 似乎无法得到传参的内容,VBS 没有URI的解码函数。
求大神支招,该如何对这个 URI 进行解码,并作为文件名输出。
JS、VBS、Bat 三种方案都可以,混编也行。
纯 JS 解决方案
注册表- [HKEY_CLASSES_ROOT\ffmpeg]
- @="URL:ffmpeg Protocol"
- "URL Protocol"=""
-
- [HKEY_CLASSES_ROOT\ffmpeg\shell\open\command]
- @="wscript -nologo -e:jscript \"D:\\Software_Temp\\M3U8 Downloader 0.1.1\\Tools\\ffmpeg.js\" \"%1\""
复制代码 最后解决方案使用纯 JS 来进行
原来之前以为 Arguments 是 WSH 的属性,所以一直没有得到参数。- var wsh=new ActiveXObject("WScript.Shell");
- //获得 URL Protocol 参数,并进行数组分割,WScript.Arguments的下标使用圆括号,数组为方括号
- var Args=WScript.Arguments(0).split(",");
-
- var ProgramFloder=WScript.ScriptFullName.replace(/[^\\]+$/,''),
- Program=ProgramFloder+"ffmpeg.exe",
- M3U8Url=Args[0].replace(/^ffmpeg:\/\//i,''),
- webTitle=decodeURIComponent(Args[1]).replace(/[\/|*?"<>:]/gm,'_');
- wsh.Run("\""+Program+"\""+" -i "+M3U8Url+" -c copy -y -bsf:a aac_adtstoasc F:\\Download_M3U8\\"+webTitle+".mp4");
复制代码
|