2013-10-21 22 views
8

Koduję dane podglądu Camera przy użyciu MediaCodec z mime-type "video/avc" i przekazując zakodowane dane (tylko wideo, bez dźwięku) do MediaMuxer. Muxer wydaje się działać dobrze i tworzy plik wyjściowy o rozsądnych rozmiarach (tj. Staje się większy, im dłużej nagrywam). Jednak, gdy staram się zatrzymać muxer dostaję „Nie udało się zatrzymać muxer” Błąd:Błąd MediaMuxer "Nie udało się zatrzymać multipleksera"

10-21 10:39:40.755: E/AndroidRuntime(2166): Caused by: java.lang.IllegalStateException: Failed to stop the muxer 

Istnieją pewne podejrzane wiadomości dziennika MPEG4Writer poprzedzające powiodło STOP:

10-21 10:39:40.740: D/MPEG4Writer(2166): Stopping Video track 
10-21 10:39:40.740: E/MPEG4Writer(2166): Missing codec specific data 
10-21 10:39:40.740: W/MPEG4Writer(2166): 0-duration samples found: 122 
10-21 10:39:40.740: I/MPEG4Writer(2166): Received total/0-length (123/1) buffers and encoded 123 frames. - video 
10-21 10:39:40.740: D/MPEG4Writer(2166): Stopping Video track source 
10-21 10:39:40.740: D/MPEG4Writer(2166): Video track stopped 
10-21 10:39:40.740: D/MPEG4Writer(2166): Stopping writer thread 
10-21 10:39:40.740: D/MPEG4Writer(2166): 0 chunks are written in the last batch 
10-21 10:39:40.740: D/MPEG4Writer(2166): Writer thread stopped 
10-21 10:39:40.740: E/MPEG4Writer(2166): writer error ended! 

żadnych wskazówek co powoduje to? Nie wiesz, jakie dodatkowe informacje będą Ci potrzebne.

+0

Wygląda tak jak twój muxer już się skończył, gdy próbujesz go zatrzymać. Musisz wysłać nam kod, aby Ci pomóc. –

Odpowiedz

12
E/MPEG4Writer(2166): Missing codec specific data 

Brzmi jakbyś nie zadzwonił MediaMuxer#addTrack() z MediaFormat które obejmowały CSD. Zobacz kod EncodeAndMuxTest.java, aby dowiedzieć się, jak to zrobić.

Patrząc na MPEG4Writer implementation używany przez MediaMuxer, w linii 2360 jest sprawdzana isTrackMalformed(); ustawia ona ERROR_MALFORMED, jeśli dane CSD nie są obecne, ale nie wraca natychmiast. Nic nie usuwa błędu, więc wykona masę pracy, a następnie zawiedzie, co wydaje się pasować do tego, co widzisz.

+5

Napotkano również ten problem i chciałbym dodać pewne wyjaśnienie: Aby utworzyć MediaFormat, który zawiera CSD (Dane specyficzne dla Codec), należy uzyskać wspomnianą MediaFormat z całkowicie skonfigurowanej instancji kodera przez encoder.getOutputFormat. – Rakatan

+0

Komentarz Rakatana jest bardzo użyteczny. Nie próbuj samodzielnie budować MediaFormat. – Qylin

3

Miałem ten sam problem. Podczas zamykania Muxera wystąpił błąd "Nie udało się zatrzymać". Gdy sprawdziłem zapisany plik w przeglądarce ISO, nie mogłem znaleźć w nim ścieżki. I rozwiązać problem tworząc ścieżkę tylko po otrzymaniu pierwszego wyjścia z filmu encoder.Here sposób mogę dodać utwór

m_VideoTrackIndex = muxer.addTrack(mediaCodec.getOutputFormat()); 

format nośnika na torze jest otrzymywany z mediaCodec.getOutputFormat() który z kolei zostanie zainicjalizowany dopiero po zakodowaniu pierwszej klatki. Zmieniłem kod, aby dodać ścieżkę po uzyskaniu pierwszych zakodowanych danych (i oczywiście tylko raz). Działa dobrze.

+0

if (encoderStatus = MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { \t \t \t \t \t MediaFormat newFormat = mEncoder.getOutputFormat(); \t \t \t \t \t mTrackIndex = mMuxer.addTrack (newFormat); \t \t \t \t \t mMuxer.start(); – surya

2

Istnieją 2 Problemy z Androidem 5.0.2 Urządzenia Moto E 1) szerokość & wysokość jeśli nie podano wielokrotności 16 jej upaść 2) mediaBuffer która zostanie ustalona po pierwszej klatce jest kodowany

Powiązane problemy