Próbuję parsować klatki H.264 z pliku .mov. Myślę, że doszedłem do wniosku, że mov.c z AVFormat - część FFMPEG jest drogą do zrobienia. Ale mov.c ma ~ 2600 linii obok nieskomentowanego kodu. Szukam przykładów użycia FFMPEG, szczególnie analizowania struktury dowolnego typu pliku. nie ma znaczenia, czy jest to MPEG4 czy Quicktime Movie, ponieważ są one dość podobne pod względem struktury.Parsowanie klatka po klatce od .mov przy użyciu ffmpeg
jeśli nie ma istniejących przykładów (nie mogę znaleźć) może ktoś go użył i może podać kilka linii kodu lub wyjaśnić, jak zacząć?
Co usiłuję zrobić: używam AVCaptureSession uchwycić próbki z kamerą, próbki te są następnie kodowane w H264 i zapisane do pliku za pomocą AVAssetsWriter, AVAssetsWriterInput i AVAssetsWriterInputPixelBufferAdaptor. Powodem jest to, że nie mogę uzyskać dostępu do sprzętu kodowania H264 bezpośrednio, ponieważ jabłko nie pozwoli na to. Co ja teraz trzeba zrobić (Nie sądzę pewien) jest analizować out:
The „MDAT” -atom (dane film, nie może być więcej niż jeden chyba) z pliku .mov. następnie "-atom, a następnie w komórce wideo (próbka danych wideo może być więcej niż jedna). Myślę, że będzie kilka atomów, które uważam za ramy. będą one typu "avc1" (to jest typ dla H264). Proszę, popraw mnie w tym, ponieważ jestem całkiem pewien, że nie dostałem tego wszystkiego poprawnie, ale.
moje pytanie brzmi, jak mam zamiar parsować się pojedynczych klatek. Czytałem the documentation i patrzyłem na iFrameExtractor (co nie jest bardzo pomocne, ponieważ dekoduje ramki). Myślę, że zrozumiałem to poprawnie, kiedy mam używać mov.c z FFMPEG-AVFormat, ale nie jestem pewien.
Edit: Jestem teraz próbuje tak:
uruchomić nieznacznie obniżonej funkcji init i iFrameExtractor który znajdzie się videostream w .mov pliku.
uzyskać dane na ramie tak:
AVPacket packet; av_read_frame(pFormatCtx, &packet); NSData *frame; if(packet.stream_index == videoStream){ frame = [NSData dataWithBytes:packet.data length:packet.size]; } videoStream++; av_free_packet(&packet); return frame;
i następnie przekazać go do podklasy NSOperation gdzie jest utrzymywany w oczekiwaniu na przesłaniu. , ale otrzymuję EXC_BAD_ACC, czy robię coś nie tak podczas kopiowania danych z ramki? jakieś pomysły. otrzymuję EXC _... kiedy próbuję ustawić zmienną klasy NSData* frame
używając jej (nonatomic, retain) -property. (Mówi EXC_BAD_ACC w wierszu syntetyzować)
mov.c nie pomoże ci w osiągnięciu celu końcowego. Jeśli potrzebujesz pomocy w analizie MOV/MP4, może ci się przydać. Kolejna poręczna biblioteka, w której sprawy stają się brutalne [mp4v2] (http://code.google.com/p/mp4v2/). Zasadniczo będziesz musiał napisać to sam. Żadna biblioteka nie wykona tej pracy z różnych powodów. –
@Steve McFarlin, dziękuję, masz wskazówki dotyczące czytania oprócz dokumentacji qt, aby uchwycić całą strukturę pliku mov, ponieważ naprawdę mam problem z chwytaniem tego wszystkiego, czy to prawda, że atom nie ma nawet być w określonej kolejności? który z nich był najłatwiejszy do pracy z mov lub mp4? –
@Steve McFarlin, domyślam się, że widziałeś projekt iFrameExtractor. jest to zasadniczo ten sam kod, co w tutorialu autorstwa Martina Böhme (na przykład na dranger.com). w następnej funkcji frame używają tylko av_read_frame, a następnie ją dekodują. czy AVPacket modyfikowany przez av_read_frame nie będzie kodowaną ramką H264? –