一般操作,打开需要下载缓存的视频后,点击下面的缓存按钮,选择你需要的清晰度,选好后点击下载就会在后台下载,直至缓存完毕;安卓手机使用自带文件管理器打开,在文件管理里,找到视频文件,把video.m4s 的视频文件改为.mp4,就可以使用手机内置的视频播放器播放.但是大家会发现,这个视频是没有声音的,因为现在单个缓存视频文件是以下的格式:
audio.m4s 是音频文件,video.m4s 是视频文件,两个文件合起来才是我们看到的视频,那有没有方法把这两个文件合成一个视频文件呢,这个是可以的,视频音频处理,一般采用的是ffmpeg技术,
ffmpeg相关的,可参考:ffmpeg常用命令_大渔歌_的博客-CSDN博客
(当然,安装的方法我们暂时就不讲了,网上一大堆,而且很简单)
我们常常缓存的视频,是多个(比如番剧,章节等),这里就需要用到我们的bat 批处理,相关bat,大家可以参考如下:
1. ffmpeg 音视频处理
ffmpeg -i 音频 -i 视频 -vcodec copy -acodec copy -f mp4 文件名字
ffmpeg 处理音视频功能很强大,大家有兴趣可以了解/学习一下,我平时也是简单使用一点,感觉很好玩.
2.文件名获取
缓存的单个视频文件夹,我们可以看到有一个entry.json文件,该文件保存的是该节目(大的场景)的信息和该视频(单个视频)的信息,比如,文件名,我们合成视频的时候还是希望视频文件的名字和手机上看到的一样,有助于识别(早期的时候我都是按照顺序,给视频命名1.MP4,2.MP4.....有时候顺序还会出错,很是麻烦,)
这里有个问题,该视频的名字是存在entry.json文件中的,它内容就是一个json字符串,那如何获取到该名字呢,我试着用 .bat获取,可能是我.bat 知识储备有点少,没做做出来,然后我就退一步,用java直接获取各文件中json 对应的名字,保存在一个txt文件中(注意,改txt文件要修改编码格式为ANSI,可通过另存为 来实现)
以下为java代码:
public static void main(String[] args) {
List<String> listContent = new ArrayList<>();
try{
File file = new File("D:\\Bili\\rk");
File[] tempList = file.listFiles();
for(int i = 0;i < tempList.length;i++){
File[] list = tempList[i].listFiles();
for(int j = 0;j < list.length;j++){
if(list[j].toString().contains(".json")){
String s1 = readFileByLines(list[j].getAbsolutePath().toString());
JSONObject json = JSONObject.fromString(s1);
System.out.println(json.getJSONObject("page_data").get("part"));
//todo
break;
}
}
}
Collections.sort(listContent);
for(int i = 0;i<listContent.size();i++){
System.out.print(listContent.get(i) + "\n");
}
}catch(Exception e){
e.printStackTrace();
}
}
public static String readFileByLines(String fileName) {
FileInputStream file = null;
BufferedReader reader = null;
InputStreamReader inputFileReader = null;
String content = "";
String tempString = null;
try {
file = new FileInputStream(fileName);
inputFileReader = new InputStreamReader(file, "utf-8");
reader = new BufferedReader(inputFileReader);
// һ�ζ���һ�У�ֱ������nullΪ�ļ�����
while ((tempString = reader.readLine()) != null) {
content += tempString;
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
return content;
}
把获取到的所有的视频标题都存放在name.txt中(记得去除标题的空格,因为视频合成的时候,空格有可能会影响ffmpeg 的识别/合成)
3.批处理
视频合成,我们知道要用到的是for 功能进行循环处理(可参考),有一点要注意的是,怎么让合成的视频和name.txt的每一行标题名对应起来,这就需要精准读取name.txt指定某一行名字, 那如何读取name.txt某一行的名字呢,测试bat 如下,比如要只读取第三行( 注意,该txt文件和 .bat文件放在同一文件夹下):
@echo off
setlocal enabledelayedexpansion
set /a row=0
for /f "tokens=*" %%i in (name.txt) do (
set /a row+=1
if !row!==3 echo %%i
)
pause
这个问题解决了,我们就可以批处理所有的了,如下( 注意,该txt文件和 .bat文件放在同一文件夹下):
@echo off
setlocal enabledelayedexpansion
rem 要读取的文件
set filedir=D:\Bili\rk\*
rem 视频要输出到的文件夹
set outpath=D:\Bili\rk2\
set /a count=0
set name=test
for /d %%i in (%filedir%) do (
echo ==============================
rem 截取文件名称字符串
rem 注意要修改截取的位置跟输入路径有关系
rem 第几个文件
set /a count+=1
echo !count!
rem name.txt对应的第几行
set /a row=0
for /f "tokens=*" %%i in (name.txt) do (
set /a row+=1
if !row! == !count! set name=%%i
)
echo name = !name!
set video=%%i\32\video.m4s
set audio=%%i\32\audio.m4s
echo 输出文件到: %outpath%!name!.mp4
rem 如果文件夹不存在则创建文件夹
if not exist %outpath% (md %outpath% )
rem 使用ffmpeg命令合成哔哩哔哩的音频、视频文件
ffmpeg -i !audio! -i !video! -vcodec copy -acodec copy -f mp4 %outpath%!name!.mp4
)
pause
以上处理之后就可以获取到带有标题名的视频了,
以上仅供学习参考