Android:视频编码 H.264 和设置帧率不起作用

标签 android video-encoding h.264 frame-rate

我有一台 HTC MyTouch 3G Slide(Android 2.1,API 级别 7)。我正在尝试编写一个程序以 15fps 的速度录制 320x240 h.264 视频,但我有两个主要问题。如果能解决这两个问题,我将不胜感激。这是我正在做的:

mediaRecorder = new MediaRecorder();
mediaRecorder.setCamera(camera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setMaxDuration(600000);
mediaRecorder.setOutputFile("/sdcard/test.mp4");
mediaRecorder.setVideoFrameRate(15);
mediaRecorder.setVideoSize(320, 240);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setPreviewDisplay(holder.getSurface());
mediaRecorder.setMaxFileSize(maxFileSizeInBytes);
mediaRecorder.prepare();
mediaRecorder.start();

问题 1) H263 和 MPEG_4_SP 工作正常,但 H264 不工作。在调用 prepare() 时,logcat 中充满了以下错误:

E/PackageInstallationReceiver(  209): Remove /data/local/tmp/com.helios.apk Fail!
E/mm-camera 7x-vfe( 2496): Received VFE start ACK!!! This is a user preview start.
E/audio_input( 2496): unsupported parameter: x-pvmf/media-input-node/cap-config-interface;valtype=key_specific_value
E/audio_input( 2496): VerifyAndSetParameter failed
E/CameraInput( 2496): Unsupported parameter(x-pvmf/media-input-node/cap-config-interface;valtype=key_specific_value)
E/CameraInput( 2496): VerifiyAndSetParameter failed on parameter #0
E/PVOMXEncNode( 2496): PVMFOMXEncNode-Audio_AMRNB::DoPrepare(): Got Component OMX.PV.amrencnb handle 
E/PVOMXEncNode( 2496): PVMFOMXEncNode-Video_AVC::DoPrepare(): Cannot get component OMX.PV.avcenc handle, try another component if available
E/AuthorDriver( 2496): Command 13 completed with error -17
E/MediaRecorder( 3221): prepare failed: -17
E/Helios  ( 3221): prepare failed.
E/AndroidRuntime( 3221): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 3221): java.lang.RuntimeException: unlock failed
E/AndroidRuntime( 3221):    at android.hardware.Camera.unlock(Native Method)
E/AndroidRuntime( 3221):    at com.helios.ActivityLauncher.startRecording(ActivityLauncher.java:268)
E/AndroidRuntime( 3221):    at com.helios.ActivityLauncher.onLongClick(ActivityLauncher.java:223)
E/AndroidRuntime( 3221):    at com.helios.ActivityLauncher.onClick(ActivityLauncher.java:203)
E/AndroidRuntime( 3221):    at android.view.View.performClick(View.java:2361)
E/AndroidRuntime( 3221):    at android.view.View.onTouchEvent(View.java:4176)
E/AndroidRuntime( 3221):    at android.view.View.dispatchTouchEvent(View.java:3706)
E/AndroidRuntime( 3221):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
E/AndroidRuntime( 3221):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
E/AndroidRuntime( 3221):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
E/AndroidRuntime( 3221):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
E/AndroidRuntime( 3221):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1696)
E/AndroidRuntime( 3221):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1117)
E/AndroidRuntime( 3221):    at android.app.Activity.dispatchTouchEvent(Activity.java:2068)
E/AndroidRuntime( 3221):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1680)
E/AndroidRuntime( 3221):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1707)
E/AndroidRuntime( 3221):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 3221):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 3221):    at android.app.ActivityThread.main(ActivityThread.java:4702)
E/AndroidRuntime( 3221):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 3221):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 3221):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime( 3221):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime( 3221):    at dalvik.system.NativeStart.main(Native Method)
E/dalvikvm( 3221): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
E/JavaBinder(   78): !!! FAILED BINDER TRANSACTION !!!
E/ActivityManager(   78): fail to set top app changed!
E/audio_input( 2496): unsupported parameter: x-pvmf/media-input-node/cap-config-interface;valtype=key_specific_value
E/audio_input( 2496): VerifyAndSetParameter failed
E/CameraInput( 2496): Unsupported parameter(x-pvmf/media-input-node/cap-config-interface;valtype=key_specific_value)
E/CameraInput( 2496): VerifiyAndSetParameter failed on parameter #0
E/CameraService( 2496): getClientFromCookie: client appears to have died
E/mm-camera( 2496): +++ DELETING LEAKED MEMORY AT 0x33f48 (2 REMAINING)
E/mm-camera( 2496):      6 0xa942ba5c
E/mm-camera( 2496):      5 0xa940bfc2
E/mm-camera( 2496):      4 0xa940d774
E/mm-camera( 2496):      3 0xa940d28a
E/mm-camera( 2496):      2 0xafe100c4
E/mm-camera( 2496):      1 0xafe0fb98
E/mm-camera( 2496): +++ DELETING LEAKED MEMORY AT 0x20dc8 (1 REMAINING)
E/mm-camera( 2496):      6 0xa942ba5c
E/mm-camera( 2496):      5 0xa940bfc2
E/mm-camera( 2496):      4 0xa940d774
E/mm-camera( 2496):      3 0xa940d28a
E/mm-camera( 2496):      2 0xafe100c4
E/mm-camera( 2496):      1 0xafe0fb98

使用 H.263(有效)时,错误日志仅包含:

