11

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

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

2) 如何不录制音频?该文档指出,如果setAudioSource(...)不调用,则不会有音轨。但是,当我删除该行时,应用程序会在setProfile(...)LogCat处崩溃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如果不被称为 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 ...
4

1 回答 1

20

我对 MediaRecorder 没有太多经验,但我正在阅读一些相关主题,我会尝试回答您的问题:

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

我希望这可以帮助你。

于 2013-07-23T15:50:18.663 回答