当前位置: 首页 > news >正文

Android 关于使用videocompressor库压缩没有声音和异常的问题

原库地址

https://gitcode.com/gh_mirrors/vi/VideoCompressor/overview
这个库用起来比较方便,使用Android原生的MediaCodec+mp4parser的方式进行压缩,不用接入so库也不用适配cpu

问题

接口库后你会发现过时了,所以你一阵捣鼓后你发现压缩正常但是输出文件没有声音,问题是什么?经过我一天的修改,问题是因为你升级了mp4parser库他接入的是com.googlecode.mp4parser:isoparser:1.0.6不论你升级到什么版本都会出现没有声音的问题,那是因为谷歌的问题,在1.0.6后在编码的时候更加严格,所以你不升级就ok了!

真的不升级?

随着时间的发展旧版本库无法满足需求,性能各方面都是差异,而且这是7年前的库了,所以你必须升级,那么怎么解决问题呢?

分析问题

问题代码

在1.0.6库之前和之后主要的出现问题代码就在createMovie中的创建FileChannel的问题,1.0.6支持你FileOutputStream.getChannel()这样创建但是1.0.6之后不可以这样,这样就会导致音视频无法同步,所以你需要更换创建方法:new RandomAccessFile(destinationPath, "rw").getChannel()其中destinationPath输出文件地址修改了这一行你会发现好了

其他解决思路

这个库的压缩思路:

  1. 获取视频的track,然后利用MediaCodec对原视频进行解码

  2. 获取原视频的宽高、帧率等,进行一定的比例缩放

  3. 在利用MediaCodec进行视频编码,输出一个只有视频没有声音的文件

  4. 在利用相同的方式获取音频的track,然后读取音频读写

  5. 最后对音视频进行合并,他是再同一个输出文件上读写的

  6. 完结
    所以根据上面思路你完全可以分开

  7. 先利用MediaCodec对视频进行压缩,输出到缓存目标文件A

  8. 在读取原文件的音频

  9. 合并两个文件,输出到真正的目录B,这里不可以和缓存目标文件A相同,必须不同的文件

