首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用android MediaRecorder

使用android MediaRecorder
EN

Stack Overflow用户
提问于 2013-07-23 22:49:55
回答 1查看 19.2K关注 0票数 11

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

问题: 1)为什么需要CamcorderProfilesetProfile(...)似乎将维度设置为QUALITY_HIGH提供的任何维度,但后来我用setVideoSize(...)设置了我想要的维度,它覆盖了这一点。但是,当我删除两个CamcorderProfile行时,应用程序在带有LogCat E/MediaRecorder(19526): setVideoSize called in an invalid state: 2setVideoSize(...)上崩溃。

2)如何不录制音频?文档说明,如果不调用setAudioSource(...),将不会有音轨。然而,当我删除这一行时,应用程序在带有LogCat E/MediaRecorder(19946): try to set the audio encoder without setting the audio source firstsetProfile(...)上崩溃。

3)如果我删除了CamcorderProfile行和setAudioSource(...)行,它会崩溃,如1)所示。

4)我也尝试添加了下面这行

代码语言:javascript
复制
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的好例子。在API8之后,它暗示你应该使用CamcorderProfile类,但在我看来,它会引起问题。

任何帮助都是最好的!谢谢!

代码(如下所示运行时可用):

代码语言:javascript
复制
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 ...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-23 23:50:19

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

1、3和4) CamcorderProfile不仅设置分辨率,它还设置输出格式和编码器(音频和视频)。之所以会出现错误,是因为您可能需要在调用setVideoSize之前使用setOutputFormat,如果不想使用CamcorderProfile,则必须在调用之后调用setVideoEncodersetAudioEncoder。[根据此]

2)再次,CamcorderProfile还会设置音频属性(如编解码器、BitRate、SampleRate等)所以你需要在调用它之前设置一个音频源,这就是应用程序崩溃的原因。如果你不想录制音频,尝试下一段代码:(我没有测试它,所以我不知道它是否工作,但我非常确定它是工作的)

代码语言:javascript
复制
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 (这意味着您只想录制音频或视频),您可能必须设置额外的参数以确保您具有所需的质量。看一下下面的示例代码:

代码语言:javascript
复制
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();

我希望这对你有帮助。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17813614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档