You need to enable JavaScript to run this app.
最新活动
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

视频裁剪与矩阵 Android Java

要实现视频裁剪与矩阵操作,可以使用Android的MediaCodec和OpenGL ES。以下是一个示例解决方案

  1. 导入所需的库和类
import android.media.MediaCodec;
import android.media.MediaCodecInfo;
import android.media.MediaExtractor;
import android.media.MediaFormat;
import android.opengl.GLES20;
import android.opengl.GLUtils;
import android.opengl.Matrix;
  1. 初始化OpenGL ES环境
private int[] textures;
private int program;
private int uMatrixLocation;
private float[] projectionMatrix = new float[16];

private void initOpenGL() {
    // 创建纹理
    textures = new int[1];
    GLES20.glGenTextures(1, textures, 0);
    int texture = textures[0];
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

    // 创建Shader程序
    program = createProgram(vertexShaderCode, fragmentShaderCode);
    GLES20.glUseProgram(program);
    uMatrixLocation = GLES20.glGetUniformLocation(program, "u_Matrix");

    // 设置投影矩阵
    Matrix.orthoM(projectionMatrix, 0, 0, 1, 0, 1);
    GLES20.glUniformMatrix4fv(uMatrixLocation, 1, false, projectionMatrix, 0);
}
  1. 创建视频裁剪方法