E/CameraInput(   58): Unsupported parameter(x-pvmf/media-input-node/cap-config-interface;valtype=key_specific_value)
E/CameraInput(   58): VerifiyAndSetParameter failed on parameter #0
E/PVOMXEncNode(   58): PVMFOMXEncNode-Audio_AMRNB::DoPrepare(): Got Component OMX.PV.amrencnb handle 
E/OMXVenc (   58): component_init::359 Initializing component OMX.qcom.video.encoder.h263
E/PVOMXEncNode(   58): PVMFOMXEncNode-Video_H263::DoPrepare(): Got Component OMX.qcom.video.encoder.h263 handle 
E/OMXVenc (   58): set_parameter::1104 set_parameter : output buffer size = 76800
E/OMXVenc (   58): set_parameter::1104 set_parameter : output buffer size = 76800
E/OMXVenc (   58): get_parameter::1007 unsupported index 100663301
E/OMXVenc (   58): set_parameter::1240 unsupported index 100663301
E/OMXVenc (   58): get_parameter::1007 unsupported index 100663302
E/OMXVenc (   58): set_parameter::1240 unsupported index 100663302
E/OMXVenc (   58): send_command::758 attempt to move to new state 2
E/OMXVenc (   58): Setting OMX_Video_ControlRateVariable
E/OMXVenc (   58): use_buffer::1437 client allocated input buffer for component 115200, address= 0x98228
E/OMXVenc (   58): use_buffer::1437 client allocated input buffer for component 115200, address= 0x98218
E/OMXVenc (   58): use_buffer::1437 client allocated input buffer for component 115200, address= 0x98208
E/OMXVenc (   58): use_buffer::1437 client allocated input buffer for component 115200, address= 0x981f8
E/OMXVenc (   58): allocate_buffer::1577 Attempt to allocate buffer of 76800 bytes for OUTPUT PORT
E/OMXVenc (   58): allocate_buffer::1577 Attempt to allocate buffer of 76800 bytes for OUTPUT PORT
E/OMXVenc (   58): allocate_buffer::1577 Attempt to allocate buffer of 76800 bytes for OUTPUT PORT
E/OMXVenc (   58): allocate_buffer::1577 Attempt to allocate buffer of 76800 bytes for OUTPUT PORT
E/OMXVenc (   58): send_command::758 attempt to move to new state 2
E/OMXVenc (   58): process_state_change::2580 Req to Move to Idle: Call venc_stop
E/VENC    (   58): venc_stop::1150 Received command VENC_CMD_STOP
E/VENC_DRV(   58): Reset_HW::344 adsp_rtos_disable
E/OMXVenc (   58): process_DL_status::2737 got DL status for VENC_CMD_STOP
E/OMXVenc (   58): process_DL_status::2809 encoder already moves to idle state. call event handler now
E/OMXVenc (   58): send_command::758 attempt to move to new state 1
E/audio_input(   58): unsupported parameter: x-pvmf/media-input-node/cap-config-interface;valtype=key_specific_value
E/audio_input(   58): VerifyAndSetParameter failed
E/CameraInput(   58): Unsupported parameter(x-pvmf/media-input-node/cap-config-interface;valtype=key_specific_value)
E/CameraInput(   58): VerifiyAndSetParameter failed on parameter #0
E/QCOmxcore(   58): OMXCORE API :  Free Handle 93b2c
E/VENC    (   58): venci_process_command_unload::2408 Encoder time taken to Exit from Stop command: 76
E/OMXVenc (   58): component_deinit::2033 deinitializing component...
E/OMXVenc (   58): component_deinit::2108 Encoder has exited
E/QCOmxcore(   58):  Unloading the dynamic library for OMX.qcom.video.encoder.h263
E/mm-camera(   58): +++ DELETING LEAKED MEMORY AT 0x3fe78 (2 REMAINING)
E/mm-camera(   58):      6 0xa942ba5c
E/mm-camera(   58):      5 0xa940bfc2
E/mm-camera(   58):      4 0xa940d774
E/mm-camera(   58):      3 0xa940d28a
E/mm-camera(   58):      2 0xafe100c4
E/mm-camera(   58):      1 0xafe0fb98
E/mm-camera(   58): +++ DELETING LEAKED MEMORY AT 0x2dd00 (1 REMAINING)
E/mm-camera(   58):      6 0xa942ba5c
E/mm-camera(   58):      5 0xa940bfc2
E/mm-camera(   58):      4 0xa940d774
E/mm-camera(   58):      3 0xa940d28a
E/mm-camera(   58):      2 0xafe100c4
E/mm-camera(   58):      1 0xafe0fb98

问题 2) 虽然我明确将帧速率设置为 15fps,但剪辑的后期分析显示奇怪的帧速率,如 21.xx 或 25.xx fps。

为什么 H264 可能不工作,为什么 MediaRecorder 不遵守我请求的帧速率?提前致谢。

最佳答案

问题1)
无法获取组件 OMX.PV.avcenc 句柄
您的手机不支持 H.264 编码。

关于Android:视频编码 H.264 和设置帧率不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5146661/

相关文章:

android - 有没有办法让 Vuforia 和 ARCore 在同一个应用程序中?

video - SVT-AV1 : After encoding the video seeking is very bad in any video player (even HTML5)

ffmpeg - 如何下载 .m4s 文件的特定部分

FFMPEG 转码器产生损坏的视频

ffmpeg - 如何使用 ffmpeg 从 H264 视频中提取最接近给定帧号的关键帧

android - 如何添加在不同的 android 项目中创建的类?

android - 获取 java.lang.NoSuchMethodError,没有虚拟方法日志(ILjava/lang/String;Ljava/lang/Throwable;)

android - Android 中的 onTouchListener 将检测所有父 View 上的触摸

video - 正确使用avcodec_encode_video2() Flush

ios - 在 ios 中解码 h264