surfaceview录制视频 录制的视频存在哪

64928人阅读
Android基础学习(16)
在这里给出自己的一个测试DEMO,里面注释很详细。简单的视频录制功能.
package com.
import java.io.IOE
import android.app.A
import android.content.pm.ActivityI
import android.graphics.PixelF
import android.media.MediaR
import android.os.B
import android.view.SurfaceH
import android.view.SurfaceV
import android.view.V
import android.view.View.OnClickL
import android.view.W
import android.view.WindowM
import android.widget.B
* class name:TestBasicVideo&BR&
* class description:一个简单的录制视频例子&BR&
* PS:实现基本的录制保存文件 &BR&
* @version 1.00
* @author CODYY)peijiangping
public class TestBasicVideo extends Activity implements SurfaceHolder.Callback {
private B// 开始录制按钮
private B// 停止录制按钮
private MediaRe// 录制视频的类
private SurfaceV// 显示视频的控件
// 用来显示视频的一个接口,我靠不用还不行,也就是说用mediarecorder录制视频还得给个界面看
// 想偷偷录视频的同学可以考虑别的办法。。嗯需要实现这个接口的Callback接口
private SurfaceHolder surfaceH
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
// 设置横屏显示
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
// 选择支持半透明模式,在有surfaceview的activity中使用。
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.main);
private void init() {
start = (Button) this.findViewById(R.id.start);
stop = (Button) this.findViewById(R.id.stop);
start.setOnClickListener(new TestVideoListener());
stop.setOnClickListener(new TestVideoListener());
surfaceview = (SurfaceView) this.findViewById(R.id.surfaceview);
SurfaceHolder holder = surfaceview.getHolder();// 取得holder
holder.addCallback(this); // holder加入回调接口
// setType必须设置,要不出错.
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
class TestVideoListener implements OnClickListener {
public void onClick(View v) {
if (v == start) {
mediarecorder = new MediaRecorder();// 创建mediarecorder对象
// 设置录制视频源为Camera(相机)
mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
mediarecorder
.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 设置录制的视频编码h263 h264
mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
mediarecorder.setVideoSize(176, 144);
// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
mediarecorder.setVideoFrameRate(20);
mediarecorder.setPreviewDisplay(surfaceHolder.getSurface());
// 设置视频文件输出的路径
mediarecorder.setOutputFile(&/sdcard/love.3gp&);
// 准备录制
mediarecorder.prepare();
// 开始录制
mediarecorder.start();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if (v == stop) {
if (mediarecorder != null) {
// 停止录制
mediarecorder.stop();
// 释放资源
mediarecorder.release();
mediarecorder =
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
surfaceHolder =
public void surfaceCreated(SurfaceHolder holder) {
// 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
surfaceHolder =
public void surfaceDestroyed(SurfaceHolder holder) {
// surfaceDestroyed的时候同时对象设置为null
surfaceview =
surfaceHolder =
mediarecorder =
&LinearLayout xmlns:android=&/apk/res/android&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:orientation=&horizontal& &
&LinearLayout
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:layout_weight=&1& &
&SurfaceView
android:id=&@+id/surfaceview&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent& /&
&/LinearLayout&
&LinearLayout
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:layout_weight=&4&
android:gravity=&center&
android:orientation=&vertical& &
android:id=&@+id/start&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:layout_weight=&1&
android:text=&Start& /&
android:id=&@+id/stop&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:layout_weight=&1&
android:text=&Stop& /&
&/LinearLayout&
&/LinearLayout&
AndroidManifest.xml
&?xml version=&1.0& encoding=&utf-8&?&
&manifest xmlns:android=&/apk/res/android&
package=&com.video&
android:versionCode=&1&
android:versionName=&1.0& &
&application
android:icon=&@drawable/icon&
android:label=&@string/app_name& &
android:label=&@string/app_name&
android:name=&.TestBasicVideo& &
&intent-filter &
&action android:name=&android.intent.action.MAIN& /&
&category android:name=&android.intent.category.LAUNCHER& /&
&/intent-filter&
&/activity&
&/application&
&uses-sdk android:minSdkVersion=&8& /&
&uses-permission android:name=&android.permission.CAMERA& &
&/uses-permission&
&uses-permission android:name=&android.permission.RECORD_AUDIO& &
&/uses-permission&
&uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE& &
&/uses-permission&
&/manifest&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:474019次
积分:4274
积分:4274
排名:第6017名
原创:33篇
转载:10篇
评论:227条
(1)(1)(1)(1)(2)(1)(8)(3)(1)(8)(10)(1)(2)(1)(1)(1)SurfaceView MediaRecorder录制视频问题,求大神
.start()开始录制&&
几秒钟后.stop()停止录制
问题就来了,虽然停止录制了,视频的预览还在继续
之后我用Camera的stopPreview()方法,预览没有了,但是画面停在最后不动了
&&&&我想做的是,当停止以后,surfaceView显示的不是录像的最后一个画面,而是直接显示黑屏
求路过的大神指点迷经!!!!--------------------------你用画笔把surfaceview绘制为全黑不行吗?android surfaceView在录制视频时显示黑屏
我使用surfaceView和MediaRecorder进行视频录制,不考虑音频,但是我用G13测试为什么是黑屏,我把代码上一下,请大家帮我看一下问题在哪?我也请别人用G12测试,也是不行。但是代码理论上我认为是没有问题的。
public class RecodeVideoActivity extends Activity implements OnClickListener, Callback {
/** Called when the activity is first created. */
private ImageB
private ImageB
private SurfaceV
private SurfaceH
private MediaR
private boolean isRecode=
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 隐去Title(程序的名字)
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
// 設置全屏:隐去电池等图标和一切修饰部分(状态栏部分)
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 选择支持半透明模式,在有surfaceview的activity中使用。
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.main);
begin=(ImageButton)findViewById(R.id.begin);
Log.i(&----------&&, &begin button&);
stop=(ImageButton)findViewById(R.id.stop);
Log.i(&----------&&, &stop button&);
stop.setEnabled(false);
begin.setOnClickListener(this);
stop.setOnClickListener(this);
surface=(SurfaceView)findViewById(R.id.surface);
Log.i(&----------&&, &surface button&);
holder=surface.getHolder();
holder.addCallback(RecodeVideoActivity.this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
holder.setKeepScreenOn(true);
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.begin:
/* ①Initial:实例化MediaRecorder对象 */
recoder=new MediaRecorder();
Log.i(&----------&&, &recoder&);
recoder.reset();
// 解決豎屏視頻被旋轉90&的錯誤
Camera c = Camera.open();
Camera.Parameters parameters = c.getParameters();
parameters.setRotation(90);
c.setParameters(parameters);
c.unlock();
recoder.setCamera(c);
recoder.setPreviewDisplay(holder.getSurface());
/* ②setAudioSource/setVedioSource */
recoder.setAudioSource(MediaRecorder.AudioSource.MIC);
recoder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
Log.i(&----------&&, &recoder2&);
/* ②设置錄製視頻输出格式:THREE_GPP/MPEG-4/RAW_AMR/Default
* THREE_GPP(3gp格式,H263视频ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)*/
recoder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
/* ②设置視頻/音频文件的编码:AAC/AMR_NB/AMR_MB/Default */
recoder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recoder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
Log.i(&----------&&, &recoder4&);
/* ②设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错 */
recoder.setVideoEncodingBitRate(10);
Log.i(&----------&&, &recoder5&);
/* ②设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错 */
recoder.setVideoSize(174, 148);
Log.i(&----------&&, &recoder6&);
file=new File(Environment.getExternalStorageDirectory().getCanonicalFile()+&/video.mp4&);
Log.i(&----------&&, &file &);
recoder.setOutputFile(file.getAbsolutePath());
Log.i(&----------&&, &recoder7&);
recoder.prepare();
Log.i(&----------&&, &recoder9&);
recoder.start();
Log.i(&----------&&, &recoder10&);
begin.setEnabled(false);
stop.setEnabled(true);
}catch(Exception e)
e.printStackTrace();
case R.id.stop:
if(isRecode){
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle(&dialog&);
builder.setMessage(&are you sure stop recording?&);
builder.setPositiveButton(&yes&, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
recoder.stop();
recoder.release();
begin.setEnabled(true);
stop.setEnabled(false);
builder.setNegativeButton(&NO&, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&/apk/res/android&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:orientation=&vertical& &
&SurfaceView
android:id=&@+id/surface&
android:layout_width=&320px&
android:layout_height=&320px&
&LinearLayout
android:orientation=&horizontal&ccc
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:gravity=&center_horizontal&
&ImageButton
android:id=&@+id/begin&
android:src=&@drawable/play&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
&ImageButton
android:id=&@+id/stop&
android:src=&@drawable/stop&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&/&
&/LinearLayout&
&/LinearLayout&
&?xml version=&1.0& encoding=&utf-8&?&
&manifest xmlns:android=&/apk/res/android&
package=&com.nju.test&
android:versionCode=&1&
android:versionName=&1.0& &
&uses-sdk android:minSdkVersion=&10& /&
&uses-permission android:name=&android.permission.CAMERA&/&
&uses-permission android:name=&android.permission.RECORD_AUDIO&/&
&uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE&/&&
&application
android:icon=&@drawable/ic_launcher&
android:label=&@string/app_name& &
android:name=&.RecodeVideoActivity&
android:label=&@string/app_name& &
&intent-filter&
&action android:name=&android.intent.action.MAIN& /&
&category android:name=&android.intent.category.LAUNCHER& /&
&/intent-filter&
&/activity&
&/application&
&/manifest&
因为我不知道如何上传压缩包,所以只好把全部代码贴上来,请大家帮忙看一下,谢谢
添加camer.startpreview().没有开启相机预览模式。
我也在研究同样的问题,可以交流Q:

我要回帖

更多关于 surface pro4评测视频 的文章

 

随机推荐