哔哩哔哩视频与音频文件流合并

ffmpeg下载地址:http://www.ffmpeg.org/download.html

这里下载Windows版本的:ffmpeg-4.2.2-win64-static.zip

解压后bin目录下的内容(假设在D盘的bin路径下):

public class App {
    // ffmpeg.exe全路径
    private static final String FFMPEG_PATH = "D:/bin/ffmpeg.exe";

    public static void main(String[] args) throws Exception {
        File rootDir = new File("C:"+File.separator+"哔哩哔哩"+File.separator+"xx视频");
        String outputDir = rootDir.getAbsolutePath() + File.separator + "out";
        // 开始处理文件
        renameAndCopyFile(rootDir, outputDir);
    }

    /**
     * 具体合成视频函数
     *
     * @param videoInputPath ?? 原视频的全路径
     *
     * @param audioInputPath ?? 音频的全路径
     *
     * @param videoOutPath   ?? 视频与音频结合之后的视频的路径
     */
    public static void convetor(String videoInputPath, String audioInputPath, String videoOutPath) throws Exception {
        Process process = null;
        InputStream errorStream = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader br = null;
        try {
            // ffmpeg命令
            String command = FFMPEG_PATH + " -i " + videoInputPath + " -i " + audioInputPath
                    + " -c:v copy -c:a aac -strict experimental " + " -map 0:v:0 -map 1:a:0 " + " -y " + videoOutPath;
            process = Runtime.getRuntime().exec(command);
            errorStream = process.getErrorStream();
            inputStreamReader = new InputStreamReader(errorStream);
            br = new BufferedReader(inputStreamReader);
            // 用来收集错误信息的
            String str = "";
            while ((str = br.readLine()) != null) {
                System.out.println(str);
            }
            process.waitFor();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                br.close();
            }
            if (inputStreamReader != null) {
                inputStreamReader.close();
            }
            if (errorStream != null) {
                errorStream.close();
            }
        }
    }

    // 遍历每个路径,找到entry.json文件所在路径
    public static void renameAndCopyFile(File rootDir, String outputDir) throws Exception {
        File dir = rootDir;
        if (dir == null) {
            return;
        }
        File[] files = dir.listFiles();
        if (files == null || files.length == 0) {
            return;
        }
        String fileName = null;
        for (File f : files) {
            if (f.isFile()) {
                fileName = f.getName();
                if ("entry.json".equalsIgnoreCase(fileName)) {
                    String jsonStr = FileUtils.readFileToString(f, "UTF-8");
                    if (jsonStr == null || jsonStr.isEmpty()) {
                        return;
                    }
                    Entry entry = getEntry(jsonStr);
                    // 文件名
                    String realFileName = entry.page_data.part;
                    realFileName = realFileName.replaceAll("\\s+", "-");
                    // 开始迭代查找视频和音频文件,并将数据拷贝到其他地方
                    List<FileInfo> fileList = findVideoAudioFile(dir);
                    // 对文件进行合并
                    String videoInputPath = null;
                    String audioInputPath = null;
                    String videoOutPath = outputDir + File.separator + realFileName + ".mp4";
                    System.out.println(videoOutPath);
                    for (FileInfo info : fileList) {
                        if ("audio.m4s".equalsIgnoreCase(info.fileName)) {
                            audioInputPath = info.file.getAbsolutePath();
                        }
                        if ("video.m4s".equalsIgnoreCase(info.fileName)) {
                            videoInputPath = info.file.getAbsolutePath();
                        }
                    }
                    convetor(videoInputPath, audioInputPath, videoOutPath);
                }
            } else if (f.isDirectory()) {
                renameAndCopyFile(f, outputDir);
            }
        }
    }

    private static List<FileInfo> findVideoAudioFile(File dir) {
        if (dir == null) {
            return new ArrayList<FileInfo>();
        }
        File[] files = dir.listFiles();
        if (files == null || files.length == 0) {
            return new ArrayList<FileInfo>();
        }
        List<FileInfo> result = new ArrayList<FileInfo>();
        String fileName = null;
        for (File f : files) {
            if (f.isFile()) {
                fileName = f.getName();
                if (fileName.endsWith("m4s")) {
                    result.add(new FileInfo(f));
                }
            } else if (f.isDirectory()) {
                result.addAll(findVideoAudioFile(f));
            }
        }
        return result;
    }

    public static class FileInfo {
        public File file;
        public String fileName;

        public FileInfo(File file) {
            this.file = file;
            if (file != null) {
                fileName = file.getName();
            }
        }
    }

    // 解析bilibili下的entry.json文件
    public static Entry getEntry(String jsonText) {
        return JSON.parseObject(jsonText, Entry.class);
    }

    public static class PageData {
        // 文件名
        public String part;
    }

    public static class Entry {
        // 是否已经下载完成
        public boolean is_completed;
        // 课程名/专辑名
        public String title;
        // 文件信息
        public PageData page_data;
    }
}

ffmpeg相关指令:http://ffmpeg.org/ffmpeg.html

原文地址:https://blog.51cto.com/dengshuangfu/2484057

时间: 2024-10-12 16:24:31

哔哩哔哩视频与音频文件流合并的相关文章

MediaInfo用来分析视频和音频文件的编码和内容信息的超好用工具

