android编辑视频,android 视频剪辑(亲测可用)
【实例简介】软件打开时,会加载本地的视频,所以可能会慢点,加载完毕后就可以 编辑视频了
【实例截图】
【核心代码】
package net.video.trimmer.view;
import net.video.trimmer.R;
import net.video.trimmer.model.VideoPlayerState;
import net.video.trimmer.service.VideoTrimmingService;
import net.video.trimmer.util.FileUtils;
import net.video.trimmer.util.TimeUtils;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.VideoView;
public class ViewVideo extends Activity {
protected final int LOADING_DIALOG = 1;
protected final int MESSAGE_DIALOG = 2;
protected final int VALIDATION_DIALOG = 3;
private VideoView videoView;
private TextView detailView;
private VideoPlayerState videoPlayerState = new VideoPlayerState();
protected Handler completionHander = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.e("VideoView", "VideoView Recieved message");
videoPlayerState.setMessageText(msg.getData().getString("text"));
removeDialog(LOADING_DIALOG);
showDialog(MESSAGE_DIALOG);
stopService(videoTrimmingServiceIntent());
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("VideoView", "VideoView In on create");
setContentView(R.layout.video_player);
Object lastState = getLastNonConfigurationInstance();
if (lastState != null) {
videoPlayerState = (VideoPlayerState) lastState;
} else {
Bundle extras = getIntent().getExtras();
videoPlayerState.setFilename(extras.getString("videofilename"));
}
videoView = (VideoView) findViewById(R.id.VideoView);
videoView.setVideoPath(videoPlayerState.getFilename());
MediaController mediaController = new MediaController(this);
videoView.setMediaController(mediaController);
videoView.requestFocus();
videoView.start();
Button startButton = (Button) findViewById(R.id.Start);
startButton.setOnClickListener(startClickListener());
Button stopButton = (Button) findViewById(R.id.Stop);
stopButton.setOnClickListener(stopClickListener());
Button resetButton = (Button) findViewById(R.id.Reset);
resetButton.setOnClickListener(resetClickListener());
Button trimButton = (Button) findViewById(R.id.Trim);
trimButton.setOnClickListener(trimClickListener());
detailView = (TextView) findViewById(R.id.Details);
refreshDetailView();
}
@Override
public Object onRetainNonConfigurationInstance() {
Log.e("VideoView", "VideoView In on retain");
return videoPlayerState;
}
@Override
protected void onResume() {
super.onResume();
Log.e("VideoView", "VideoView In on resume");
videoView.seekTo(videoPlayerState.getCurrentTime());
}
@Override
protected void onPause() {
super.onPause();
Log.e("VideoView", "VideoView In on pause");
videoPlayerState.setCurrentTime(videoView.getCurrentPosition());
}
private OnClickListener trimClickListener() {
return new OnClickListener() {
@Override
public void onClick(View arg0) {
videoView.pause();
if(!videoPlayerState.isValid()) {
showDialog(VALIDATION_DIALOG);
return;
}
Intent intent = videoTrimmingServiceIntent();
String inputFileName = videoPlayerState.getFilename();
intent.putExtra("inputFileName", inputFileName);
intent.putExtra("outputFileName", FileUtils.getTargetFileName(inputFileName));
intent.putExtra("start", videoPlayerState.getStart()/1000);
intent.putExtra("duration", videoPlayerState.getDuration()/1000);
intent.putExtra("messenger", new Messenger(completionHander));
startService(intent);
showDialog(LOADING_DIALOG);
}
};
}
private Intent videoTrimmingServiceIntent() {
return new Intent(ViewVideo.this, VideoTrimmingService.class);
}
private OnClickListener resetClickListener() {
return new OnClickListener() {
@Override
public void onClick(View arg0) {
videoPlayerState.reset();
refreshDetailView();
}
};
}
private OnClickListener stopClickListener() {
return new OnClickListener() {
@Override
public void onClick(View arg0) {
int stop = videoView.getCurrentPosition();
videoPlayerState.setStop(stop);
refreshDetailView();
}
};
}
private OnClickListener startClickListener() {
return new OnClickListener() {
@Override
public void onClick(View arg0) {
videoPlayerState
.setStart(videoView.getCurrentPosition());
refreshDetailView();
}
};
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
Log.e("VideoView", "VideoView In on prepare dialog");
switch (id) {
case MESSAGE_DIALOG:
((AlertDialog) dialog).setMessage(videoPlayerState.getMessageText());
break;
}
}
@Override
protected Dialog onCreateDialog(int id) {
Log.e("VideoView", "VideoView In on create dialog");
Dialog dialog;
switch (id) {
case VALIDATION_DIALOG:
dialog = simpleAlertDialog("Invalid video timings selected for trimming. Please make sure your start time is less than the stop time.");
break;
case LOADING_DIALOG:
dialog = ProgressDialog.show(ViewVideo.this, "", "Trimming...",true, true);
break;
case MESSAGE_DIALOG:
dialog = simpleAlertDialog("");
break;
default:
dialog = null;
}
return dialog;
}
private Dialog simpleAlertDialog(String message) {
Dialog dialog;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(message).setCancelable(true)
.setPositiveButton("Ok",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ViewVideo.this.removeDialog(MESSAGE_DIALOG);
ViewVideo.this.removeDialog(LOADING_DIALOG);
}
});
dialog = builder.create();
return dialog;
}
private void refreshDetailView() {
String start = TimeUtils.toFormattedTime(videoPlayerState.getStart());
String stop = TimeUtils.toFormattedTime(videoPlayerState.getStop());
detailView.setText("Start at " start "\nEnd at " stop);
}
}
android编辑视频,android 视频剪辑(亲测可用)相关推荐
- Android FFmpeg移植总攻略——获取视频帧数(亲测可用)
第一次尝试使用Android 移植FFmpeg算法,一路坎坷,最终做如下总结,适用于Android手机.Android开发板.亲测可用. 一.下载组件 在Android Studio中下载所需组件:C ...
- Android 手势返回上一界面 亲测可用
在现如今,Android使用越来越便捷,也对Android开发提出更高要求,便捷体现在开发的每一处. 这里介绍Android使用手势返回上一界面.亲测可用! 一.思考: 1. 监听可手势返回上一界面的 ...
- android获取详细地址,Android获取当前子网掩码地址(亲测可用)
Android 获取当前子网掩码地址(亲测可用),现在网上好多都是通过 DhcpInfo 来获取,但是通过这种方法有 Bug,很多人用 DhcpInfo 的方式都是获取不到,都是为 0.0.0.0. ...
- 使用H5Stream实现rtsp视频流播放,在Vue项目中 (无插件、可多视频源播放、亲测可用)
本文主要介绍用H5Stream 在Web页面播放摄像头的RTSP视频流,从0到1的过程.包括WebSocket代理.h5ss.bat文件 运行一会就自己卡死了.H5ss服务死掉自动定时重启的脚本 等可 ...
- OpenCV 标定摄像头(Python 版本代码,视频中标定,亲测可用)
在机器视觉领域,摄像头的标定指通过技术手段拿到相机的内参.外参及畸变参数. 相机内参长这样,利用针孔模型,将 3d 物体透视投影到 2d 的相机屏幕上. P = [ f x 0 c x 0 f y c ...
- 打电话android代码,android 拨打电话例子源码(亲测可用)
[实例简介] [实例截图] [核心代码] package androidCall.pack; import java.util.regex.Matcher; import java.util.rege ...
- Java服务器、android连接小票打印机打印(亲测可用)
优声云打印机JAVA SDK 使用教程 安装 下载下来放到项目中的某一位置 优声云打印对接准备工作 注册一个开发者帐号 注册地址(https://console.ushengyun.com) 获取开发 ...
- 教给大家怎么跟好友一起看视频?亲测可用
教给大家怎么跟好友一起看视频?亲测可用. 薯片APP 哈喽,大家好.最近很多朋友在后台留言咨询薯片小姐姐怎么跟好友一起看视频,相信大家在日常生活中都会遇到这样的问题,想找可用邀请好友一起同步观看视频的 ...
- Android音乐播放器悬浮窗功能,亲测可用
最近公司要开发一项语音播报新闻的功能.要求是: 1.语音播报时有一个悬浮窗,能滑动,退出当前页面后能继续播放: 2.松手后滑向靠近的边: 于是我临时学了Window,WindowManager,onT ...
- Android屏蔽HOME键亲测可用
转载请标明原文地址谢谢: 之前遇到过需要屏蔽HOME键的场景,百度搜了很多根本不好使,Framework层又不能动.后来找到了,亲测可用,今天抽空贴出来: 下面不废话,直接上代码 @Overridep ...
最新文章
- MySQL基础之select基本查询
- 编译原理上机实习c语言小子集编译程序的实现报告,编译原理上机实习指导书(2015-11修改).pdf...
- java 2维数据便利_计算机等级考试二级java数组辅导
- Webstorm中提示Can't use Subversion command line
- PS命令总结-实战经验
- sed 分隔符打印_字符截取:cut,格式化输出:printf,字符截取:awk,文件或命令输出编辑:sed...
- 寻找最小的k个数(四种方法)
- 驱动精灵w8ndows xp sp2,惠普打印机驱动官方正式版下载,适用于winxp,win2003,winvista,win7,win8,win10,win2008,win2012-驱动精灵...
- 摄像头防水性能测试软件,手机摄像头防水测试/气密性检测方法分享
- ROS-Navigation之map_server笔记及程序解析
- 最强的优化器:把RAdam和LookAhead协同组合
- lange耦合器设计步骤_耦合器设计--基本理论.ppt
- 【专利】如何画专利流程图(逻辑图)
- CNN应用之性别、年龄识别
- excel的隔行插入
- lazada各国家站点讲解
- RAM、ROM、FLASH的存储原理及区别
- 利用Python+opencv进行视频文件的读取和保存,打开笔记本摄像头拍照保存、图像在窗口显示等操作
- 亲爱的老狼-定位position的应用
- IDEA的Project与Structure依赖jar包的方式