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

android.MediaMuxer时间裁剪

使用MediaMuxer裁剪视频_安卓muxer 裁剪视频画布-CSDN博客

关键步骤

mediaExtractor.seekTo(beginTime, MediaExtractor.SEEK_TO_PREVIOUS_SYNC);long presentTimeUs = mediaExtractor.getSampleTime();
if (presentTimeUs > endTime)break;

功能代码

VideoView videoView_video;
ImageButton imageButton_startTime, imageButton_endTime;
Button button_clip;
String path_video="";
int startTime, endTime;imageButton_startTime = (ImageButton)findViewById(R.id.imageButton_startTime);
imageButton_startTime.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {startTime = videoView_video.getCurrentPosition(); //msToast.makeText(getApplicationContext(), "开始时间:" + startTime, Toast.LENGTH_SHORT).show();}
});imageButton_endTime = (ImageButton)findViewById(R.id.imageButton_endTime);
imageButton_endTime.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {endTime = videoView_video.getCurrentPosition();Toast.makeText(getApplicationContext(), "结束时间:" + endTime, Toast.LENGTH_SHORT).show();}
});button_clip = (Button)findViewById(R.id.button_clip);
button_clip.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (path_video.equals("")) {Toast.makeText(getApplicationContext(), "错误:没有视频", Toast.LENGTH_SHORT).show();return;}if (startTime >= endTime) {Toast.makeText(getApplicationContext(), "错误:开始时间(" + startTime + ") > 结束时间(" + endTime + ")", Toast.LENGTH_SHORT).show();return;}String path_output = Environment.getExternalStorageDirectory().getPath() + File.separator + Environment.DIRECTORY_MOVIES + path_video.substring(path_video.lastIndexOf("/"), path_video.lastIndexOf(".")) + "_clip.mp4";clipVideo(path_video, path_output, startTime, endTime);}
});

 

void clipVideo(String path_video, String path_output, int startTime, int endTime) {MediaExtractor mediaExtractor = new MediaExtractor();try {mediaExtractor.setDataSource(path_video);} catch (Exception e) {Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();Log.e(Thread.currentThread().getStackTrace()[2] + "", e.toString());}int videoTrack = -1,audioTrack = -1;if (mediaExtractor.getTrackCount() == 0) {Toast.makeText(getApplicationContext(), "错误:trackCount == 0", Toast.LENGTH_SHORT).show();return;}for (int i = 0; i < mediaExtractor.getTrackCount(); i++) {if (mediaExtractor.getTrackFormat(i).getString(MediaFormat.KEY_MIME).startsWith("video/")) {videoTrack = i;} else if (mediaExtractor.getTrackFormat(i).getString(MediaFormat.KEY_MIME).startsWith("audio/")) {audioTrack = i;}}Toast.makeText(getApplicationContext(), "videoTrack: " + videoTrack + "\naudioTrack: " + audioTrack, Toast.LENGTH_SHORT).show();Log.e(Thread.currentThread().getStackTrace()[2] + "", "videoTrack: " + videoTrack + ", audioTrack: " + audioTrack);MediaFormat videoFormat = mediaExtractor.getTrackFormat(videoTrack);MediaFormat audioFormat = mediaExtractor.getTrackFormat(audioTrack);MediaMuxer mediaMuxer = null;try {mediaMuxer = new MediaMuxer(path_output, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);} catch (Exception e) {Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();Log.e(Thread.currentThread().getStackTrace()[2] + "", e.toString());}int videoTrackIndex = mediaMuxer.addTrack(videoFormat);//int rotation = videoFormat.getInteger(MediaFormat.KEY_ROTATION); //视频的rotation//mediaMuxer.setOrientationHint(rotation);int audioTrackIndex = mediaMuxer.addTrack(audioFormat);mediaMuxer.start();int bufferSize = 256 * 1024;ByteBuffer inputBuffer = ByteBuffer.allocate(bufferSize);//视频部分mediaExtractor.selectTrack(videoTrack);MediaCodec.BufferInfo videoInfo = new MediaCodec.BufferInfo();mediaExtractor.seekTo(startTime * 1000L, MediaExtractor.SEEK_TO_PREVIOUS_SYNC);while (true) {int sampleSize = mediaExtractor.readSampleData(inputBuffer, 0);long presentationTimeUs = mediaExtractor.getSampleTime();if (sampleSize < 0 || presentationTimeUs > endTime * 1000L) {mediaExtractor.unselectTrack(videoTrack);break;}//int trackIndex = mediaExtractor.getSampleTrackIndex();int sampleFlag = mediaExtractor.getSampleFlags();videoInfo.offset = 0;videoInfo.size = sampleSize;videoInfo.flags = sampleFlag;videoInfo.presentationTimeUs = presentationTimeUs;mediaMuxer.writeSampleData(videoTrackIndex, inputBuffer, videoInfo);mediaExtractor.advance();}//音频mediaExtractor.selectTrack(audioTrack);MediaCodec.BufferInfo audioInfo = new MediaCodec.BufferInfo();mediaExtractor.seekTo(startTime * 1000L, MediaExtractor.SEEK_TO_CLOSEST_SYNC);while (true) {int sampleSize = mediaExtractor.readSampleData(inputBuffer, 0);long presentationTimeUs = mediaExtractor.getSampleTime();if (sampleSize < 0 || presentationTimeUs > endTime * 1000L) {mediaExtractor.unselectTrack(audioTrack);break;}//int trackIndex = mediaExtractor.getSampleTrackIndex();int sampleFlag = mediaExtractor.getSampleFlags();audioInfo.offset = 0;audioInfo.size = sampleSize;audioInfo.flags = sampleFlag;audioInfo.presentationTimeUs = presentationTimeUs;mediaMuxer.writeSampleData(audioTrackIndex, inputBuffer, audioInfo);mediaExtractor.advance();}mediaMuxer.stop();mediaMuxer.release();mediaExtractor.release();MediaScannerConnection.scanFile(getApplicationContext(), new String[]{path_output}, null, null);Toast.makeText(getApplicationContext(), "视频剪辑完成:" + path_output, Toast.LENGTH_SHORT).show();
}

