私はMediaRecorderのビデオを録画していますが、私はsetCaptureRate()の効果で非常に混乱しています。Android MediaRecorder setCaptureRate()とビデオ再生の速度
具体的には、次のように私は私のMediaRecorderを準備します。私は(CountDownTimerと、それは無関係です)5秒間録音
mMediaRecorder = new MediaRecorder();
mCamera.stopPreview();
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setProfile(CamcorderProfile.QUALITY_TIME_LAPSE_480P);
mMediaRecorder.setCaptureRate(30f);
mMediaRecorder.setOrientationHint(270);
mMediaRecorder.setOutputFile(...);
mMediaRecorder.setPreviewDisplay(...);
mMediaRecorder.prepare();
、これが生成されますファイルです:
$ ffmpeg -i ~/CaptureRate30fps.mp4
...
Seems stream 0 codec frame rate differs from container frame rate: 180000.00 (180000/1) -> 30.00 (30/1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/mspitz/CaptureRate30fps.mp4':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: isom3gp4
creation_time : 2013-06-04 00:52:00
Duration: 00:00:02.59, start: 0.000000, bitrate: 5238 kb/s
Stream #0.0(eng): Video: h264 (Baseline), yuv420p, 720x480, 5235 kb/s, PAR 65536:65536 DAR 3:2, 30 fps, 30 tbr, 90k tbn, 180k tbc
Metadata:
creation_time : 2013-06-04 00:52:00
Durationは約3秒です。ビデオはまた、3秒間に5秒のビデオが入っているかのように、もっと速く再生されます。
私は上記のようにmediaRecorderを正確に準備して記録しますが、setCaptureRate(30f)行を引くと、これは、
$ ffmpeg -i ~/NoSetCaptureRate.mp4
...
Seems stream 0 codec frame rate differs from container frame rate: 180000.00 (180000/1) -> 90000.00 (180000/2)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/mspitz/NoSetCaptureRate.mp4':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: isom3gp4
creation_time : 2013-06-04 00:50:41
Duration: 00:00:04.87, start: 0.000000, bitrate: 2803 kb/s
Stream #0.0(eng): Video: h264 (Baseline), yuv420p, 720x480, 2801 kb/s, PAR 65536:65536 DAR 3:2, 16.01 fps, 90k tbr, 90k tbn, 180k tbc
Metadata:
creation_time : 2013-06-04 00:50:41
期待どおり約5秒であることに注意してください。ビデオも通常の速度で再生されます。
私はCamCorderProfileのvideoFrameRateの値が毎秒30フレームであるため、setCaptureRate(30f)を使用しています。ギャラクシーNexus S2(4.2.1)ではsetCaptureRate()を省略しても問題ありませんが、Galaxy Nexus S3(4.1.1)でテストした場合、setCaptureRate()を省略すると便利な "start failed -22"というエラーが発生します私がmMediaRecorder.start()
と呼んだとき。
私は何が欠けていますか?キャプチャレートとビデオフレームレートは独立していると思いましたが、そうではないことは明らかです。ビデオが1倍速で再生されることを確認するためにキャプチャレートを設定する必要があるかどうかをプログラムで判断する方法はありますか?
なぜ「QUALITY_TIME_LAPSE_480P」ではなく「QUALITY_480P」でないのですか?タイムラプスは本来1倍の再生速度ではありません。 –
また、 'MediaRecorder.setVideoFrameRate'を呼び出してみましたか? –
@RomanNurikあなたのコメントありがとう!私は実際には音を録音したくはありません。それを行う唯一の方法は、時間経過ビデオを使用することです。 Re:setVideoFrameRate、setProfile()を呼び出すと呼び出されます:https://github.com/android/platform_frameworks_base/blob/master/media/java/android/media/MediaRecorder.java#L329実際、ソースを見ると最初の場所でsetCaptureRate()を呼び出す必要があることを私に伝えました。 https://github.com/android/platform_frameworks_base/blob/master/media/java/android/media/MediaRecorder.java#L337それ以外の場合は、-22を取得します。 – spitzanator