10

Szukam najlepszego sposobu (jeśli jest ...) do przechwytywania ciągłego wideo do okrągłego bufora na karcie SD, umożliwiając użytkownikowi przechwytywanie zdarzeń po ich wystąpieniu.Nagrywanie wideo w okrągłym buforze na Androida

Standardowy interfejs API do nagrywania wideo umożliwia zapisanie bezpośrednio do pliku, a po osiągnięciu limitu (ustawionego przez użytkownika lub pojemności karty SD) należy zatrzymać i ponownie uruchomić nagrywanie. Tworzy to okno o długości 2 sekund, w którym nagranie nie jest uruchomione. To właśnie robią niektóre istniejące aplikacje, takie jak DailyRoads Voyager. Aby zminimalizować ryzyko utraty czegoś ważnego, możesz ustawić czas podziału na coś długiego, np. 10 minut, ale jeśli zdarzenie wystąpi pod koniec tego okresu, marnujesz przestrzeń, przechowując 9 minut nic od początku.

Tak, mój pomysł na teraz jest następujący: Będę miał duży plik, który będzie służyć jako bufor. Wykorzystam kod, który znalazłem, aby przechwycić ramki i zapisać je w pliku, zawijając na końcu. Gdy użytkownik chce zachować część, oznaczę go wskaźnikami do początku i końca w buforze. Nagrywanie można kontynuować jak poprzednio, pomijając regiony oznaczone jako retencyjne.

Po zatrzymaniu nagrywania, a może podczas tego na wątku tła (w zależności od szybkości telefonu/karty), skopiuję zaznaczony region do innego pliku i usuniemy ochronę nadpisywania.

Główne pytanie, jeśli nie dbają o szczegóły powyżej: Nie mogę znaleźć sposobu na konwersję poszczególnych klatek do pliku wideo w Android SDK. Czy to możliwe? Jeśli nie, czy są jakieś dostępne biblioteki, być może w natywnym kodzie, które mogą to zrobić?

Nie interesuje mnie duży bufor nieskompresowanych ramek, ale eksportowane filmy powinny być kompresowane w formacie przyjaznym dla systemu Android. Ale jeśli istnieje sposób skompresowania bufora, chciałbym o tym usłyszeć.

Dziękuję.

Odpowiedz

8

W Androidzie MediaRecorder istnieje dwa sposoby określenia danych wyjściowych. Jeden to nazwa pliku, a drugi to FileDescriptor.

Za pomocą metody statycznej można uzyskać instancję ParcelFileDescriptor wskazującą gniazdo. Następnie zadzwoń pod numer getFileDescriptor, aby uzyskać FileDescriptor, który należy przekazać do MediaRecorder.

Ponieważ możesz uzyskać zakodowane wideo z gniazda (tak jakby tworzyłeś lokalny serwer WWW), będziesz mógł uzyskać dostęp do poszczególnych klatek filmu, choć nie bezpośrednio, ponieważ będziesz musiał go rozszyfrować pierwszy.

+0

Wydaje się być dobrym sposobem na uzyskanie zakodowanego strumienia wideo, dzięki. Będę musiał wypróbować, jak to działa. Ale dekodowanie pojedynczych klatek przyniosłoby zbyt dużo CPU, może nawet nie byłoby w czasie rzeczywistym (kodowanie + dekodowanie w tym samym czasie) w niektórych telefonach. Więc myślę, że po prostu napiszę zakodowany strumień do jakiegoś okrężnego bufora plików, bez nagłówków i tak dalej. Następnie podczas eksportu spróbuję zaszyfrować zakodowane ramki razem z nagłówkiem i utworzyć poprawny plik wideo. – lacop

+2

@albwq, czy twoja metoda działa dobrze dla ciebie? – Felix

+2

Czy możesz podać kod demo? Będzie to bardzo pomocne! =) –