Poniżej znajduje się struktura mojego kodu pracy do nagrywania wideo i audio:Korzystanie android MediaRecorder
pytania: 1) Dlaczego CamcorderProfile
potrzebne? setProfile(...)
pojawia się, aby ustawić wymiary na dowolną wartość QUALITY_HIGH, ale później ustawię żądane wymiary za pomocą setVideoSize(...)
, co spowoduje nadpisanie tego wymiaru. Jednak po usunięciu dwóch linii CamcorderProfile aplikacja ulega awarii pod numerem setVideoSize(...)
z LogCat E/MediaRecorder(19526): setVideoSize called in an invalid state: 2
.
2) Jak nie nagrywać dźwięku? Dokumentacja stwierdza, że jeśli nie zostanie wywołana setAudioSource(...)
, nie będzie ścieżki dźwiękowej. Jednak po usunięciu tej linii aplikacja ulega awarii pod numerem setProfile(...)
z LogCat E/MediaRecorder(19946): try to set the audio encoder without setting the audio source first
.
3) Jeśli usunę obie linie kamery Camcorder i linię setAudioSource(...)
, ulegnie awarii, jak w 1).
4) Próbowałem również dodać linię
recorder.setOutputFormat(OutputFormat.DEFAULT);
zamiast linii CamcorderProfile. Ale teraz ulega awarii na perpare()
. Jeśli setAudioSource(...)
nazywa się LogCat jest: E/MediaRecorder(20737): audio source is set, but audio encoder is not set
jeśli nie nazywa się logcat jest: E/MediaRecorder(20544): video source is set, but video encoder is not set
Szukałem allover internet i nie mogę znaleźć dobry przykład poprawny sposób skonfigurować MediaRecorder. Here to oznacza, że po API 8 powinieneś używać klasy CamcorderProfile, ale wydaje mi się, że powoduje problemy.
Każda pomoc będzie świetna! Dzięki!
Code (który działa podczas uruchamiania, jak to jest poniżej):
recorder = new MediaRecorder();
recorder.setCamera(<<camera>>);
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(profile);
recorder.setOutputFile(<<Path String>>);
recorder.setVideoSize(<<Width>>, <<Height>>);
recorder.setPreviewDisplay(<<Surface>>);
recorder.setOrientationHint(0);
recorder.setMaxDuration(10000);
recorder.setOnInfoListener(this);
try
{
recorder.prepare();
recorder.start();
} catch ...
Masz rację, tak jak to napisałem, znalazłem kod funkcji 'setProfile()'. Zawsze wywołuje 'setAudioEncoder()', więc jeśli nie ustawisz źródła dźwięku, zawiesi się. Odpowiedzią jest skopiowanie tej funkcji, dzięki czemu nadal możesz korzystać z wbudowanych ustawień 'CamcorderProfile', ale także wybrać ustawienia, które chcesz ustawić (np. Audio). Dzięki – jacobianism
Tak, jeśli chcesz użyć kamery, aby uzyskać tylko wideo, możesz to zrobić. W ten sposób można uzyskać optymalne dostępne wartości dla dowolnego urządzenia bez konieczności ich kodowania. –
Po wielu poszukiwaniach Twój post zrobił mój dzień. Umieszczanie setVideoSize przed setVideoEncoder i setAudioEncoder załatwił sprawę. Dzięki – gtsouk