2012-04-25 21 views
14

Jestem w stanie uzyskać dane ramki RGBA z kamery i chcę je zakodować w formacie H.264. Użyłem FFmpeg do kodowania i dekodowania wideo H.264, ale przy rozmiarze ramki 640x480 jest zbyt wolny dla moich potrzeb.Jak mogę przeprowadzić kodowanie i dekodowanie przy użyciu sprzętowego kodowania H.264 w celu przesyłania strumieniowego?

Chciałbym użyć przyspieszania sprzętowego, aby przyspieszyć kodowanie i dekodowanie, więc jak mam to zrobić?

Muszę też móc przesyłać strumieniowo zakodowane wideo przez sieć i dekodować je na drugim końcu. Jak to zrobić?

+0

Tytuł pytania brzmi "... dekodowanie wideo", ale faktyczne pytanie dotyczy kodowania, prawda? Może powinieneś edytować tytuł? – Anastasia

+0

Istnieje biblioteka, która umożliwia kodowanie ramek nieprzetworzonych do formatu H.264: http://www.foxitsolutions.com/iphone_h264_sdk.html. Ta biblioteka używa sprzętowego kodera i daje oddzielne ramki H.264. Proszę zobaczyć to pytanie i odpowiedź: http://stackoverflow.com/questions/7979842/video-encoding-libraries-for-ios/ – Anastasia

+0

Może duplikat: http://stackoverflow.com/questions/25197169/how-to- dekode-ah-264-frame-on-ios-by-hardware-dekodowanie –

Odpowiedz

18

Jeśli chcesz sprzętowo przyspieszać kodowanie wideo i dekodować wideo H.264 na iOS, jedynym wyjściem jest AVFoundation. Nie używaj bibliotek innych firm do kodowania lub dekodowania, ponieważ wszystkie one są obecnie związane z procesorem i są znacznie wolniejsze niż te, które dostajesz z AVFoundation. Jedną z przyczyn użycia kodera lub dekodera innej firmy byłoby domyślne korzystanie z formatu nieobsługiwanego w systemie iOS.

Aby dekodować sprzętowo, należy użyć instancji AVAssetReader (lub jednej z klas odtwarzaczy do odtwarzania czystego). Dzięki AVAssetReader, regularnie uzyskuję 2X lub wyższe prędkości odtwarzania do odczytu wideo zakodowanego w H.264, więc urządzenia iOS używają do tego dość dobrego przyspieszenia sprzętowego.

Podobnie, w przypadku przyspieszonego kodowania, użyjesz AVAssetWriter. Istnieje kilka trików, które skłoniły AVAssetWriter do kodowania z najlepszą szybkością (podawanie w ramkach BGRA, korzystanie z puli buforów pikseli, korzystanie z pamięci podręcznych tekstur systemu iOS 5.0 przy czytaniu z OpenGL ES), które opisuję szczegółowo w ramach this answer.

Jeśli chcesz zobaczyć kod korzystający z najszybszych ścieżek, które znalazłem dla przyspieszonego kodowania i dekodowania, możesz spojrzeć na mój framework open source GPUImage, który, w przeciwieństwie do tego, z którym łączy Anastasia, jest całkowicie darmowy .

+1

Dziękuję za kod źródłowy i nieobrobiony wygląd, ale nie znalazłem funkcji lub parametrów dostępu do kodowania lub dekodowania danych, potrzebuję uzyskać kodowanie danych wysyłanych przez sieć, a następnie na drugim końcu terminala, jeśli masz już interfejs lub funkcję, ale nie znalazłem nadziei na uzyskanie twojej pomocy, dziękuję bardzo – king

+1

Twoja lib jest świetna, ale służy do stosowania filtrów i przetwarzania nieprzetworzonego wideo, ale nie pomaga nic z faktycznym pytaniem jakim jest kodowanie sprzętowe. Jeśli użytkownik chce przesłać skompresowane dane przez sieć, żaden z powyższych api (czytnik zasobów i program do zapisu zasobów) nie pomoże. –

+0

@king - To może być szczegół, który chcesz dodać do pytania, ponieważ nie określiłeś, że chcesz uzyskać dostęp do nieprzetworzonych strumieni wejściowych i wyjściowych w celu przesyłania przez sieć. Moja odpowiedź dotyczy kodowania i dekodowania plików, w których AVAssetReader i AVAssetWriter są najlepszym sposobem. Mimo to będziesz używał AVFoundation do kodowania tutaj, jak opisuje mohsenr: http://stackoverflow.com/a/3484950/19679. –