酋长女婿 2015-09-25 07:33 采纳率: 0%
浏览 3650
已结题

使用MediaRecorder录制视频 录完后没有生成文件

代码如下:package com.example.meadiarecorder3;

import java.io.File;
import java.io.IOException;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements SurfaceHolder.Callback{

private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
private TextView tvTime;
private TextView tvSize;
private Button btnStart;
private Button btnStop;
private Button btnCancel;
private MediaRecorder recorder;
private Handler handler;
private Camera camera;
private boolean recording; // 记录是否正在录像,fasle为未录像, true 为正在录像
private int minute = 0;
private int second = 0;
private String time = "";
private String size = "";
private String name;
private File viodFile;
private Runnable timeRun = new Runnable() {

    @Override
    public void run() {
        long fileLength = viodFile.length();
        if (fileLength < 1024 && fileLength > 0) {
            size = String.format("%dB/10M", fileLength);
        } else if (fileLength >= 1024 && fileLength < (1024 * 1024)) {
            fileLength = fileLength / 1024;
            size = String.format("%dK/10M", fileLength);
        } else if (fileLength > (1024 * 1024 * 1024)) {
            fileLength = (fileLength / 1024) / 1024;
            size = String.format("%dM/10M", fileLength);
        }
        second++;
        if (second == 60) {
            minute++;
            second = 0;
        }
        time = String.format("%02d:%02d", minute, second);
        tvSize.setText(viodFile.getAbsolutePath());
        tvTime.setText(time);
        handler.postDelayed(timeRun, 1000);
    }
};

private Button start;// 开始录制按钮  
private Button stop;// 停止录制按钮  
private MediaRecorder mediarecorder;// 录制视频的类  
private SurfaceView surfaceview;// 显示视频的控件  
// 用来显示视频的一个接口,我靠不用还不行,也就是说用mediarecorder录制视频还得给个界面看  
// 想偷偷录视频的同学可以考虑别的办法。。嗯需要实现这个接口的Callback接口  
private SurfaceHolder surfaceHolder;
private String fileName;
private SurfaceHolder holder;

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_REVERSE_PORTRAIT);  
    // 选择支持半透明模式,在有surfaceview的activity中使用。  
    getWindow().setFormat(PixelFormat.TRANSLUCENT);  
    setContentView(R.layout.activity_main);  
    fileName = Environment.getExternalStorageDirectory().getAbsolutePath();
    name = "video_" + System.currentTimeMillis() + ".mp4";
    fileName += File.separator + File.separator + "Ruanko_Jobseeker"
            + File.separator + name;
    name = "video_" + System.currentTimeMillis() + ".mp4";

    tvSize = (TextView) findViewById(R.id.tv_video_size);
    tvTime = (TextView) findViewById(R.id.tv_video_time);
    handler= new Handler();
    init();  
}  

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);  
    holder = surfaceview.getHolder();
    holder.addCallback(this); // holder加入回调接口  
    // setType必须设置,要不出错.  
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
}  

class TestVideoListener implements OnClickListener {  
    private static final String TAG = "MainActivity";
    @Override  
    public void onClick(View v) {  
        if (v == start) {  
            try {
                viodFile = new File(Environment.getExternalStorageDirectory().getCanonicalFile() + "/myvideo.mp4");
                 if (!Environment.getExternalStorageState().equals(
                            Environment.MEDIA_MOUNTED)) {
                        Toast.makeText(getApplicationContext(), "SD卡不存在,请插卡", 0).show();
                        return;
                    }else{ 
                        if(!viodFile.exists()){
                            viodFile.getParentFile().mkdirs();
                            viodFile.createNewFile();
                    }

                    }
                    mediarecorder = new MediaRecorder();// 创建mediarecorder对象  
                    // 设置录制视频源为Camera(相机)  
                    mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);  
                 // 设置从麦克风采集声音
                    mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    // 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4  
                    mediarecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);  
                    // 设置录制的视频编码h263 h264  
                    mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
                    mediarecorder.setAudioEncoder(MediaRecorder.VideoEncoder.DEFAULT);
                    // 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错  
                    mediarecorder.setVideoSize(176, 144);  
                    // 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错  
                    mediarecorder.setVideoFrameRate(20);  
                    mediarecorder.setPreviewDisplay(holder.getSurface()); 
                 // 设置视频文件输出的路径 
                    mediarecorder.setOutputFile(viodFile.getAbsolutePath());

                    System.out.println("viodFile.getAbsolutePath()的值为:"+viodFile.getAbsolutePath());
                    // 准备录制  
                    mediarecorder.prepare();  
                    // 开始录制  
                    mediarecorder.start(); 
                    handler.post(timeRun);

            } catch (IOException e2) {
                e2.printStackTrace();
            }
        }
        if (v == stop) { 
            Log.i(TAG, viodFile.toString());
            if (mediarecorder != null) {  

                handler.removeCallbacks(timeRun);
                // 停止录制  
                mediarecorder.stop();  
                // 释放资源  
                mediarecorder.release();  
                mediarecorder = null;  
            }  
        }  

    }  

}
public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

// 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder

surfaceHolder = holder;

}

public void surfaceCreated(SurfaceHolder holder) {  
    // 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder  
    surfaceHolder = holder;  
}  

public void surfaceDestroyed(SurfaceHolder holder) {  
    // surfaceDestroyed的时候同时对象设置为null  
    surfaceview = null;  
    holder = null;  
    mediarecorder = null;  
} 

}
代码是没问题的 可以运行 可以录制和暂停 设置录制视频地址的代码是
viodFile = new File(Environment.getExternalStorageDirectory().getCanonicalFile() + "/myvideo.mp4");
mediarecorder.setOutputFile(viodFile.getAbsolutePath());
这两行已经把地址设置好了
按道理来说 录完之后就可以找到文件了 但是没有!
求助各位大神,到底是哪里出了问题,有录制视频的号框架推荐就指点一二,或者有更好的代码就发小弟一份,不胜感激。。

  • 写回答

2条回答 默认 最新

  • Exploring1024 2015-09-25 09:10
    关注

    录制了,点击完成有返回值么?如果没有,检查存储路径是否成功

    评论

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能