Git Product home page Git Product logo

b23downloader's Introduction


B23Downloader-icon
B23Downloader

B23Downloader: 下载B站 视频/直播/漫画

使用说明

Main Window

mainwindow

简单,但也够用了。没有历史记录功能。(当然,对于正在下载的任务,关闭程序后再打开还是在的)


下载位置

视频类

download-example-bangumi

在上图中,选择的下载位置为 E:/tmp,那么选中的两个视频分别下载到

  • E:/tmp/天气之子 原版.flv
  • E:/tmp/天气之子 预告花絮 MV1 爱能做到的还有什么.flv

漫画

download-example-manga

如上图,下载位置还是 E:/tmp,选中的两项分别下载到文件夹

  • E:/tmp/恋如雨止 81 第81话/
  • E:/tmp/恋如雨止 82 最终话/

漫画是一页一页下载的,在该示例中,82 最终话 将下载为 E:/tmp/恋如雨止 82 最终话/01.jpg - 32.jpg(32 张图片)。

目前删除漫画下载任务会粗暴地删除整个文件夹,如示例中的 E:/tmp/82 最终话/

直播

download-example-live

上图中,对话框的标题为 【哔哩哔哩英雄联盟赛事】【直播】HLE vs LNG,其命名规则为【<用户名>】<房间标题>,示例中用户名为 哔哩哔哩英雄联盟赛事,房间标题为 【直播】HLE vs LNG

下载文件的命名为 <标题> <下载开始时间>.flv,比如【哔哩哔哩英雄联盟赛事】【直播】HLE vs LNG [2021.10.05] 18.59.22.flv,其所在文件夹为上图中所选的 E:/tmp/

目前的直播下载任务策略为:

  • 暂停直播下载任务后重新开始,会写入另一个文件,比如 【哔哩哔哩英雄联盟赛事】【直播】HLE vs LNG [2021.10.05] 19.32.11.flv
  • 删除任务不会删除任何相关文件
  • 任务不会被保存,即退出程序后再启动,之前的直播下载任务不被保留

如果添加直播下载任务时,正在下载的任务数量超过最大可同时下载任务数(代码里硬编码为 3),那么这个直播下载任务会处于“等待下载”状态。


支持的 URL 输入

部分类型可以使用编号:

  • 视频 BV 或 av 号,如 BV1ab411c7Stav35581924
  • 剧集 ssid 或 epid,如 ss28341ep281280
  • live+直播房间号,如 live6

网络代理

暂未实现“设置”功能(以后有时间会加上的),代理跟随系统,你可以设置全局代理来下载地域限制内容(比如代理服务器在香港,那么可以下载“仅限港澳台地区”的动漫)。


Build-Issues

B23Downloader 使用 Qt 6 (C++ 17) 开发,虽然 Release 只有 Windows 64-bit 的,但你可以在其他桌面平台编译使用。

由于所有请求链接均采用 HTTPS,所以依赖 OpenSSL库。在 Windows 上,虽然 Qt Installer 可以勾选 OpenSSL Toolkit,但 Qt Installer 并不会设置好相关环境,于是会出现找不到 SSL 库的错误(如 TLS initialization failed),解决方法参考 TLS initialization failed on GET Request - Stack Overflow.


