多媒体——视频——使用摄像机录制视频

news/2024/10/18 18:25:19/

通过系统自带的摄像机可以很方便地录制视频,只要指定摄像动作为MediaStore.ACTION_VIDEO_CAPTURE即可。

当然,需要事先设定下列的录像参数:

1、MediaStore.EXTRA_VIDEO_QUALITY:用于设定视频质量;2、MediaStore.EXTRA_SIZE_LIMIT:用于设定文件大小的上限;3、MediaStore.EXTRA_DURATION_LIMIT:用于设定视频时长的上限。

// 获取视频文件中的某帧图片
public static Bitmap getOneFrame(Context ctx, Uri uri) 
{MediaMetadataRetriever retriever = new MediaMetadataRetriever();retriever.setDataSource(ctx, uri);// 获得视频的播放时长,大于1秒的取第1秒的帧图,不足1秒的取第0秒的帧图String duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);int pos = (Integer.parseInt(duration)/1000)>1 ? 1 : 0;// 获取并返回指定时间的帧图return retriever.getFrameAtTime(pos * 1000, MediaMetadataRetriever.OPTION_CLOSEST);}

===========================================================================================================

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:id="@+id/btn_recorder"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="打开摄像机"android:textColor="@color/black"android:textSize="17sp" /><TextViewandroid:id="@+id/tv_video"android:layout_width="match_parent"android:layout_height="wrap_content"android:paddingLeft="5dp"android:textColor="@color/black"android:textSize="17sp" /><RelativeLayoutandroid:id="@+id/rl_video"android:layout_width="match_parent"android:layout_height="300dp"android:visibility="gone"><ImageViewandroid:id="@+id/iv_video"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitCenter" /><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitCenter"android:src="@drawable/play_video" /></RelativeLayout></LinearLayout>

MediaUtil
package com.example.myapplication.util;import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;import java.io.File;@SuppressLint("DefaultLocale")
public class MediaUtil {private final static String TAG = "MediaUtil";// 格式化播放时长(mm:ss)public static String formatDuration(int milliseconds) {int seconds = milliseconds / 1000;int hour = seconds / 3600;int minute = seconds / 60;int second = seconds % 60;String str;if (hour > 0) {str = String.format("%02d:%02d:%02d", hour, minute, second);} else {str = String.format("%02d:%02d", minute, second);}return str;}// 获得音视频文件的缓存路径public static String getRecordFilePath(Context context, String dir_name, String extend_name) {String path = "";File recordDir = new File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString() + "/" + dir_name + "/");if (!recordDir.exists()) {recordDir.mkdirs();}try {File recordFile = File.createTempFile(DateUtil.getNowDateTime(), extend_name, recordDir);path = recordFile.getAbsolutePath();Log.d(TAG, "dir_name=" + dir_name + ", extend_name=" + extend_name + ", path=" + path);} catch (Exception e) {e.printStackTrace();}return path;}// 获取视频文件中的某帧图片public static Bitmap getOneFrame(Context ctx, Uri uri) {MediaMetadataRetriever retriever = new MediaMetadataRetriever();retriever.setDataSource(ctx, uri);// 获得视频的播放时长,大于1秒的取第1秒处的帧图,不足1秒的取第0秒处的帧图String duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);Log.d(TAG, "duration="+duration);int pos = (Integer.parseInt(duration)/1000)>1 ? 1 : 0;// 获取指定时间的帧图,注意getFrameAtTime方法的时间单位是微秒return retriever.getFrameAtTime(pos * 1000 * 1000);}
}

主代码:

package com.example.myapplication;import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import com.example.myapplication.util.MediaUtil;public class MainActivity extends AppCompatActivity implements View.OnClickListener
{private final static String TAG = "VideoRecordActivity";private int RECORDER_CODE = 1; // 录制操作的请求码private TextView tv_video;private RelativeLayout rl_video;private ImageView iv_video;private Uri mVideoUri; // 视频文件的路径对象@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_video = findViewById(R.id.tv_video);rl_video = findViewById(R.id.rl_video);iv_video = findViewById(R.id.iv_video);findViewById(R.id.btn_recorder).setOnClickListener(this);findViewById(R.id.rl_video).setOnClickListener(this);}@Overridepublic void onClick(View v){if (v.getId() == R.id.btn_recorder){// 下面准备跳到系统的摄像机,并获得录制完的视频文件Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // 视频质量。0 低质量;1 高质量intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 10485760L); // 大小限制,单位字节intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10); // 时长限制,单位秒startActivityForResult(intent, RECORDER_CODE); // 打开系统摄像机}else if (v.getId() == R.id.rl_video){// 创建一个内容获取动作的意图(准备跳到系统播放器)Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(mVideoUri, "video/*"); // 类型为视频startActivity(intent); // 打开系统的视频播放器}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent intent){super.onActivityResult(requestCode, resultCode, intent);if (resultCode==RESULT_OK && requestCode==RECORDER_CODE)   // 从摄像机返回{mVideoUri = intent.getData(); // 获得已录制视频的路径对象//            // 生成临时视频的保存路径
//            String filePath = String.format("%s/%s.mp4",
//                    getExternalFilesDir(Environment.DIRECTORY_MOVIES), "video_"+ DateUtil.getNowDateTime());
//            // 把录制完的视频保存到临时路径
//            FileUtil.saveFileFromUri(this, mVideoUri, filePath);tv_video.setText("录制完成的视频地址为:"+mVideoUri.toString());rl_video.setVisibility(View.VISIBLE);// 获取视频文件的某帧图片Bitmap bitmap = MediaUtil.getOneFrame(this, mVideoUri);iv_video.setImageBitmap(bitmap); // 设置图像视图的位图对象}}}

 

 

 

 

 

 


http://www.ppmy.cn/news/774980.html

相关文章

佳能单反摄像机MOV视频恢复

人生中最重要的婚礼现场中&#xff0c;现在一般都会配置有录像&#xff0c;以此来记录这种重要的画面&#xff0c;但是经常会出现各种意外&#xff0c;导致录制的重要视频内容丢失损坏&#xff0c;这个时候该怎么办呢?今天甲驭科技数据恢复中心小编就跟大家分享一下关于佳能设…

使用zed相机录制视频

准备工作&#xff1a; 连接地面站&#xff0c;设置本地ip: 192.168.1.55 255.255.255.0 TCP连接&#xff1a;192.168.1.11 1、启动roscore 2、启动zed相机的launch文件 roslaunch zed_wrapper zed.launch 3、rostopic list 查看是否有 ZED 的 left 和 right 的 image…

RabbitMQ消息中间件的简介

为什么要使用消息服务 1. 异步处理 用户在注册账号时主要是关注的是账号有没有存储到数据库,至于邮箱消息等并不关注,这些消息就可以等有空再进行 串行 并行 消息服务处理 2.应用解耦 避免系统出现故障导致订单丢失 3.流量削锋…

华为云编译构建CodeArts Build新手操作指南

华为云编译构建&#xff08;CodeArts Build&#xff09;基于云端大规模并发加速&#xff0c;为客户提供高速、低成本、配置简单的混合语言构建能力&#xff0c;帮助客户缩短构建时间&#xff0c;提升构建效率。 本文将给各位开发者带来华为云CodeArts Pipeline的手把手初级教学…

4U8路服务器:将性能扩展到每一英寸

在这个世界上&#xff0c;高密度的材料往往意味着高价值&#xff0c;自古以来&#xff0c;黄金就是贵金属的代表&#xff0c;成为全球衡量价值的参考。 金属铂金密度21.46克/立方厘米、黄金密度19.32克/立方厘米&#xff0c;这些密度高的金属不但自身价值高&#xff0c;更重要的…

PSP1000/2000/3000 PSPgo全主机介绍(1)

转自&#xff1a;http://psp.tgbus.com/hb/200904/20090410173016_1.shtml 索尼电脑娱乐SCEI于2004年12月12日在日本发售的家用掌上型游戏机。标准售价为19800日元。 PSP1000采用4.3寸16&#xff1a;9比例、背光全透式的夏普ASV超广可视角TFT液晶屏幕&#xff0c;屏幕大小达到…

kicad最小布线宽度默认是多少_常见停车场管理系统项目的安装布线及注意事项...

现在很多现代化的智能停车场系统都广泛应用于各大小型停车场、地下车库、公寓小区进出口、公司单位的大门口等&#xff0c;智能停车场的主要组成部分是&#xff1a;系统由出口控制机、入口控制机、电动道闸机、车辆检测器、地感、通讯转换器、IC读卡器&#xff0c;停车场管理软…

大学计算机系u盘要多大,这款U盘大小的主机,自带Win10操作系统

科技的魅力 据说世界上第一台计算机占地高达150平方米&#xff0c;重量达27吨&#xff0c;这无疑是一个庞然大物。短短几十年时间&#xff0c;科技所取得的进步是不可思议的&#xff0c;从家庭电脑的普及到乔布斯从信封里抽出MacBook Air的那一刻&#xff0c;这个行业最大的魅力…