private void cropVideo(String inputPath, String outputPath, int startX, int startY, int width, int height) throws Exception {
    // 创建MediaExtractor和MediaCodec
    MediaExtractor extractor = new MediaExtractor();
    extractor.setDataSource(inputPath);
    int trackIndex = selectTrack(extractor);
    extractor.selectTrack(trackIndex);
    MediaFormat format = extractor.getTrackFormat(trackIndex);
    int rotation = format.getInteger(MediaFormat.KEY_ROTATION);
    MediaCodec codec = MediaCodec.createDecoderByType(format.getString(MediaFormat.KEY_MIME));
    codec.configure(format, null, null, 0);
    codec.start();

    // 创建MediaMuxer
    MediaMuxer muxer = new MediaMuxer(outputPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

    // 创建ByteBuffer用于存储视频帧数据
    int bufferSize = width * height * 3 / 2;
    ByteBuffer inputBuffer = ByteBuffer.allocate(bufferSize);
    ByteBuffer outputBuffer = ByteBuffer.allocate(bufferSize);
    MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();

    // 循环读取视频帧数据并裁剪
    boolean isInputEnd = false;
    boolean isOutputEnd = false;
    while (!isOutputEnd) {
        if (!isInputEnd) {
            int inputIndex = codec.dequeueInputBuffer(10000);
            if (inputIndex >= 0) {
                inputBuffer.clear();
                int sampleSize = extractor.readSampleData(inputBuffer, 0);
                if (sampleSize < 0) {
                    codec.queueInputBuffer(inputIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
                    isInputEnd = true;
                } else {
                    codec.queueInputBuffer(inputIndex, 0, sampleSize, extractor.getSampleTime(), 0);
                    extractor.advance();
                }
            }
        }

        if (!isOutputEnd) {
            int outputIndex = codec.dequeueOutputBuffer(bufferInfo, 10000);
            if (outputIndex >= 0) {
                if (bufferInfo.size > 0) {
                    outputBuffer.clear();
                    outputBuffer.put(inputBuffer);
                    outputBuffer.position(bufferInfo.offset);
                    outputBuffer.limit(bufferInfo.offset + bufferInfo.size);

                    // 裁剪视频帧
                    cropFrame(outputBuffer, startX, startY, width, height, rotation);

                    muxer.writeSampleData(0, outputBuffer, bufferInfo);
                }

                codec.releaseOutputBuffer(outputIndex, false);

                if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
                    isOutputEnd = true;
                }
            }
        }
    }

    // 释放资源
    muxer.stop();
    muxer.release
本文内容通过AI工具匹配关键字智能整合而成,仅供参考,火山引擎不对内容的真实、准确或完整作任何形式的承诺。如有任何问题或意见,您可以通过联系service@volcengine.com进行反馈,火山引擎收到您的反馈后将及时答复和处理。
展开更多
面向开发者的云福利中心,ECS 60元/年,域名1元起,助力开发者快速在云上构建可靠应用

社区干货

Moviepy+OpenCV-python 结合进行音视频剪辑处理 | 社区征文

也早就有了自己的音视频剪辑库 Moviepy。MoviePy 能处理的视频是 ffmpeg 格式的,支持的文件类型包括:*.mp4 *.wmv *.rm *.avi *.flv *.webm *.wav *.rmvb 等 ,可用于进行视频剪切、拼接、标题插入、视频合成、视频处理或创建高级效果,同时更适合批量进行视频剪辑处理。OpenCV 是一个基于 Apache2.0 许可(开源)发行的跨平台计算机视觉和机器学习软件开源库,可以运行在 Linux、Windows、Android Mac OS 操作系统上。 它轻量...

2022年终总结-两年Androider的技术成长之路|社区征文

自己以前理解的很多误区和好多疑难点几乎在视频里面都会提及到,年底面试的时候把在里面学到的技术吹了一波哈哈,效果不错技术成长记录并没有开始多长时间,后续会花费大部分时间记录这部分文档。等到明年的年中总结... 提出常见解决方案和这些解决方案的缺点,提出自己的观点(自己的突破点是什么)论证自己的观点,综合起来说效果### 技术#### 系统1.[Android系统优化的那10年](https://mp.weixin.qq.com/s/rL1VrS0qnEpIdMoFrR5...

WebRTC 如何在安卓系统上采集视频数据 | 社区征文

**目录****前言****正文****摄像头1.0和2.0接口对比****Camera1Capturer 接口类****Camera2Capturer 接口类****结论**# 前言WebRTC 作为一个开源的实时音视频通许方案,经过多年的发展基本上已经支持了所有的常用终端,比如 windows、mac、Android、iOS等。我们都知道音视频通讯的前提是采集本地的音频和视频数据信息。今天,我们就来先了解一下 WebRTC 在安卓端是如何采集视频信号的。# 正文安卓设备和苹果iOS...

图像处理解决方案 veImageX 技术演进之路

> 作者|周强近日,第五届深度学习图像压缩挑战赛(以下将简称“ CLIC 大赛”)比赛结果公布,首次参赛的火山引擎视频云多媒体实验室夺得视频压缩赛道第一名。压缩技术对于图像、视频应用十分重要。在保证同样的质量前... `表示分发大分辨率档位的图片。当业务场景变多后,个性化的图片展示诉求也随之而来,以 HTTP 路由区分场景这种偏定制化的方式就日益臃肿了。此时,图片系统利用通用做法,将图片处理参数做归类抽象,比如裁剪、缩放、...

特惠活动

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

视频裁剪与矩阵 Android Java-优选内容

Moviepy+OpenCV-python 结合进行音视频剪辑处理 | 社区征文
也早就有了自己的音视频剪辑库 Moviepy。MoviePy 能处理的视频是 ffmpeg 格式的,支持的文件类型包括:*.mp4 *.wmv *.rm *.avi *.flv *.webm *.wav *.rmvb 等 ,可用于进行视频剪切、拼接、标题插入、视频合成、视频处理或创建高级效果,同时更适合批量进行视频剪辑处理。OpenCV 是一个基于 Apache2.0 许可(开源)发行的跨平台计算机视觉和机器学习软件开源库,可以运行在 Linux、Windows、Android Mac OS 操作系统上。 它轻量...
进阶功能
本文介绍 Android 观播 SDK 进阶功能的接入方法。您可以根据实际业务需求,按需实现复杂功能。 前提条件您已完成集成 Android 观播 SDK 的前 5 步。 如需定制视频画面填充模式,确保您已完成基础功能接入。如需实现本... Java long activityId = 1721010849258****; // 直播间的活动 ID。String token = "ak3T%2FdaGJDL5zSFD7%2F1GPGP****wx0zaTfQ1M4Dahp8%3D"; // mode=2 时的授权 Token。TVULiveRoom.TVURoomAuthMode roomAuthMo...
基础功能
前提条件已完成集成准备和初始化。 注意事项真机调试:由于 SDK 使用了大量 Android 系统的音视频接口,这些接口在仿真模拟器下可能会出现异常,推荐您使用真机进行代码调试。 功能接入本节为您详细介绍如何通过拉流 SDK 实现直播拉流播放控制的能力,包括但不限于创建播放器、初始化配置、事件监听、设置渲染 View、设置播放地址。 创建播放器使用拉流 SDK,需要先创建直播播放器。您可以参考以下代码创建播放器。 java // 创建播放...
功能接入
本文档将为您介绍 Android 加载 SDK 的能力接入说明。 Android 9.0 libwebp 解码在 Android 9.0 版本,系统原生的 Webp 解码方式存在部分问题,推荐您在 Android 9.0 版本使用 libwebp 解码方式。 java ImagePipelin... 可实现类似视频的边下边播效果(但无法拖动进度),同时降低动图首帧展示耗时,帮助提升加载体验。 全局开启全局开启动图渐进式加载,代码示例如下所示:java ImagePipelineConfig.getDefaultImageRequestConfig().setPr...

视频裁剪与矩阵 Android Java-相关内容

基础功能

显示模式Android 点播 SDK 支持填充、旋转和镜像等显示模式。 填充模式视频的比例和播放控件的比例不一致,就会造成视频拉伸变形的问题。你可以通过设置 displayMode 和 disPlayView 的参数来设置不同的显示模式。示例代码如下所示。 java // 无变形;等比例缩放;画面不被裁剪;可能有黑边int displayMode1 = TTVideoEngineInterface.IMAGE_LAYOUT_ASPECT_FIT;// 可能会变形;画面宽高都充满控件;画面不被裁剪;无黑边int displayMode...

客户端 SDK

2023年11月云游戏客户端 SDK V1.29.x 和 V1.30.0 的发布说明如下: Android Android 端 SDK 包含以下新增功能和变更: 申请云游戏服务时,新增通过 streamType 参数指定拉取音视频流类型,支持启动游戏时默认静音的场... 支持通过 videoRenderMode 参数指定视频流渲染模式,可传入 VIDEO_RENDER_MODE.COVER,实现视频流根据视频画面分辨率长边做裁剪。详细信息,参考 启动 Start。 游戏控制权转移功能增加对云游戏手游的支持。在申请游戏...

SDK更新日志

新增了全埋点的自定义属性 2024年1月2日 Android: V6.16.31.支持 Android Gradle Plugin 8 版本插件2.HTTPS 请求支持设置 SSLSocketFactory3.预置事件 Launch 和 Terminate 支持关闭4.剪切板访问代码支持插件移除 iOS: V6.16.31.不再采集 carrier 和 mcc_mnc 属性2.预置事件 Launch 和 Terminate 支持关闭3.uuid 信息改为加密存储 2023年11月29日 Web: V5.1.81.优化了单页应用PV的refer信息2.优化了hash路由上报的信息3.支持配置...

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

SDK更新日志

新增了全埋点的自定义属性 2024年1月2日 Android: V6.16.31.支持 Android Gradle Plugin 8 版本插件2.HTTPS 请求支持设置 SSLSocketFactory3.预置事件 Launch 和 Terminate 支持关闭4.剪切板访问代码支持插件移除 iOS: V6.16.31.不再采集 carrier 和 mcc_mnc 属性2.预置事件 Launch 和 Terminate 支持关闭3.uuid 信息改为加密存储 2023年11月29日 Web: V5.1.81.优化了单页应用PV的refer信息2.优化了hash路由上报的信息3.支持配置...

基础编辑SDK产品介绍

视频编辑创作全套解决方案 1.2 专业的音视频录制剪辑能力自研的高清视频录制、剪辑、滤镜能力,经过字节跳动全系产品的验证,多年的技术积淀强大稳定 1.3 业内最强大的视频特效覆盖抖音、剪映、西瓜视频等字节系一流的视频特效能力及海量滤镜、转场等音视频编辑素材库 1.4 智能视觉生产通过多年的算法训练积累,智能生成音乐相册、卡点视频、AI 视频封面、剪同款视频等能力,大幅提升生产效率 1.5 素材消费&生产闭环的工具矩阵提供...

发布和订阅公共流

和所在的房间 roomId,指向了参与合并到公共流的媒体流。在 Region 属性中,为不同的流指定位置、裁剪等布局配置。 平台 Android iOS Mac Windows Web 视频编码参数 VideoConfig ByteRTCPublicStreamVideoConfig ByteRTCPublicStreamVideoConfig PublicStreamVideoParam PublicStreamConfig.video 布局设置 Layout ByteRTCPublicStreamLayout ByteRTCPublicStreamLayout PublicStreamLayout PublicStreamConfig.layout java publ...

进阶功能

前提条件已完成 Android 推流 SDK 集成。 已完成基础功能接入。 注意事项真机调试:由于 SDK 使用了大量 Android 系统的音视频接口,这些接口在仿真模拟器下可能会出现异常,推荐您使用真机进行代码调试。 功能接入RTM 协议推流视频直播推流 SDK 支持 RTM 协议推流,详细信息可参考超低延时直播介绍。 使用视频直播控制台的地址生成器,生成 RTM 推流地址。 开始推流时,将 SDK 推流地址设置为 RTM 地址。代码示例如下所示: java mLi...

WebRTC 如何在安卓系统上采集视频数据 | 社区征文

**目录****前言****正文****摄像头1.0和2.0接口对比****Camera1Capturer 接口类****Camera2Capturer 接口类****结论**# 前言WebRTC 作为一个开源的实时音视频通许方案,经过多年的发展基本上已经支持了所有的常用终端,比如 windows、mac、Android、iOS等。我们都知道音视频通讯的前提是采集本地的音频和视频数据信息。今天,我们就来先了解一下 WebRTC 在安卓端是如何采集视频信号的。# 正文安卓设备和苹果iOS...

产品动态

智能卡片模板功能优化和迭代卡片模板API调用生成后,支持对成片在SaaS上进行二次编辑 3. 视频混剪功能优化和迭代支持存储草稿,批量选用音乐,混剪预览等待预览页、素材配置页展示优化 4. 内容分发模块迭代发布任务列... 图文转视频算法问题修复 2023年2月7日智能创作云v1.7.1版本更新 1. 企业配置模块支持数据统计 支持按照账号查询创点用量消耗 2023年1月12日智能创作云v1.7.0版本更新 1. 内容分发模块功能迭代 支持抖音矩阵号发布...

特惠活动

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

产品体验

体验中心

云服务器特惠

云服务器
云服务器ECS新人特惠
立即抢购

白皮书

一图详解大模型
浓缩大模型架构,厘清生产和应用链路关系
立即获取

最新活动

爆款1核2G共享型服务器

首年60元,每月仅需5元,限量秒杀
立即抢购

火山引擎增长体验专区

丰富能力激励企业快速增长
查看详情

数据智能VeDI

易用的高性能大数据产品家族
了解详情

一键开启云上增长新空间

立即咨询