转载:http://blog.csdn.net/ameyume/article/details/6718705 MediaInfo简介 MediaInfo 用来分析视频和音频文件的编码和内容信息. MediaInfo 是自由软件 (免费使用.免费获得源代码,许可协议:GNU GPL/LGPL) 下载地址: windows版: http://mediainfo.sourceforge.net/zh-CN ubuntu版: http://mediainfo.sourceforge.net/zh-CN

获取google翻译的音频文件_合并音频文件的方法

1. 把引文输入google 翻译,然后点击“朗读” 2. 按下F12键,打开也变调试窗口,在网络标签页中,算中“媒体”列表,删选出媒体文件如下: 3. 获取音频文件 选中请求网址,复制网址,在浏览器中黏贴,访问 右键弹出菜单中,选中“另存为”,即可获取“音频文件” 4. 合并音频文件片段 因为google翻译,会截取翻译的段落为一段一段,所以获取的翻译文件也是一段一段的. 分别下载后,并按照顺序明明每个音频文件. 如文件 0001.MP3, 0002.mp3, 0003.MP3 算中第一个文件

Video Converter Movavi for Mac(视频与音频转换工具)

Video Converter Movavi for Mac版是Mac os平台上一款方便快键的Mac视频转换软件,Video Converter Movavi for Mac版不仅能够将你的视频转换成其他的格式,还能将你的音频转换成其他的播放格式,非常的方便使用,两个功能2合一. Video Converter Movavi for Mac软件介绍 Video Converter Movavi是一款功能强大但易于使用的视频和音频文件转换器,专门为Mac设计.它是在流行格式之间进行快速多媒体转换

弹幕视频网站的盈利模式 ——以哔哩哔哩弹幕网为例

2015 年 5 月 9 日发布的<传媒蓝皮书 :中国传媒产业发展报告 (2015)>指出,“2014 年网络广告收入首次超过电视广告”,其中贴片广告是网络广告收入的重要组成部分.而与优酷.爱奇艺等传统视频网站不同的是,以 ACG(ACG 为英文Animation.Comic.Game 的缩写,是动画.漫画.游戏的总称) 文化为主要内容的弹幕视频网站没有网络视频前的贴片广告.那么,弹幕视频网站如何实现盈利呢? 弹幕是在互联网环境下诞生的一种实时交互性评论模式,它能以滚动.停留甚至更多动作特效方

SAP播放本地视频及音频(仅限于window MediaPlayer可播放文件)

这个是从SCN上看到的,自己稍加修改,编制,做的还可以,可以播放视频,音频,唯一的不足就是不能控制播放视频的显示窗口大小,希望有人能帮忙解决,感激! 视频播放类:(新建类Z_CL_MEDIA,点击基于原代码,复制下面代码进去,激活) class Z_CL_MEDIA definition public inheriting from CL_GUI_CONTROL final create public . public section. type-pools CNTL . methods CON

如何下载B站哔哩哔哩(bilibili)弹幕网站上的视频呢?小白教你个简单方法

对于90后.00后来说,B站肯定听过吧.小编有一个苦恼的地方,有时候想把哔哩哔哩(bilibili)上看到的视频保存到手机相册,不知道咋操作啊.网上百度了下,都是要下载电脑软件的,有些还得要付费的.前不久,好姐妹告诉了我一个简单方便的在线小工具,电脑.手机都可以用而且免费哦.分享给大家这个哔哩哔哩视频解析下载工具,地址:https://bilibili.iiilab.com/ 说下简单的操作步骤: 1. 在哔哩哔哩(bilibili)APP或者网站上找到自己想要下载保存的视频.(如果是在APP里

【音视频连载-007】基础学习篇-SDL 播放 PCM 音频文件(上)

音视频学习入门技术文章连载: 技术开发故事会连载 [音视频连载-001]基础学习篇-SDL 介绍以及工程配置 [音视频连载-002]基础学习篇-SDL 创建窗口并显示颜色 [音视频连载-003]基础学习篇-SDL 消息循环和事件响应 [音视频连载-004]基础学习篇-SDL 加载图片并显示 [音视频连载-005]基础学习篇-SDL 加载 YUV 文件并显示 [音视频连载-006]基础学习篇-SDL 播放 YUV 视频文件]) 在前面的文章中已经能够利用 SDL 去播放 YUV 视频文件了,接下来

安卓获取多媒体(包括 视频、音频、图片)数据

1.Android中所有的多媒体文件除了存储在物理硬盘上,还会将文件信息(路径.id.类型.)保存到数据库中,这样当我们想要获取这些文件的信息时,就不需要耗时的扫描硬盘,只需要读数据库就可以了.Android平台中称手机终端内存为内部存储空间,称SD卡为外部存储空间.针对内部和外部存储空间中的媒体文件信息是分开管理的,各自有独立的数据库管理.外部存储空间和内部存储空间对应的卷标为"external"和"internal". 2.数据库的数据都会由相应的内容提供者暴露

视频和音频的一些原理性解释

图片按照一秒24帧的速度变换,人眼就看不出间隙,感觉画面内容动了起来.这是对于视频最广泛的认识,这也是视频的基本原理.但是视频文件,并不是简单的一帧帧画面排列起来的图片集合. 平时看视频或者处理视频,都会有向上一帧或向下一帧这样的画面跳转,这感觉视频似乎就和原理一样,就是很多连续变化的图片的集合.实际上对于一般视频文件,并不是完全的有一帧一帧组成. 先来不太严谨地说,很多视频文件,实际上是关键帧+局部像素的运动. 为什么视频不是直接一堆图片的排列呢?这涉及到存储和播放的问题.看图片也知道,一张图