把思路简化下代码大概是这样,是不是很简单,其实思路就这么点代码

    public static void appendMp4List(Context context, Uri sourcePath, String outPutPath) throws Exception {VideoInfo videoInfo = VideoUtils.getVideoInfo(context, sourcePath);if (videoInfo == null || videoInfo.width() == 0 || videoInfo.height() == 0) {return;}File tempFile = VideoUtils.copyFileToCacheDir(context, sourcePath);List<Track> audioTracks = new LinkedList<>();// 音频通道集合List<Track> videoTracks = new LinkedList<>();// 视频通道集合for (Track inMovieTrack : MovieCreator.build(tempFile.getAbsolutePath()).getTracks()) {if ("soun".equals(inMovieTrack.getHandler())) {// 从Movie对象中取出音频通道audioTracks.add(inMovieTrack);}if ("vide".equals(inMovieTrack.getHandler())) {// 从Movie对象中取出视频通道videoTracks.add(inMovieTrack);}}Movie resultMovie = new Movie();// 结果Movie对象[输出]if (!videoTracks.isEmpty()) {// 将所有视频通道追加合并writerVideo(tempFile,videoInfo,outPutPath);//压缩视频,但这样输出的只有视频没有音频List<Track> resultVideoTrack = MovieCreator.build(outPutPath).getTracks();for(Track videoTrack:resultVideoTrack){resultMovie.addTrack(videoTrack);}}if (!audioTracks.isEmpty()) {// 将所有音频通道追加合并resultMovie.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));}Container outContainer = new DefaultMp4Builder().build(resultMovie);// 将结果Movie对象封装进容器FileChannel fileChannel = new RandomAccessFile(outPutPath, "rw").getChannel();outContainer.writeContainer(fileChannel);// 将容器内容写入磁盘fileChannel.close();}

最终的优化有的代码查看github

https://github.com/fzkf9225/mvvm-componnent-master/tree/master/commonmedia/src/main/java/pers/fz/media/videocompressor

相关文章:

Android 关于使用videocompressor库压缩没有声音和异常的问题

原库地址 https://gitcode.com/gh_mirrors/vi/VideoCompressor/overview 这个库用起来比较方便&#xff0c;使用Android原生的MediaCodecmp4parser的方式进行压缩&#xff0c;不用接入so库也不用适配cpu 问题 接口库后你会发现过时了&#xff0c;所以你一阵捣鼓后你发现压缩…...

LeetCode-215.数组中的第K个最大元素

. - 力扣&#xff08;LeetCode&#xff09;给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问…...

『OpenCV-Python』视频的读取和保存

点赞 + 关注 + 收藏 = 学会了 推荐关注 《OpenCV-Python专栏》 上一讲介绍了 OpenCV 的读取图片的方法,这一讲简单聊聊 OpenCV 读取和保存视频。 视频的来源主要有2种,一种是本地视频文件,另一种是实时视频流,比如手机和电脑的摄像头。 要读取这两种视频的方法都是一样的…...

什么是Spring Boot Actuator

Spring Boot Actuator是一个用于监控和管理Spring Boot应用的框架&#xff0c;它提供了生产级别的功能&#xff0c;如健康检查、审计、指标收集、HTTP跟踪等。以下是对Spring Boot Actuator的详细介绍&#xff1a; 一、主要功能和特点 监控和管理&#xff1a; 提供多种内置端点…...

计算机网络:运输层 —— 运输层端口号

文章目录 运输层端口号的分类端口号与应用程序的关联应用举例发送方的复用和接收方的分用 运输层端口号的分类 端口号只具有本地意义&#xff0c;即端口号只是为了标识本计算机网络协议栈应用层中的各应用进程。在因特网中不同计算机中的相同端口号是没有关系的&#xff0c;即…...

linux下编译安装memcached

一、安装依赖库 Memcached依赖于一些系统库&#xff0c;在大多数Linux发行版中&#xff0c;需要安装libevent库。 Debian/Ubuntu系统 使用以下命令安装依赖库&#xff1a; sudo apt -y update sudo apt -y install libevent - devCentOS/RHEL系统 可以通过以下命令安装&am…...

最短路径生成树的数量-黑暗城堡

信息学奥赛一本通T1486-黑暗城堡 时间限制: 2s 内存限制: 192MB 提交: 18 解决: 9 题目描述 知道黑暗城堡有 N 个房间&#xff0c;M 条可以制造的双向通道&#xff0c;以及每条通道的长度。 城堡是树形的并且满足下面的条件&#xff1a; 设 Di为如果所有的通道都被修建&#xf…...

将已有的MySQL8.0单机架构变成主从复制架构

过程: 把数据库做一个完全备份, 恢复到从节点上, 恢复后从备份的那个点开始往后复制,从而保证后续数据的一致性。 步骤: 修改 master 主节点 的配置&#xff08; server-id log-bin &#xff09;master 主节点 完全备份&#xff08; mysqldump &#xff09;master 主节点 创建…...

JSON.stringify的应用说明

前言 JSON.stringify() 方法将 JavaScript 对象转换为字符串,在日常开发中较常用&#xff0c;但JSON.stringify其实有三个参数&#xff0c;后两个参数&#xff0c;使用较少&#xff0c;今天来介绍一下后两个参数的使用场景和示例。 语法及参数说明 JSON.stringify()&#xf…...

pyflink datastream数据流ds经过一系列转换后转为table,t_env.from_data_stream(ds)

在 pyflink 处理数据流过程中&#xff0c;有时候需要将data_stream转为table,下面是正确的方式&#xff0c;即每一个算子(map&#xff0c;reduce, window)操作之后需要指定输出数据类型。 from pyflink.common.typeinfo import Types from pyflink.datastream import StreamEx…...

vxe-grid table 校验指定行单元格的字段,只校验某个列的字段

Vxe UI vue vxe-table 中校验表格行是非常简单的&#xff0c;只需要配置好校验规则&#xff0c;然后调用 validate 方法就可以自动完成校验&#xff0c;但是由于项目淡色特殊需求&#xff0c;在某个单元格的值修改后需要对另一个列的值就行校验&#xff0c;这个时候又不需要全部…...

【Java多线程】单例模式(饿汉模式和懒汉模式)

目录 单例模式的定义&#xff1a; 饿汉式--单例模式 定义&#xff1a; 案例&#xff1a; 优缺点&#xff1a; 懒汉式--单例模式&#xff1a; 定义&#xff1a; 1&#xff09;懒汉式单例模式&#xff08;非线程安全&#xff09; 2&#xff09;线程安全的懒汉式单例模…...

python 异步编程之协程

最近在学习python的异步编程&#xff0c;这里就简单记录一下&#xff0c;免得日后忘记。 首先&#xff0c;python异步实现大概有三种方式&#xff0c;多进程&#xff0c;多线程和协程&#xff1b;多线程和多进程就不用多说了&#xff0c;基本上每种语言都会有多进行和多线程的…...

现代密码学|古典密码学例题讲解|AES数学基础(GF(2^8)有限域上的运算问题)| AES加密算法

文章目录 古典密码凯撒密码和移位变换仿射变换例题多表代换例题 AES数学基础&#xff08;GF&#xff08;2^8&#xff09;有限域上的运算问题&#xff09;多项式表示法 | 加法 | 乘法X乘法模x的四次方1的乘法 AES加密算法初始变换字节代换行移位列混合轮密钥加子密钥&#xff08…...

算法沉淀一:双指针

目录 前言&#xff1a; 双指针介绍 对撞指针 快慢指针 题目练习 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.和为s的两个数 7.三数之和 8.四数之和 前言&#xff1a; 此章节介绍一些算法&#xff0c;主要从leetcode上的题来讲解&#xff…...

Word_小问题解决_1

1.第二页是空白的&#xff0c;但是删不掉 将鼠标弄到第二页最开始的地方打开段落设置行距为固定值0.7磅 2.表格中有文字进入了表格中怎么办 打开段落&#xff0c;将缩进改为0即可...

基于opencv制作GUI界面

可以基于cvui头文件实现一些控件操作&#xff0c;头文件及demo实例 这是一个demo main.cpp #include <opencv2/opencv.hpp> #define CVUI_IMPLEMENTATION #include "cvui.h"#define WINDOW_NAME "CVUI Hello World!"int main(void) {cv::Mat frame…...

微服务即时通讯系统的实现(客户端)----(2)

目录 1. 将protobuf引入项目当中2. 前后端交互接口定义2.1 核心PB类2.2 HTTP接口定义2.3 websocket接口定义 3. 核心数据结构和PB之间的转换4. 设计数据中心DataCenter类5. 网络通信5.1 定义NetClient类5.2 引入HTTP5.3 引入websocket 6. 小结7. 搭建测试服务器7.1 创建项目7.2…...

QT使用libssh2库实现sftp文件传输

本篇文章通过用户名和密码来连接服务器端,通过密匙连接服务器端可以参考另外一篇文章: https://blog.csdn.net/u012372584/article/details/143826199?sharetype=blogdetail&sharerId=143826199&sharerefer=PC&sharesource=u012372584&spm=1011.2480.3001.…...

【Linux】进程的优先级

进程的优先级 一.概念二.修改优先级的方法三.进程切换的大致原理&#xff1a;四.上下文数据的保存位置&#xff1a; 一.概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。 优先权高的进程有优先执行权利。配置进程优先权对多任务环…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...