使用Android MediaRecorder

下面是我的工作代码录制视频和音频的结构:

问题:1)为什么需要CamcorderProfilesetProfile(...)似乎将尺寸设置为QUALITY_HIGH给出的任何尺寸,但后来我使用setVideoSize(...)设置了我想要的尺寸,这将覆盖此尺寸。 但是,当我删除两个CamcorderProfile行时,该应用程序在使用LogCat E/MediaRecorder(19526): setVideoSize called in an invalid state: 2 setVideoSize(...)时崩溃E/MediaRecorder(19526): setVideoSize called in an invalid state: 2

2)我怎样不录音? 该文档指出,如果setAudioSource(...)未被调用,则不会有音轨。 但是,当我删除该行时,应用程序在使用LogCat E/MediaRecorder(19946): try to set the audio encoder without setting the audio source first setProfile(...)时崩溃E/MediaRecorder(19946): try to set the audio encoder without setting the audio source first

3)如果我删除了两个CamcorderProfile行和setAudioSource(...)行,它将如1)中那样崩溃。

4)我也尝试添加该行

recorder.setOutputFormat(OutputFormat.DEFAULT);

而不是CamcorderProfile行。 但现在它在perpare()崩溃。 如果setAudioSource(...)则LogCat为: E/MediaRecorder(20737): audio source is set, but audio encoder is not set如果未调用E/MediaRecorder(20737): audio source is set, but audio encoder is not set LogCat为: E/MediaRecorder(20544): video source is set, but video encoder is not set

我看了整个互联网,我无法找到一个正确的方式来设置MediaRecorder的一个很好的例子。 这里暗示在API 8之后你应该使用CamcorderProfile类,但是在我看来这是造成问题的原因。

任何帮助将是伟大的! 谢谢!

代码(在下面运行时工作):

recorder = new MediaRecorder();
recorder.setCamera(<<camera>>);
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);

CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(profile);

recorder.setOutputFile(<<Path String>>);
recorder.setVideoSize(<<Width>>, <<Height>>);

recorder.setPreviewDisplay(<<Surface>>);

recorder.setOrientationHint(0); 
recorder.setMaxDuration(10000);
recorder.setOnInfoListener(this);

try
{
    recorder.prepare();
    recorder.start();
} catch ...

我没有很多MediaRecorder的经验,但我正在阅读一些相关的主题,我会尽力回答你的问题:

1,3和4) CamcorderProfile设置的不仅仅是分辨率,它还设置输出格式和编码器(音频和视频)。 您正在收到错误消息,因为在调用setVideoSize之前可能需要使用setOutputFormat ,并且如果您不想使用CamcorderProfile,则必须在后面调用setVideoEncodersetAudioEncoder 。 [根据这个答案]

2)同样,CamcorderProfile还设置了音频属性(如Codec,BitRate,SampleRate,...),因此在调用它之前需要设置音频源,这就是应用程序崩溃的原因。 如果您不想录制音频,请尝试下一个代码:(我没有测试它,所以我实际上不知道它是否有效,但我确信它确实可行)

recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoSize(WIDTH, HEIGHT);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
recorder.setOutputFile(PATH);
recorder.setPreviewDisplay(SURFACE);

recorder.prepare();
recorder.start();

另外请注意,如果您不想使用CamcorderProfile(意味着您只想录制音频或视频),则可能需要设置其他参数以确保您获得所需的质量。 看看下面的示例代码:

recorder = new MediaRecorder();
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);

// Following code does the same as getting a CamcorderProfile (but customizable)
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
// Video Settings 
recorder.setVideoSize(WIDTH, HEIGHT);
recorder.setVideoFrameRate(FRAME_RATE);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
recorder.setVideoEncodingBitRate(VIDEO_BITRATE);
// Audio Settings
recorder.setAudioChannels(AUDIO_CHANNELS);
recorder.setAudioSamplingRate(SAMPLE_RATE);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
recorder.setAudioEncodingBitRate(AUDIO_BITRATE);

// Customizable Settings such as:
//   recorder.setOutputFile(PATH);
//   recorder.setPreviewDisplay(SURFACE);
//   etc...

// Prepare and use the MediaRecorder
recorder.prepare();
recorder.start();
...
recorder.stop();
recorder.reset();
recorder.release();

我希望这可以帮助你。

链接地址: http://www.djcxy.com/p/5261.html

上一篇: Using android MediaRecorder

下一篇: Android MediaRecorder causes Force Stop error