开发日志

  • 正在考虑代码重构

  • 2021/10/08 - 2021/10/11

    解决了一个老问题:下载的直播视频文件无法拖动进度条(需要极长时间来完成响应)

    最初我是用 ffmpeg 来下载直播的,那时得到的文件并没有问题。2021 年 05 月,我尝试用 wget 直接下载而不是通过 ffmpeg,发现下载的文件有「无法拖动进度条」的问题,如果用 ffmpeg 处理 (remux) 一下就正常了:ffmpeg -i <raw_file> -c copy <remuxed_file>

    由于不想引入 ffmpeg 依赖,而且 FLV 还算简单,我决定自己实现 FLV remuxing. 首先就是读 Adobe FLV 文档,挺少的也就 10 页。然后写了些代码解析并打印信息(FlvParse.exe 这小工具有些问题,没解析出 AMF Object,tag header 中 duration 也是错的)。

    FLV Parse Result: Live-SampleFLV Parse Result: Normal
    比对下载的直播原始数据和 B 站常规(非直播)视频 FLV,发现了以下问题:
    • 常规 FLV 文件的时间轴是从 0 开始的;而直播流 FLV 时间轴是直播已持续的时间,下载得到的文件时间轴并不是从 0 开始。在把时间轴改为从 0 开始后,PotPlayer 就能正常 seek 了
    • 常规视频头部的 onMetaData 中有个名为 keyframes 的 Object,包含 filepositions 和 times 两个数组。同时发现:
      • 对于 PotPlayer,FLV 有没有 keyframes 结构基本没有区别(这怎么做到的?!);
      • 对于 VLC,没有 keyframes 的话 seek 会很慢(磁盘开销大,应该是顺序读过去),不过之后再 seek 就很快了(应该是把读过的部分 keyframes 记下来了)。
    B站录播姬的做法是在头部留一个 spacer 大数组,其结构是:
    • "keyframes:{ "times":[], "filepositions":[], "spacer":[] }"
    如果关键帧 3 秒一个的话,占用一百多 KB 就能够支撑 5 小时。
    我的实现做了个小优化,把结构改成了:
    • "keyframes:{ "times":[], "spacer1":[], "filepositions":[], "spacer2":[] }"

    参考:Adoebe Flash Video File Format Specification Version 10.1.pdf
  • 2021/10/02

    在 Windows 上保证只运行一个实例

    位置:main.cpp

    需求:在打开时,如果应用已在运行,则弹出已在运行的应用窗口,新运行的应用退出。


    通过搜索引擎可以找到 QtSingleApplication, SingleApplication, 以及一些轻量些的解决方法。其中,因为一些资源在 Unix 平台上由 qt 而不是 os 拥有,其在程序崩溃后不会被回收,所以在 Unix 平台时要多一些操作。简单起见,我就不管 Windows 之外的平台了

    要判断应用是否已在运行,可以在执行时尝试创建某种命名的资源,如果返回错误“已被创建”,则说明应用已在运行。可选的有: QSharedMemory, QLockFile, CreateMutexA (WinApi) 等

    弹出已在运行的应用,网上找到的都是用 QLocalServerQLocalSocket 实现的,本质就是进程间通信。在 Windows 上,设置窗口到最前方 (foreground) 是有限制的,即应用不能自己把自己弹到最前面(防止流氓程序)。foreground 程序将另一个程序设置为 foreground 是允许的,这里新运行的那个程序就是 foreground。让新进程获取原进程的 hWnd (handle to a window),如果已最小化就调用 ShowWindow(hWnd, SW_RESTORE),否则调用 SetForegroundWindow(hWnd)


    最后选择用 QSharedMemory 来实现 HWND 的共享,QSharedMemory::create() 用来判断应用是否已运行。


最后感谢 SocialSisterYi/bilibili-API-collect: 哔哩哔哩-API收集整理,虽然 B23Downloader 里用的 API 有很大一部分是我自己后面找的。以后有时间也为这个仓库贡献一下。

b23downloader's People

Contributors

vooidzero avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

b23downloader's Issues

Qt 6.2 版本在 deploy 打包无法显示 SVG 图标

之前把 Qt 升到了 6.2 版本,deploy 打包时发现 SVG 图标显示不出来(在 Qt Creator 中启动应用是没问题的),一番探索后发现是 iconengines/qsvgicon.dll 没被加载。我不知道 Qt 6.2 版本对此有什么改动或者说我的 build 配置出了什么问题,不知道 PATH 为 Qt 安装目录时是怎么确定加载 iconengines 的。试过配置文件 qt.confQCoreApplication::addLibraryPath,没用。

试出的解决方法是,创建一个名为 plugins 的文件夹将 iconengines 放入其中。为了整洁把 platforms, stylestls 也放了进去。新的打包文件结构如下:

B23Downloader.exe
plugins:
    iconengines: [qsvgicon.dll]
    platforms: [qwindows.dll]
    styles: [qwindowsvistastyle.dll]
    tls: [qcertonlybackend.dll, qopensslbackend.dll, qschannelbackend.dll]
libgcc_s_seh-1.dll
...
Qt6Core.dll
...

Compile error (Qt 6.2.3 msvc2019_64)

main.obj : error LNK2019: 无法解析的外部符号 __imp_ShowWindow,函数 "void __cdecl raiseWindow(struct HWND__ * const)" (?raiseWindow@@YAXQEAUHWND__@@@Z) 中引用了该符号
main.obj : error LNK2019: 无法解析的外部符号 __imp_GetWindowPlacement,函数 "void __cdecl raiseWindow(struct HWND__ * const)" (?raiseWindow@@YAXQEAUHWND__@@@Z) 中引用了该符号
main.obj : error LNK2019: 无法解析的外部符号 __imp_SetForegroundWindow,函数 "void __cdecl raiseWindow(struct HWND__ * const)" (?raiseWindow@@YAXQEAUHWND__@@@Z) 中引用了该符号
debug\B23Downloader.exe : fatal error LNK1120: 3 个无法解析的外部命令

希望URL能够支持收藏类型

首先感谢作者的分享!

