6

Obecnie pracuję z Androidem Jelly Bean MediaCodec API, aby stworzyć prosty odtwarzacz wideo.Wideo interfejsu API Android MediaCodec gra zbyt szybko

Wyodrębniam ścieżki, odtwarzam audio i wideo w osobnych wątkach. Problem polega na tym, że ścieżka wideo zawsze jest odtwarzana zbyt szybko.

Gdzie może być problem ukryty?
Zarówno dźwięk, jak i wideo są traktowane prawie tak samo, z wyjątkiem dźwięku odtwarzanego za pomocą funkcji AudioTrack, a wideo jest renderowane na powierzchnię.

+0

Skąd się wziąłeś? – BlueVoodoo

+0

Czy możesz opublikować swój kod. Byłoby pomocne debugowanie inn – itsmeagain

+0

Mam ten sam problem, czy to wymyślił? – xiaowoo

Odpowiedz

3

Jeśli renderujesz ramki z maksymalną prędkością, na większości urządzeń osiągniesz 60 fps. Musisz go ustawić zgodnie ze znacznikami czasu prezentacji dostarczonymi przez koder.

Na przykład, jeśli dane wejściowe to format obsługiwany przez system Android (na przykład typowy plik MP4), można użyć klasy MediaExtractor, aby wyodrębnić każdą klatkę. Znacznik czasu można pobrać przy pomocy getSampleTime(). Chcesz opóźnić renderowanie o różnicę między znacznikami czasowymi w kolejnych klatkach - nie zakładaj, że pierwsza klatka będzie miała znacznik czasu równy zero.

Nie należy również zakładać, że klatki wideo pojawiają się ze stałą szybkością (na przykład 30 kl./s). W przypadku niektórych źródeł ramki pojawią się nierównomiernie.

Zobacz przykład "Odtwarzaj wideo (TextureView)" w Grafika, szczególnie w klasie SpeedControlCallback. Film gen-eight-rects.mp4 używa zmiennych długości klatek, aby z niego korzystać. Jeśli zaznaczysz pole "Play at 60fps", znaczniki czasu prezentacji zostaną zignorowane.

Powiązane problemy