使用Android MediaRecorder
下面是我的工作代码录制视频和音频的结构:
问题:1)为什么需要CamcorderProfile
? setProfile(...)
似乎将尺寸设置为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,则必须在后面调用setVideoEncoder
和setAudioEncoder
。 [根据这个答案]
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