如何修改录视频时帧率

cctvufo 2011-03-24 10:50:32
大家好,我使用MediaRecorder Class录视频,却发现无法修改帧率

视频我用的AVC编码,音频我用的AAC编码(这个是API LEVEL 10以后支持的)

我的主体源码如下:
recorder = new MediaRecorder(); 
recorder.setPreviewDisplay(surfaceHolder.getSurface());
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//set the Output Format
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
//set the Video Size
recorder.setVideoSize(176,144);
//set the Frame rate
recorder.setVideoFrameRate(15);

//Set the Video Encoder
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//Set the Audio Encoder
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
recorder.setOutputFile(myRecAudioFile.getAbsolutePath());
recorder.prepare();
recorder.start();


但是debug说
03-22 22:39:41.120: WARN/StagefrightRecorder(662): Intended video encoding frame rate (15 fps) is too small and will be set to (27 fps)

甚至还爆出了一个匪夷所思的错误
03-22 22:39:41.380: ERROR/VENC_ENC(662): Bitrate 192000

最后我录出来的视频就接近28fps了

大家帮忙看看为什么呢?
...全文
2975 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr灬羽化 2013-05-14
  • 打赏
  • 举报
回复
高手自在人家,我也觉得帧是不可设置成固定值的,
amduser 2013-03-13
  • 打赏
  • 举报
回复
1、手动设置分辨率没有用。 2、不同的设备,以及芯片方案是否支持硬编和软编,决定了最终出来的效果和能力。支持硬编的设备上面,帧率上20多不成问题。一般越贵的设备,能力越强。 3、为什么不可控?因为这个事情具体受设备采样的影响。例如硬件设备的能力只能支持到20帧,你设置成25。结果是要不就是出错,要不就是设置没用,还是按自己的方式处理。
NEduke 2011-07-11
  • 打赏
  • 举报
回复
最后还是没有结果吗
yuephone 2011-06-15
  • 打赏
  • 举报
回复
Androd上,实际上测出来的效果:H264编码的时候,采用的就是可变帧率,设置帧率没用。
紫气东来 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ameyume 的回复:]

setVideoFrameRate
public void setVideoFrameRate(int rate)
throws IllegalStateException
Sets the frame rate of the video to be captured. Must be called after setVideoSource(). Call this after setOutFormat() but before prepare().
设置frame率,必须在setVideoSource,setOutFormat之后,prepare()之前调用。

[/Quote]


我确实是按这个顺序调用的,不按这个顺序调用程序会down掉,什么都不会录出来,我的确是录出文件了。

[Quote=引用 2 楼 ameyume 的回复:]
/**
* Uses the settings from a CamcorderProfile object for recording. This method should
* be called after the video AND audio sources are set, and before setOutputFile().
* 使用来自记录CamcorderProfile对象的设置。这种方法应该调用在
* 被命名后的视频和音频源设置和setOutputFile()之前。
* @param profile the CamcorderProfile to use
* @see android.media.CamcorderProfile
*/

[/Quote]
老大你这翻译都翻错了

* 使用来自记录CamcorderProfile对象的设置。这种方法应该调用在
* 视频和音频源设置[color=#FF0000]之后
和setOutputFile()之前。[/color]

看我一楼,我也是这么设置的。
不这么设置什么都录不出来的,我只是想录一个不是27fps的。



紫气东来 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ameyume 的回复:]

Java code
/**
* Uses the settings from a CamcorderProfile object for recording. This method should
* be called after the video AND audio sources are set, and before setOutputFile().
* 使用来自记录Camcorde……
[/Quote]

没错,确实都是我问的,昨晚问的Stack Overflow,放了一晚上(应该是米国的一个白天)都没人理我...
ameyume 2011-03-24
  • 打赏
  • 举报
回复
setVideoFrameRate
public void setVideoFrameRate(int rate)
throws IllegalStateException
Sets the frame rate of the video to be captured. Must be called after setVideoSource(). Call this after setOutFormat() but before prepare().
设置frame率,必须在setVideoSource,setOutFormat之后,prepare()之前调用。

Parameters:
rate - the number of frames per second of video to capture
Throws:
IllegalStateException - if it is called after prepare() or before setOutputFormat().

http://www.androidjavadoc.com/1.0_r1_src/android/media/MediaRecorder.html#setVideoFrameRate(int)
ameyume 2011-03-24
  • 打赏
  • 举报
回复
/**
* Uses the settings from a CamcorderProfile object for recording. This method should
* be called after the video AND audio sources are set, and before setOutputFile().
* 使用来自记录CamcorderProfile对象的设置。这种方法应该调用在
* 被命名后的视频和音频源设置和setOutputFile()之前。
* @param profile the CamcorderProfile to use
* @see android.media.CamcorderProfile
*/
public void setProfile(CamcorderProfile profile) {
setOutputFormat(profile.fileFormat); //设置在录制过程中产生的输出文件格式
setVideoFrameRate(profile.videoFrameRate); //设置视频的帧速率,以被捕获setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight); //设置宽度和高度的视频捕获
setVideoEncodingBitRate(profile.videoBitRate); //设置视频编码录音比特率
setAudioEncodingBitRate(profile.audioBitRate);//设置音频编码录音比特率
setAudioChannels(profile.audioChannels);//设置录制的音频通道数
setAudioSamplingRate(profile.audioSampleRate); //设置音频采样率记录
setVideoEncoder(profile.videoCodec); //设置视频编码器可用于录制。如果这个方法不叫,输出文件将不包含视频
setAudioEncoder(profile.audioCodec); //设置音频编码器可用于录制 如果是录音一定要设置哦不然没有音频哦
}

