使用 ffmpeg 拼接 bilibili 网页版抓取的分段 flv 视频

Author Avatar
黎明余光 2017年08月26日
  • 在其它设备中阅读本文章

分段是个好东西,然而等想要完整缓存的时候就非常要命了...

缘起

昨天在 B 站上花 5 B 币买了《你的名字。》,然后就试图把它搞到本地。客户端是没法下载的,提示版权受限,原因都知道。然后就要用某些特殊的方式抓 URL 了,蠢蠢地一段段下载(

update @2017.8.29: 现在手机客户端可以正常缓存了...

1080P 版君名总共有 18 个分段 ,所以肯定要合并啊。
分段命名大概长这样:

snipaste_20170826_111213.png

需求

  • 合并分段的 flv 文件到一个文件;
  • 操作方便;
  • 速度尽可能地快。

解决方案

第一时间只想到了 ffmpeg,然后折腾了半天写了个 PHP Script 自动写列表,用别的怕是都合完两遍了... 感觉自己好蠢

ffmpeg 使用还是相当方便的,只需要一个文件列表(e.g. ff.txt),长这样:

file '1.flv'
file '2.flv'
file '3.flv'
file '4.flv'
file '5.flv'

然后一行命令

ffmpeg -f concat -i ff.txt -c copy output.mp4

然而像我这么懒的人怎么可能去手动打个文件列表出来...

写个脚本

当然是选择 全世界最好的语言 PHP 啊,因为其他都不会(
然而 PHP 直接 scandir 的排序会不正确,因为分段数大于 10,最后结果会这样:

22500529-1-hd.flv
22500529-10-hd.flv
22500529-11-hd.flv
22500529-12-hd.flv
22500529-13-hd.flv
22500529-14-hd.flv
22500529-15-hd.flv
22500529-16-hd.flv
22500529-17-hd.flv
22500529-18-hd.flv
22500529-2-hd.flv
22500529-3-hd.flv
22500529-4-hd.flv
22500529-5-hd.flv
22500529-6-hd.flv
22500529-7-hd.flv
22500529-8-hd.flv
22500529-9-hd.flv

于是决定用正则去匹配分段 ID(e.g. 22500529-13-hd.flv 中的 13),存进一个数组,然后按顺序去遍历这个数组,顺序就正确了,还不用动原文件名(主要是强迫症)

<?php
echo "Making a list..." . "\n";

foreach(scandir("./") as $name) {
    if (preg_match_all("/[0-9]+-(.*)-hd.flv/", $name, $id)) {
        $file[$id[1][0]] = $name;
    }
}

if (empty($file)) {
    echo "Can't find any video.\nExit.";
    exit;
}

$list = "";

for ($i = 1; true; $i++) {
    if (!isset($file[$i+1])) {
        $list .= "file '" . $file[$i] . "'";
        break;
    }
    $list .= "file '" . $file[$i] . "'\n";
}

file_put_contents("./ff.txt", $list);

echo "Using ffmpeg to merge..." . "\n";

passthru("ffmpeg -f concat -i ./ff.txt -c copy output.mp4");

echo "Done.";

效果

snipaste_20170826_113317.png

snipaste_20170826_113654.png

参考链接

本文链接:https://blog.lim-light.com/archives/use-ffmpeg-to-concat-flv-videos-downloaded-from-bilibili-web.html
本文采用 CC BY-NC-SA 3.0 CN 协议进行许可,阅读 相关说明

    蠢蛋小丑魚
    蠢蛋小丑魚  2018-07-14, 20:06

    为什么合并后,一直是在重复第一个片段呢?

    Vixbob
    Vixbob  2017-11-10, 21:18

    诶嘿嘿,博主能分享一下吗

    xtlsoft
    xtlsoft  2017-08-29, 12:20

    好像不需要吧。。。
    直接 glob("*.fiv");
    还有文件名除了数字好像是一样的哎。

      黎明余光
      黎明余光  2017-08-29, 12:23

      顺序也是错的,用 ffmpeg 合成会导致时间轴不正确

    逗妇乳
    逗妇乳  2017-08-28, 18:42

    有bt种子吗?我还没看过

    挖站否
    挖站否  2017-08-28, 14:44

    为什么日本的动漫在百度网盘几乎被封杀了?是不是版权保护太严重了?

      黎明余光
      黎明余光  2017-08-28, 14:58

      没有那么严重吧,被封的主要是被焚化局列入黑名单的或者里番,其他一般不会封

    FGHRSH
    FGHRSH  2017-08-26, 22:17

    (`・ω・´) 首批入了个大会员,然后现在看啥都能免费看..

      黎明余光
      黎明余光  2017-08-26, 22:20

      送的大会员过期了,然后现在续不起了(´;ω;`)