10

Edit:Android MediaCodec koder - dziwne wyniki dla urządzenia Samsung

Wydaje się, że problemem jest to urządzenie nie potrzebuje wielokrotność 16 wymiarów ... ale wielokrotnością 32. Chodzi o to, wciąż nie mam pojęcia, jak ustalić, co określa jako urządzenie problematyczne. Wygląda na to, że używasz qcom (co jest moim zdaniem problematyczne w Androidzie 4.X, ale jest to Android 5.1.1).


Kodowanie wideo w mojej aplikacji na Androida. Do tego celu używam Android MediaCodec, konwertując RGB każdej klatki na YUV i przechodząc w pikselach.

Używany przez jakiś czas kod działa na każdym urządzeniu, z którym się zetknąłem.

Użytkownik przyszedł do mnie z raportem o błędzie, że ich MP4 były dziwaczne. Urządzeniem jest Samsung T337A (karta Galaxy 4).

Oto co eksport MP4 wyglądać następująco:

enter image description here

UWAGA - Z jakiegoś dziwnego powodu, nie stało na wszystkich rozdzielczościach. Potwierdziło się to na poziomie 768x432 i 1280x720, ale nie ma na przykład 640x352 (moja aplikacja zapewnia, że ​​wszystkie rozdzielczości są domyślnie podzielone przez 16).

Na Nexus 5X (który używa tego samego półpłaszczyznowego formatu YUV) wyjście działa we wszystkich rozdzielczościach.

Czy to coś z tym urządzeniem, a może z innymi urządzeniami, o których nie wiem?


Szukałem w ogóle wyjścia, i wygląda normalny i identyczny z Nexus 5X wspomniałem powyżej (który działa w 100% czasu).

Używane MediaCodecInfo to OMX.qcom.video.encoder.avc, używany format koloru to 2135033992 (który jest COLOR_FormatYUV420Flexible). W zasadzie nic dziwnego.

Kod jest nieco ekspansywny, w razie potrzeby opublikuję, ale po prostu szukam ogólnych pomysłów, dlaczego tak się dzieje. Zrozumiałbym, gdyby to było bardziej powszechne, ale ten sam kod działa dla wielu innych urządzeń, więc dzieje się coś ciekawego ...

Odpowiedz

2

Upewnij się, że używasz właściwych kroków i wartości przesunięć bufora

+0

Cóż, przechwytywam 'Planes []' z obiektu 'Image', który ma być renderowany,' inputImage.getPlanes() ', a następnie chwytam każdą pojedynczą płaszczyznę y, u, v. Następnie przechwyć krok z płaszczyzny u-plane "plane [1] .getPixelStride", która jest równa 1 lub 2 (planarne lub półnaturalne) i oba są rozliczane i dokładnie działają dla wszystkich typów urządzeń. Ten ma krok 2, ale po prostu nie działa tak jak inni? Co masz na myśli, mówiąc o ** wartościach przesunięcia bufora **, jeśli nie rozwiążesz problemu? Może być tym, czego potrzebuję, dzięki! – FTLRalph

+0

Wygląda na to, że to urządzenie nie potrzebuje mocy 16 wymiarów ... ale mocy 32. Jest to, wciąż nie mam pojęcia, jak określić, co określa jako problematyczne urządzenie. Wygląda na to, że używasz qcom (co jest moim zdaniem problematyczne w Androidzie 4.X, ale jest to Android 5.1.1). – FTLRalph

Powiązane problemy