欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

解决Android MediaRecorder录制视频过短问题

程序员文章站 2024-03-06 08:27:37
具体表现:   调用mediarecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩。  错误信息...

具体表现:

  调用mediarecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩。

 错误信息:

java.lang.runtimeexception: stop failed.
  at android.media.mediarecorder.stop(native method)

 解决办法:

  在stop以前调用setonerrorlistener(null);就行了!

 相关代码:

 /** 开始录制 */
  @override
  public mediapart startrecord() {
    if (mmediaobject != null && msurfaceholder != null && !mrecording) {
      mediapart result = mmediaobject.buildmediapart(mcameraid, ".mp4");

      try {
        if (mmediarecorder == null) {
          mmediarecorder = new mediarecorder();
          mmediarecorder.setonerrorlistener(this);
        } else {
          mmediarecorder.reset();
        }

        // step 1: unlock and set camera to mediarecorder
        camera.unlock();
        mmediarecorder.setcamera(camera);
        mmediarecorder.setpreviewdisplay(msurfaceholder.getsurface());

        // step 2: set sources
        mmediarecorder.setvideosource(mediarecorder.videosource.camera);//before setoutputformat()
        mmediarecorder.setaudiosource(mediarecorder.audiosource.mic);//before setoutputformat()

        mmediarecorder.setoutputformat(mediarecorder.outputformat.mpeg_4);

        //设置视频输出的格式和编码
        camcorderprofile mprofile = camcorderprofile.get(camcorderprofile.quality_480p);
        //        mmediarecorder.setprofile(mprofile);
        mmediarecorder.setvideosize(640, 480);//after setvideosource(),after setoutformat()
        mmediarecorder.setaudioencodingbitrate(44100);
        if (mprofile.videobitrate > 2 * 1024 * 1024)
          mmediarecorder.setvideoencodingbitrate(2 * 1024 * 1024);
        else
          mmediarecorder.setvideoencodingbitrate(mprofile.videobitrate);
        mmediarecorder.setvideoframerate(mprofile.videoframerate);//after setvideosource(),after setoutformat()

        mmediarecorder.setaudioencoder(mediarecorder.audioencoder.aac);//after setoutputformat()
        mmediarecorder.setvideoencoder(mediarecorder.videoencoder.h264);//after setoutputformat()

        //mmediarecorder.setvideoencodingbitrate(800);

        // step 4: set output file
        mmediarecorder.setoutputfile(result.mediapath);

        // step 5: set the preview output
        //        mmediarecorder.setorientationhint(90);//加了htc的手机会有问题

        log.e("yixia", "outputfile:" + result.mediapath);

        mmediarecorder.prepare();
        mmediarecorder.start();
        mrecording = true;
        return result;
      } catch (illegalstateexception e) {
        e.printstacktrace();
        log.e("yixia", "startrecord", e);
      } catch (ioexception e) {
        e.printstacktrace();
        log.e("yixia", "startrecord", e);
      } catch (exception e) {
        e.printstacktrace();
        log.e("yixia", "startrecord", e);
      }
    }
    return null;
  }

  /** 停止录制 */
  @override
  public void stoprecord() {
    long endtime = system.currenttimemillis();
    if (mmediarecorder != null) {
      //设置后不会崩
      mmediarecorder.setonerrorlistener(null);
      mmediarecorder.setpreviewdisplay(null);
      try {
        mmediarecorder.stop();
      } catch (illegalstateexception e) {
        log.w("yixia", "stoprecord", e);
      } catch (runtimeexception e) {
        log.w("yixia", "stoprecord", e);
      } catch (exception e) {
        log.w("yixia", "stoprecord", e);
      }
    }

    if (camera != null) {
      try {
        camera.lock();
      } catch (runtimeexception e) {
        log.e("yixia", "stoprecord", e);
      }
    }

    mrecording = false;
  }

  /** 释放资源 */
  @override
  public void release() {
    super.release();
    if (mmediarecorder != null) {
      mmediarecorder.setonerrorlistener(null);
      try {
        mmediarecorder.release();
      } catch (illegalstateexception e) {
        log.w("yixia", "stoprecord", e);
      } catch (exception e) {
        log.w("yixia", "stoprecord", e);
      }
    }
    mmediarecorder = null;
  }

  @override
  public void onerror(mediarecorder mr, int what, int extra) {
    try {
      if (mr != null)
        mr.reset();
    } catch (illegalstateexception e) {
      log.w("yixia", "stoprecord", e);
    } catch (exception e) {
      log.w("yixia", "stoprecord", e);
    }
    if (monerrorlistener != null)
      monerrorlistener.onvideoerror(what, extra);
  }

以上就是对android mediarecorder 资料整理,后续继续补充,有需要的朋友可以参考下。