源码:GitLink | 确实开源

相关文章:

android.MediaMuxer时间裁剪

使用MediaMuxer裁剪视频_安卓muxer 裁剪视频画布-CSDN博客 关键步骤 mediaExtractor.seekTo(beginTime, MediaExtractor.SEEK_TO_PREVIOUS_SYNC);long presentTimeUs mediaExtractor.getSampleTime(); if (presentTimeUs > endTime)break; 功能代码 VideoView videoVie…...

【蓝桥杯选拔赛真题91】Scratch筛选数据 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析

目录 scratch筛选数据 一、题目要求 编程实现 二、案例分析 1、角色分析...

英语学习——16组英语常用短语

第1组&#xff1a;look look at 看 look for 寻找 look up 查阅&#xff0c;向上看 look out 向外看&#xff0c;小心 look after 照顾 look like 看起来像 look through 浏览 look into 向里看 look around 环顾四周 look forward to 期盼 look ahead 向前看 Look…...

unity 增加系统时间显示、FPS帧率、ms延迟

代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;using UnityEngine;public class Frame : MonoBehaviour {// 记录帧数private int _frame;// 上一次计算帧率的时间private float _lastTime;// 平…...

【Python基础】文件详解(文件基础、csv文件、时间处理、目录处理、excel文件、jsonpicke、ini配置文件)

文章目录 &#xff08;一&#xff09;文件详解1 快速入门文件操作1.1 快速实现文件读取1.2 快速实现文件写入 2 文件打开方式详解2.1 open方法2.2 打开方式2.3 文件读写操作2.3.1 基本读写2.3.2 读写方式打开2.3.3 实现重复读取 3 文件编码问题4 文件读写方法4.1 文件读取方式4…...

[UI5 常用控件] 05.FlexBox, VBox,HBox,HorizontalLayout,VerticalLayout

文章目录 前言1. FlexBox布局控件1.1 alignItems 对齐模式1.2 justifyContent 对齐模式1.3 Direction1.4 Sort1.5 Render Type1.6 嵌套使用1.7 组件等高显示 2. HBox,VBox3. HorizontalLayout&#xff0c;VerticalLayout 前言 本章节记录常用控件FlexBox,VBox,HBox,Horizontal…...

Unity类银河恶魔城学习记录1-14 AttackDirection源代码 P41

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili PlayerPrimaryAttackState.cs using System.Collections; using System.Co…...

DataX详解和架构介绍

系列文章目录 一、 DataX详解和架构介绍 二、 DataX源码分析 JobContainer 三、DataX源码分析 TaskGroupContainer 四、DataX源码分析 TaskExecutor 五、DataX源码分析 reader 六、DataX源码分析 writer 七、DataX源码分析 Channel 文章目录 系列文章目录DataX是什么&#xff…...

02.05

1.单链表 main #include "1list_head.h" int main(int argc, const char *argv[]) { //创建链表之前链表为空Linklist headNULL;int n;datatype element;printf("please enter n:");scanf("%d",&n);for(int i0;i<n;i){printf("ple…...

【C语言】贪吃蛇 详解

该项目需要的技术要点 C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32API等。 由于篇幅限制 和 使知识模块化&#xff0c; 若想了解 使用到的 Win32API 的知识&#xff1a;请点击跳转&#xff1a;【Win32API】贪吃蛇会使用到的 Win32API 目录 1. 贪吃蛇游…...

Mysql MGR搭建

一、架构说明 1.1 架构概述 MGR(单主)VIP架构是一种分布式数据库架构&#xff0c;其中数据库系统采用单主复制模式&#xff0c; 同时引入虚拟IP(VIP)来提高可用性和可扩展性。 这种架构结合了传统主从复制和虚拟IP技术的优势&#xff0c;为数据库系统提供了高可用、 高性能和…...

新火种AI|寒武纪跌落神坛!七年连亏50亿,AI芯片第一股不行了吗?

作者&#xff1a;文子 编辑&#xff1a;小迪 连年亏损&#xff0c;烧钱不止&#xff0c;寒武纪终是走到悬崖边缘。 寒武纪市值腰斩&#xff0c;连续七年累亏50亿 继连续六年亏损之后&#xff0c;寒武纪又迎来第七年亏损。 1月30日晚&#xff0c;寒武纪正式对外发布2023年年…...

three.js CSS3DObject、CSS2DObject、CSS3DSprite、Sprite的作为标签的区别

CSS3DObject、CSS2DObject、CSS3DSprite、Sprite的作为标签的区别 是否面向相机场景缩放时&#xff0c;是否会跟随是否会被模型遮挡CSS2DObject是否否CSS3DObject否是否CSS3DSprite是是是Sprite是是是 CSS3DObject 和 CSS3DRenderer 搭配来渲染标签&#xff1b; CSS2DObject …...

第7节、双电机直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;前面章节主要介绍单个电机控制&#xff0c;本节内容介绍两个电机完成Bresenham直线运动 一、Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发&#xff0c;最初用于计…...

【C语言 - 哈希表 - 力扣 - 相交链表】

相交链表题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0…...

C++参悟:内存管理-unique_ptr

内存管理-unique_ptr 一、概述二、成员函数1. 构造、析构函数函数1. 构造函数2. 析构函数3. 赋值号 2. 修改器1. release&#xff08;&#xff09;2. reset()3. swap() 3. 观察器1. get()2. get_deleter3. bool 运算 一、概述 std::unique_ptr 是通过指针占有并管理另一对象&a…...

【征稿已开启】第五大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

第五大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09; 2024 5th International Conference on Big Data & Artificial Intelligence & Software Engineering 2024年09月20-22日 | 中国温州 第五届大数据、人工智能与软件工程国际研讨会&…...

Vue3父子组件传参

一&#xff0c;父子组件传参&#xff1a; 应用场景&#xff1a;父子组件传参 Vue3碎片&#xff1a;defineEmits&#xff0c;defineProps&#xff0c;ref&#xff0c;reactive&#xff0c;onMounted 1.父组件传子组件 a.父组件传参子组件 import { ref} from vue import OnChi…...

SpringBoot整理-微服务

Spring Boot 在构建微服务架构的应用中发挥着关键作用。微服务是一种将大型复杂应用拆分为更小、更容易管理和维护的服务的架构风格。每个服务通常围绕特定的业务功能构建,并且可以独立部署、扩展和更新。Spring Boot 提供了一系列特性和工具,使得创建和维护这些独立服务变得…...

服务器和CDN推荐

简介 陆云Roovps是一家成立于2021年的主机服务商&#xff0c;主要业务是销售美国服务器、香港服务器及国外湖北十堰高防服务器&#xff0c;还有相关CDN产品。&#xff08; 地址&#xff1a;roovps&#xff09; 一、相关产品...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...