当前位置: 首页 > 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;。 优先权高的进程有优先执行权利。配置进程优先权对多任务环…...

开源条码字体技术:如何通过字体文件彻底改变条码生成方式

开源条码字体技术&#xff1a;如何通过字体文件彻底改变条码生成方式 【免费下载链接】librebarcode Libre Barcode: barcode fonts for various barcode standards. 项目地址: https://gitcode.com/gh_mirrors/li/librebarcode 条码生成技术长期以来依赖专业软件和专用…...

突破VMware限制:在非苹果硬件上构建macOS开发环境完全指南

突破VMware限制&#xff1a;在非苹果硬件上构建macOS开发环境完全指南 【免费下载链接】unlocker 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 实现跨平台macOS体验&#xff1a;VMware Unlocker核心价值解析 当开发者需要在Windows或Linux工作站上构建m…...

遇到“用户对AIAgent进行提示词注入”怎么办?

文章目录先理解什么是“提示词注入”图片里的防护方法&#xff08;两层&#xff09;第一层&#xff1a;System Prompt 先贴“封条”第二层&#xff1a;输出端再加“安检门”总结先理解什么是“提示词注入” 你可以把 Agent&#xff08;智能助手&#xff09; 想象成一个 严格遵…...

Modelsim仿真Objects窗口一片空白?别急着重装,试试这个被忽略的优化选项设置

Modelsim仿真Objects窗口空白问题深度排查指南 当你在Modelsim中精心搭建的仿真环境突然"失明"——Objects窗口一片空白&#xff0c;而代码明明编译通过时&#xff0c;这种看似无解的困境往往让工程师陷入重装软件的冲动。但请先别急着点击卸载按钮&#xff0c;这很可…...

Solidity 智能合约入门:从 0 到 1 编写第一个区块链合约

一、什么是 Solidity&#xff1f; Solidity 是一门面向以太坊虚拟机&#xff08;EVM&#xff09;、静态类型的高级编程语言&#xff0c;专门用于编写区块链上的智能合约。 简单来说&#xff1a; 智能合约 运行在区块链上的自动执行代码&#xff08;无需第三方&#xff0c;代…...

Miniconda环境迁移实战:如何将CentOS装好的Python环境打包到其他服务器?

Miniconda环境迁移实战&#xff1a;跨服务器Python环境无缝转移指南 当你在CentOS服务器上精心配置了一个完美的Python数据分析环境&#xff0c;却需要在另一台服务器上复现时&#xff0c;难道要重新经历一遍繁琐的安装过程&#xff1f;本文将揭示两种高效可靠的Miniconda环境迁…...

LxgwWenkaiGB:合规开源字体的专业应用指南

LxgwWenkaiGB&#xff1a;合规开源字体的专业应用指南 【免费下载链接】LxgwWenkaiGB An open-source Simplified Chinese font derived from Klee One. 项目地址: https://gitcode.com/gh_mirrors/lx/LxgwWenkaiGB LxgwWenkaiGB&#xff08;霞鹜文楷 GB&#xff09;作为…...

OpenClaw量化对比:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF不同精度版本的自动化任务表现

OpenClaw量化对比&#xff1a;Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF不同精度版本的自动化任务表现 1. 测试背景与实验设计 去年在开发一个自动化文档处理流程时&#xff0c;我发现OpenClaw的任务成功率与底层模型量化精度密切相关。当时使用Q8版本处理Excel文…...

注意力机制融合新范式:从GCNet与DANet看全局建模的演进与实战

1. 视觉注意力机制的进化之路 记得我第一次接触视觉注意力机制是在2016年&#xff0c;那时ResNet刚掀起深度学习的新浪潮。当时最让我困惑的是&#xff1a;为什么神经网络需要"注意力"&#xff1f;后来在ImageNet数据集上做实验时才明白&#xff0c;传统CNN就像近视眼…...

Java全栈工程师的实战面试:从技术细节到业务场景

Java全栈工程师的实战面试&#xff1a;从技术细节到业务场景 一、面试开始 面试官&#xff08;微笑着&#xff09;&#xff1a;你好&#xff0c;很高兴见到你。我是负责技术面试的张工&#xff0c;今天我们会聊一些技术相关的问题。首先&#xff0c;请简单介绍一下你自己。 应聘…...