bat 批处理 B站缓存视频转成 .mp4格式

6 篇文章 16 订阅

        一般操作,打开需要下载缓存的视频后,点击下面的缓存按钮,选择你需要的清晰度,选好后点击下载就会在后台下载,直至缓存完毕;安卓手机使用自带文件管理器打开,在文件管理里,找到视频文件,把video.m4s 的视频文件改为.mp4,就可以使用手机内置的视频播放器播放.但是大家会发现,这个视频是没有声音的,因为现在单个缓存视频文件是以下的格式:

        audio.m4s  是音频文件,video.m4s 是视频文件,两个文件合起来才是我们看到的视频,那有没有方法把这两个文件合成一个视频文件呢,这个是可以的,视频音频处理,一般采用的是ffmpeg技术,

        ffmpeg相关的,可参考:ffmpeg常用命令_大渔歌_的博客-CSDN博客

(当然,安装的方法我们暂时就不讲了,网上一大堆,而且很简单)

        我们常常缓存的视频,是多个(比如番剧,章节等),这里就需要用到我们的bat 批处理,相关bat,大家可以参考如下:

.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

以上处理之后就可以获取到带有标题名的视频了,

以上仅供学习参考

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值