MediaRecorder
ビデオの回転をオンまたはオフにして、この問題を数週間修正しようとしています。実行中の物理的な Samsung Galaxy S1 で回線setOrientationHint(90)
を動作させることができませんAndroid 2.3.3
( SDK 10
)。これは、上記のもので問題なく動作するはずSDK 9
です。
私が呼び出すsetOrientationHint(90)
と、例外が発生します: setParameters(video-param-rotation-angle-degrees=90) failed
. 以下の詳細なエラーの詳細。
その結果、SDK をチェックしてsetOrientationHint()
、SDK>10 の場合にのみ呼び出す必要があります。つまり、このコードは、私がテストした 10 以上の他のすべての SDK バージョンで正常に動作します。Samsung Galaxy Nexus の実行をテストしましたが4.2.2
、正常に動作します。
ここに私のコードがあります:(への呼び出しの順序を示すために切り詰めてくださいMediaRecorder
)
mCamera = getCameraInstance();
mCamera.setPreviewDisplay(holder);
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setOrientationHint(90);
// Step 1: Unlock and set camera to MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
// Step 2: Set sources
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: recording setup
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setVideoSize(720,480);
mMediaRecorder.setVideoFrameRate(15);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
// Step 4: Set output file
currentOutputFileName = DIRECTORY_PATH + "zzzz"+ iCount +".mp4";
mFile = new File(currentOutputFileName);
mMediaRecorder.setOutputFile(mFile.getAbsolutePath());
// Step 4.1: Set recording length
mMediaRecorder.setMaxDuration(10000);
// Step 5: Set the preview output
mMediaRecorder.setPreviewDisplay(cameraView.getHolder().getSurface());
// Step 6: Prepare configured MediaRecorder
mMediaRecorder.prepare();
誰かがこの問題を抱えていますか?これを経験している人を他に見つけることができず、それが事実であるとは信じられません. 2.3.3 を実行しているオーストラリアの Samsung Galaxy S1 だけの問題でしょうか?
そのラインが実行されているが実際のビデオでは回転しないという問題を抱えている人々への言及を見てきましたが、実際には例外を受け取ります-ラインはまったく実行されません. コマンドの順序を確認して再確認しましたが、問題ないようです。setOrientationHint()
最も重要なことは、コマンドが前に発生することだと思いますmediaRecorder.prepare()
エラーは次のとおりです。
AuthorDriver::setParameter() unrecognized key "video-param-rotation-angle-degrees"
setParameter(video-param-rotation-angle-degrees = 90) failed with result -5
Ln 1047 handleSetParameters("video-param-rotation-angle-degrees=90") error
Command (12) failed
setParameters(video-param-rotation-angle-degrees=90) failed: -2147483648
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x40015578)
FATAL EXCEPTION: main
java.lang.RuntimeException: setParameter failed.
at android.media.MediaRecorder.setParameter(Native Method)
at android.media.MediaRecorder.setOrientationHint(MediaRecorder.java:341)
at com.on3x.emergency.Recorder.prepareVideoRecorder(Recorder.java:196)
at com.on3x.emergency.Recorder.startRecording(Recorder.java:90)
at com.on3x.emergency.GUI.RecordActivity$1.onClick(RecordActivity.java:86)
at android.view.View.performClick(View.java:2538)
at android.view.View$PerformClick.run(View.java:9152)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
Force finishing activity com.on3x.emergency/.GUI.RecordActivity
Dumpstate > /data/log/dumpstate_app_error
誰かが何か助けを与えることができれば、それは大歓迎です。今のところ、クライアントに、現時点で修正できるものではなく、ビデオを横向きにする必要があることを伝えなければなりませんでした.
ビデオを回転させる別の方法はありますか? 基本的に、私のアプリはビデオを録画してサーバーにアップロードします。現時点では、この 2.3.3 フォンはビデオを回転できないため、横向きにアップロードされます
乾杯
編集: これは私が今持っているコードです。Ashish Gupta が示唆したように、AuthorDriver には、2.3.3 を実行している Samsung Galaxy S1 (オーストラリア モデル) の適切なパラメーターが含まれていません。
if (android.os.Build.VERSION.SDK_INT>=9) {
// attempt to rotate the video 90 degrees.
try {
mMediaRecorder.setOrientationHint(90);
Utils.logLine("orientation rotated 90", this, Utils.LOG_TYPE_DEBUG);
} catch (Exception e) {
Utils.logLine("error trying setOrientationHint"+ e.getMessage(), this, Utils.LOG_TYPE_ERROR, e);
e.printStackTrace();
}
} else {
Utils.logLine("orientation set skipped ", this, Utils.LOG_TYPE_DEBUG);
}
注: Utils.logLine は、デバッグおよびエラー ステートメントを出力してログに記録するための単なるユーティリティ関数です。うまくいけば、それは他の誰かを助けるかもしれません...