下载某直播的回放视频

作为一个技术人,工作中无时无刻不穿插着技术,如果技术有幸能在我们除工作之外的生活中有用武之地,我相信大部分技术人会很开心、欣慰,我正是如此。就我个人经历,早期有用过某个 Markdown 软件,发现它能集成七牛云、又拍云作图床,可唯独没有阿里云 OSS,但它开放了入口可集成自定义图床,于是我开发了个应用发布到公网,自此之后享受着粘贴图片到写作窗口它就行自行上传的快感。虽然功能简单实现成本不高,但我热爱的技术与我的日常生活产生了交集,我很开心。

今天,又发生了一件让我开心的事情。老婆公司在某直播平台做了场直播,想把直播视频下载下来进行二次剪辑,问了她公司的技术,技术人员说那视频下载不了,老婆便找我让想办法。我打开 Chrome 观察请求发现回放的视频是一段段的 TS 文件,它们的路径相同且文件名命名有规则,比如 *.ts,* 是从 0~600,做了尝试发现这之间的文件也都存在。那就好办了,把这些文件都下载下来给合并下就能得到完整的视频文件。按照这种思路得到了完整的回放视频,老婆把我夸了个够。

下面记录下操作细节,主要操作步骤如下:

  1. Java 代码实现下载 TS 文件到本地
  2. 合并 TS 文件

Java 代码实现下载 TS 文件到本地

主要用到了 commons-io 包下 IOUtils,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 起止文件 ID
int from = 0, end = 570;
// 视频地址
String uri = "{视频地址前缀}/%s.ts";
String path = "{本地目标路径}\\%s.ts";
IntStream.range(from,end)
.forEach(i -> {
try {
// 下载网络文件
byte[] bytes = IOUtils.toByteArray(new URI(String.format(uri, i)));
// 文件数量在 1000 个以内,加上 1000,保持有序,方便后续进行合并操作
try (OutputStream os = new FileOutputStream(String.format(path, 1000 + i))) {
// 存储文件到本地
IOUtils.write(bytes, os);
}
} catch (IOException | URISyntaxException e) {
throw new RuntimeException(e);
}
});

程序执行结束后,N 多个 TS 视频小文件被下载了下来,效果图:

合并 TS 文件

Widnows 系统下直接通过 copy 命令即可完成合并操作,MacOS 下可通过 cat 命令进行。以 Windows10 为例,新建文档,输入以下内容:

copy /b *.ts video.ts

然后存储为 merge.cmd,双击该批处理程序执行,待 cmd 窗口修改即完成合并,下图展示了处理过程:

这里使用 copy 命令的文件合并功能进行 ts 文件的合并,copy 后面的 /b 参数表示把文件按二进制格式来合并,如果不加这个参数,则会把目标当成文本文件来合并,并在文件内添加不必要的标记,这会导致播放出错,所以必须加 /b 参数。


下载某直播的回放视频
https://blog.yohlj.cn/posts/8b0d818c/
作者
Enoch
发布于
2020年11月21日
许可协议