如题,有很多视频分类整理到了收藏夹,希望能够支持收藏页面的视频刮削以及下载。
或者能够支持批量添加URL。

关于 HLS 直播和 DASH 视频的下载

目前 B 站 Web 端有时会使用 HLS(切片长度为1秒,每个切片为 m4s 格式)。
LiveVideoStack - B站直播中HLS和去中心化P2P的实际应用


我在 10 月的时候研究了下 MP4 封装格式,参考的文档为 ***ISO IEC 14496-12***(正版要钱,不好找啊)

直播下载的需求是边下边看,长时间连续下载时切片是接受的(这是 FLV 直播下载的行为,连续 5 小时后会切片)

当时得出的结论是:

  • M4S 转封装为 FLV 不可行,因为 FLV 不正式支持 HEVC (H265) 从而播放器不能播放
  • 个人认为直接用 ffmpeg 并不是一个好方案,以 MP4 封装格式为例,ffmpeg 默认在结束时写入 moov (存放音视频元信息和索引),这样就不满足边下边看了;否则,由于索引结构的大小和时长成正比,在只生成一个目标文件的限制下,ffmpeg 会在结束时计算出索引结构的大小并移动整个文件(想象一下 C 数组在头部插入元素)。但这里切片是接受的,没必要这样做。
  • 拟定的解决方案与 FLV 类似。FLV 的 keyframes 对应过来是 sidx (segment idx)。

再往后,有时间的话会添加 MP4 分段合并、M4S 音视频流合并(vomic 目前没找到单文件下载的接口)、HDR 下载(B 站 HDR 只能通过 dash 方式下载)。

有些视频下载不了,没有批量下载up主视频功能

这个下载不了
https://www.bilibili.com/video/BV1Ms41117zY?spm_id_from=333.337.search-card.all.click
能不能批量下载up主全部视频,一个个点很麻烦
https://space.bilibili.com/9321976?spm_id_from=333.337.search-card.all.click
我是用笔记本链接联通WiFi下载,用的是IPV6,试过了很多软件,什么油猴脚本、UWP版、闪豆、bilibilivideodownload、下载姬,都是音频视频分开来下载的,没有一个能够从头到尾下载完上面的第二个链接的演唱会,都是下到半路就没速度了,重新开始任务也不会接着下载,后来找到哔哩哔哩2019上半年以前的安卓版本,缓存文件是blv,修改扩展名变成flv就能用,后来试用了B23Downloader,发现下载的也是flv格式,就算半路中断了还是可以继续下载,很不错。目前的需要完善一些设置:设置同时下载几个任务,出错自动重新开始恢复下载多少次,下载完成后自动关机,下载一个番剧,软件默认开三个下载任务,然后被服务器识别多线程自动停止下载文件,一个几十集的番剧我要反复点上百次全部开始,才能100%下载完成,要是能够像硕鼠那样自动恢复下载多好,隔壁那些软件的建议是不要开太多任务。这个软件跟闪豆一样不能用键盘shift选择其中几个任务删除,很奇葩,必须全部删除。flv转mp4这个可以找其他软件shanaencoder、xmedia recode、hybrid无损转换。

速度有时候跑不满

下载速度有时候才只有我网速的一半太慢了,啥都好就是可不可以搞个IDM多线程下载方式

提点小建议

下载的时候能重命名,下载直接默认标题的话不方便,希望能在下载的时候增加一个重命名文件的开关
还有下载格式,希望能直接选择纯音频或者原视频或者纯视频之类了
一经采用,请作者和奶茶。
谢谢!!!

视频名称前面累加序号功能

可以添加一个前置序号功能吗?我看有些多个视频的前面是没有序号的,可以就想能不能添加一个在每个视频名称前面累加一个序号(从1开始)的功能。

该视频当前画质有分段(不支持)

在下载时,遇到上述报错,各个画质都试了还是不行,有没有什么解决办法?
出错视频,BV19x411878L
其中,p7在1080p高清、720p高清、480p清晰下都报错,但在360p流畅时下载正常。
p1,p4,p6,p15~p20,在所有清晰度下均报错。
我下载的B23Dld-v0.9.5.7-win_64.zip直接解压使用的。
感谢

希望日后能添加选择视频编码功能

目前该软件只能下载H.264的flv文件,但是如果下载电影则体积有些巨大,如果能提供选项下载HEVC或者AV1编码的视频就更好了,并且现在B站也推出了无损音质功能,部分视频的音频编码有flac,希望日后能够添加支持,谢谢

请求增加网络错误后自动重试

发现有些下载项显示网络错误之后,手动重试可以正常下载,所以希望您可以考虑增加一个网络错误自动尝试重新连接的功能,多谢您,辛苦了!实在麻烦您了!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.