【问题标题】:How to set the MediaRecorder to get the best video quality effect?如何设置 MediaRecorder 以获得最佳的视频质量效果?
【发布时间】:2011-05-19 12:48:37
【问题描述】:

各位大神可以告诉我,在不考虑手机物理限制的情况下,我应该如何设置MediaRecorder中的参数才能通过编码获得最佳的视频录制效果?或者我的MediaRecorder编码导致的视图小失真有什么影响吗?

如果你们中的一些人可能会猜测不清楚的参数,我实际上是在使用首选项设置一些参数。我错过了哪些可能有助于改进视频编码过程的参数 例如:帧率

【问题讨论】:

  • 在谈论质量吗?根据底层编解码器和摄像头,这因设备而异,但请尝试将视频编码器更改为 H264 并提高分辨率,看看是否有帮助..
  • @Ravi 嘿只是为了确认我的代码的哪一部分真正处理编码和解析?
  • 您必须在 MediaRecorder 类实例上使用void setVideoSize(int width, int height) 和编码public void setVideoEncoder (int video_encoder) 设置分辨率。检查 MediaRecorder 文档here

标签: java android encoding camera


【解决方案1】:

根据 API 级别,您可能希望使用或不使用现有配置文件。

没有个人资料:

recorder.setVideoSize(640, 480);
recorder.setVideoFrameRate(16); //might be auto-determined due to lighting
recorder.setVideoEncodingBitRate(3000000);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);// MPEG_4_SP
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

或者如果您想使用现有的配置文件

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

请注意,您不能同时使用这两个选项,因为您会收到错误,否则您的准备工作将无法正常工作

由于并非所有 Android API 和/或设备都支持相同的值,您要么必须查询每个设备的最大值,要么找到适用于任何地方的东西。

【讨论】:

  • 注意:你必须删除setOutputFormat()setVideoEncodingBitRate()setAudioEncodingBitRate()setVideoEncoder()setAudioEncoder()setAudioSamplingRate()setVideoFrameRate()
  • CamcorderProfile 是否内置于某些系统中? chrome windows 7(几乎)最新版本中未定义
【解决方案2】:

虽然这个问题很老了,但我想指出我用来录制高清质量视频的组合。

使用下面的代码组合来实现高清质量的视频。

CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);                    
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);                        
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);                        
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);                    
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);                    
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);                    
mMediaRecorder.setVideoEncodingBitRate(cpHigh.videoBitRate);                    
mMediaRecorder.setVideoFrameRate(cpHigh.videoFrameRate);
int rotation = mWindowManager.getDefaultDisplay().getRotation();
int orientation = ORIENTATIONS.get(rotation + 90);
mMediaRecorder.setOrientationHint(orientation);

使用以下代码获取 DISPLAY_HEIGHT,DISPLAY_WIDTH

DisplayMetrics metrics = new DisplayMetrics();      
mWindowManager.getDefaultDisplay().getMetrics(metrics);          
DISPLAY_WIDTH = metrics.widthPixels;
DISPLAY_HEIGHT = metrics.heightPixels;

如下所示定义方向

public static final SparseIntArray ORIENTATIONS = new SparseIntArray();
static {
    ORIENTATIONS.append(Surface.ROTATION_0, 90);
    ORIENTATIONS.append(Surface.ROTATION_90, 0);
    ORIENTATIONS.append(Surface.ROTATION_180, 270);
    ORIENTATIONS.append(Surface.ROTATION_270, 180);
}

希望对你有帮助。

【讨论】:

  • 什么是 ORIENTATIONS 变量?
  • @Vodet 请检查更新的代码..抱歉延迟回复
  • 这里的问题是,你不知道设备是否支持@CamcorderProfile.QUALITY_HIGH提供的视频尺寸。
  • 高品质音频怎么样?
  • @mickecast 质量没有任何明显差异。
猜你喜欢
  • 1970-01-01
  • 2013-09-23
  • 2011-05-30
  • 2019-06-19
  • 2018-12-25
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多