2016-01-31 11 views
10

Ich versuche, Zeitlupe Video auf meinem Nexus 5x zu erfassen. Dies ist, wie ich den Medienrecorder bin konfigurieren:Android erfassen Zeitlupe Video mit CamcorderProfil

CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH_SPEED_HIGH); 

mMediaRecorder = new MediaRecorder(); 

// Step 1: Unlock and set camera to MediaRecorder 
mCamera.unlock(); 
mMediaRecorder.setCamera(mCamera); 

// Step 2: Set sources 
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

// Step 3: Set the high speed CamcorderProfile 
mMediaRecorder.setProfile(profile); 

// Step 4: Set output file 
// Step 5: Prepare media recorder 
// Step 6: Capture video 

Das Problem ist, sind die aufgenommenen Videos nicht die 120 fps Zeitlupe Videos, die das Gerät unterstützt. Sie sind die normalen 29 fps Videos.

Ich ging durch this answer, die in der official documentation zu folgendem spricht:

Für alle Hochgeschwindigkeitsprofile definiert unter ((von QUALITY_HIGH_SPEED_LOW zu QUALITY_HIGH_SPEED_2160P), sie als normale Aufzeichnungsprofile ähnlich sind, mit nur höherer Ausgabe Bildrate und Bitrate.Folgen diese Profile mit SetProfile (CamcorderProfile) ohne Angabe einer anderen Codierung Parameter werden High-Speed-Videos statt Zeitlupe Videos, die Hav e verschiedene Aufnahme- und Ausgabefrequenzen (Wiedergabe). Um Zeitlupenvideos aufzunehmen, muss die Anwendung die Videoausgabe (Wiedergabe) Bildrate und Bitrate entsprechend über setVideoFrameRate (int) und setVideoEncodingBitRate (int) basierend auf dem Zeitlupenfaktor einstellen. Wenn die Anwendung das Video mit MediaCodec-Encoder aufnehmen möchte, muss sie jedes einzelne Feld von MediaFormat entsprechend diesem CamcorderProfile ähnlich einstellen.

Die Sache, die ich nicht bekommen ist, setProfile bereits die beiden Methoden setVideoFrameRate und setVideoEncodingBitRate mit Parametern aus dem gewählten CamcorderProfile abgeleitet nennt. Warum muss ich sie noch einmal anrufen? Was fehlt mir hier?

Jede Hilfe würde sehr geschätzt werden. Für das Leben von mir kann ich das nicht zur Arbeit bringen!

EDIT: Ich habe versucht, die Methoden wie so nennen, aber es fängt immer noch normale Geschwindigkeit Video:

mMediaRecorder.setVideoFrameRate(profile.videoFrameRate/4); 
mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate/4); 

1/4, da die beworbene Bildrate durch die CamcorderProfile.QUALITY_HIGH_SPEED_HIGH 120 ist, und ich möchte ein erfassen 30 fps Video wie im Dokument angegeben here

public int videoFrameRate

Added in API-Ebene 8 die Ziel Video-Bildrate in Bildern pro Sekunde ond.

Dies ist die Zielvideoausgabebildrate pro Sekunde aufgezeichnet, wenn die Anwendung die Aufzeichnungsvideo konfiguriert via setProfile (CamcorderProfile) ohne irgendwelche anderen MediaRecorder Codierparameter angibt. Zum Beispiel für die Hochgeschwindigkeitsqualität Profile (von QUALITY_HIGH_SPEED_LOW bis QUALITY_HIGH_SPEED_2160P), Dies ist die Bildfrequenz, mit der das Video aufgezeichnet und wiedergegeben wird mit. Wenn die Anwendung beabsichtigt, Zeitlupe Anwendungsfall mit die High-Speed-Qualitätsprofile erstellen, muss es einen anderen Video-Frame Rate, die der gewünschten Ausgabe (Wiedergabe) Bildrate über SetVideoFrameRate (int) entspricht.Zum Beispiel, wenn QUALITY_HIGH_SPEED_720P 240fps videoFrameRate im CamcorderProfile ankündigt und die Anwendung Videos mit Zeitlupenaufnahme im 1/8-Faktor erstellt, muss die Anwendung 30fps über setVideoFrameRate (int) setzen, . Failing zu tun dies wird High-Speed-Videos mit normaler Geschwindigkeit Wiedergabe Bildrate (240fps für das obige Beispiel). Wenn die Anwendung beabsichtigt, die Videoaufzeichnung mit MediaCodec-Encoder durchzuführen, muss sie jedes einzelne Feld von MediaFormat in ähnlicher Weise entsprechend diesem CamcorderProfile festlegen.

+0

Nur eine Vermutung, aber haben Sie versucht, eigentlich 'setVideoFrameRate' anrufen und' setVideoEncodingBitRate' manuell? Hast du die Werte überprüft, die dein Profil übermittelt? – damian

+0

Ja @damian, rufe ich die folgenden kurz vor vorbereiten: 'mMediaRecorder.setVideoEncodingBitRate (profile.videoBitRate/4);' ' mMediaRecorder.setVideoFrameRate (profile.videoFrameRate/4);' Das Profil 'videoBitRate' ist' 27000000' und 'videoFrameRate' ist' 120' – Siddharth

+0

Hallo, @Siddharth. Haben Sie jemals eine Lösung gefunden? Ich habe das gleiche Problem. – flutillie

Antwort

-1
mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_LOW); 

oder

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH); 
+1

Die [doc] (https://developer.android.com/intl/es/reference/android/media/CamcorderProfile.html#QUALITY_HIGH_SPEED_HIGH) sagt, dass der Wert von 'CamcorderProfile.QUALITY_HIGH_SPEED_HIGH'' 2001' ist. Ich bezweifle, dass ich videoFrameRate als 2001 einstellen kann. Können Sie Ihre Antwort ausarbeiten? – Siddharth