http://hi.baidu.com/adnroidorg/blog/item/1859def9590b839959ee909a.html

http://stackoverflow.com/questions/5407116/how-to-change-framerate-when-using-mediarecorder-class
和楼主同样的问题,不会是楼主问的吧?

紫气东来 2011-03-24
  • 打赏
  • 举报
回复
我还尝试过使用CamcorderProfile来避免对recorder的复杂配置

recorder = new MediaRecorder(); 
recorder.setPreviewDisplay(surfaceHolder.getSurface());
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

//replacement
CamcorderProfile cpLow = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);
recorder.setProfile(cpLow);

recorder.setOutputFile(myRecAudioFile.getAbsolutePath());
recorder.prepare();
recorder.start();


Pro Android Media书上说的QUALITY_LOW Profile配置是12fps,但是我录出来的视频还是27fps,这是为什么呢?
紫气东来 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 ameyume 的回复:]
那会是系统中什么导致的这种结果呢?
[/Quote]

不知道,那得看Android中的源码了估计,接口都是一样的,2.2的帧率就是比2.3.3更接近,当然也有可能是Oxygen这个非主流ROM改了什么。

不过Oxygen ROM说自己尽量做到和官方系统最小的改动,比CM小。
ameyume 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 cctvufo 的回复:]
引用 11 楼 cctvufo 的回复:

引用 8 楼 ameyume 的回复:

是不是摄像头硬件不支持修改zhen数?

好像是有关
我用desire z(ROM:CM 6.1.1 ANDROID 2.2.1)音频用的AMR_NB编码(2.2的android不支持AAC),设定15fps,输出22fps
我用desire (ROM:OXYGEN ANDROID 2.3.2)音……
[/Quote]
那会是系统中什么导致的这种结果呢?
紫气东来 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cctvufo 的回复:]

引用 8 楼 ameyume 的回复:

是不是摄像头硬件不支持修改zhen数?

好像是有关
我用desire z(ROM:CM 6.1.1 ANDROID 2.2.1)音频用的AMR_NB编码(2.2的android不支持AAC),设定15fps,输出22fps
我用desire (ROM:OXYGEN ANDROID 2.3.2)音频用AMR_NB编码设定15fps,输出29fps
[/Quote]

应该是和系统有关,第三台手机: Desire (ROM: Stock Sense UI Android 2.2),音频用AMR_NB编码设定15fps,输出18fps
紫气东来 2011-03-24
  • 打赏
  • 举报
回复
当然,这也只是我猜测。
紫气东来 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ameyume 的回复:]

这个就看不懂了,不知道啥叫“自动帧率”的设备,是说和自动对焦差不多?

[/Quote]

帧率一般都不是固定的,在一个值附近浮动,你随意打开一个电影,用potplayer之类的播放器看看文件属性中的fps,一直都是变化的。
ameyume 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cctvufo 的回复:]
引用 13 楼 yiyaaixuexi 的回复:

这个真是太深了

小盆友,这个一点都不深的,最基本的一个库函数调用。
[/Quote]
这个小盆友那是很谦虚的,对编码很有研究。
ameyume 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cctvufo 的回复:]
引用 10 楼 ameyume 的回复:

NOTE: On some devices that have auto-frame rate, this sets the maximum frame rate, not a constant frame rate. Actual frame rate will vary according to lighting conditions.


……
[/Quote]
这个就看不懂了,不知道啥叫“自动帧率”的设备,是说和自动对焦差不多?
紫气东来 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yiyaaixuexi 的回复:]

这个真是太深了
[/Quote]
小盆友,这个一点都不深的,最基本的一个库函数调用。
念茜 2011-03-24
  • 打赏
  • 举报
回复
这个真是太深了
紫气东来 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ameyume 的回复:]

NOTE: On some devices that have auto-frame rate, this sets the maximum frame rate, not a constant frame rate. Actual frame rate will vary according to lighting conditions.
[/Quote]

在某些自动帧率的设备上,这个只是设定了最大帧率,并非一个常数帧率。
实际帧率因光照条件而改变。

哎,实际上也没限制到最大帧率,我的感觉。

至于光照,是越亮帧率应该越低吧?
越暗帧率越高?我在实验室感觉光照不错啊!
紫气东来 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ameyume 的回复:]

是不是摄像头硬件不支持修改zhen数?
[/Quote]
好像是有关
我用desire z(ROM:CM 6.1.1 ANDROID 2.2.1)音频用的AMR_NB编码(2.2的android不支持AAC),设定15fps,输出22fps
我用desire (ROM:OXYGEN ANDROID 2.3.2)音频用AMR_NB编码设定15fps,输出29fps
加载更多回复(4)

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