Czy istnieje interfejs API, który może podać listę znaczników czasowych klatek kluczowych dla danego pliku wideo w systemie Android?Jak uzyskać listę kluczowych klatek (ramek synchronizacji) znaczników czasu dla plików wideo w systemie Android?
Odpowiedz
wierzę poprawną odpowiedzią jest http://code.google.com/p/mp4parser/
isoparser API może czytać i pisać strukturę plików MP4. Jest to narzędzie o niskim poziomie, zajmujące się tak zwanymi skrzynkami, ale ma również strukturę, taką jak ścieżki i filmy.
Nicea API i sposoby znacznie szybciej niż ffmpeg Behemoth
Aby uzyskać eleganckie rozwiązanie, wydaje się, że do osiągnięcia tego celu konieczne jest użycie narzędzia ffmpeg dla systemu Android. Ktoś inny wypróbował to w ten sposób: How to get the frame from video file in android; i zasugerowano, aby użyć ffmpeg.
Sprawdziłem Reference Manual, ale mogliśmy znaleźć tylko sposób, aby uzyskać samą klatkę (bez znacznika czasu) w stosunku do danej pozycji w czasie korzystania z MediaMetadataRetriever() Jak wyjaśniono tutaj: http://developer.android.com/reference/android/media/MediaMetadataRetriever.html#extractMetadata%28int%29
Jeśli don” t chcą wykorzystać ffmpeg można spróbować wykonać następujące czynności:
private ArrayList<int> getKeyFrameTimestamps(String filename) {
ArrayList<int> timeStamps = new ArrayList<int>();
try {
MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
mRetriever.setDataSource(getDataSource(filename));
mRetriever.getFrameAtTime(i, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
Bitmap lastFame = mRetriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_NEXT_SYNC);
result.add(0);
for(int time=1; frame ; ++time) {
Bitmap frame = mRetriever.getFrameAtTime(time, MediaMetadataRetriever.OPTION_PREVIOUS_SYNC);
if (frame && !frame.sameAs(lastFrame)) {
result.add(time);
lastFrame = frame;
}
}
} catch (Exception e) { /* TODO: HANDLE THIS */ }
return timeStamps;
}
to oczywiście niezbyt eleganckie, ale prawdopodobnie działa bez kłopotów zainstalować ffmpeg ... to chyba też dość powolne (nie wiem) . Ale może właśnie tego potrzebujesz.
PS: AN ffmpeg tutorial, który pasuje do Twojego problemu można znaleźć tutaj: http://dranger.com/ffmpeg/tutorial07.html
Cześć Stefan, Dzięki za starania, ale ja już próbował tego rozwiązania i działa cholernie powolny i wykonuje dziwne wyniki. Zbadam dalej (np. Ffmpeg/ffprobe) i aktualizuję ten wątek. –
To jest to, czego się spodziewałem. Pomysł, aby trochę przyspieszyć to próba 'time + = lastdistance;' Gdzie używasz zestawu 'lastdistance = lastFrameTime - time;' jeśli zostanie znaleziona klatka kluczowa, sprawdź, czy 'lastFrameTime + lastdistance - 1' jest nadal ostatnią ramką. Jeśli tak, to przejdź dalej ... w przeciwnym razie użyj "powolnego wyszukiwania", aby znaleźć następną ramkę: – SDwarfs
Krzyża kompilacji ffmpeg na Androida. użyj komendy ffprobe z opcją -show_frames, aby uzyskać listę obrazów I. To powinno działać we wszystkich rodzajach filmów i jest dość szybkie. Najpierw sprawdź to na komputerze. [Jeśli zainstalowałeś ffmpeg, powinieneś również mieć ffprobe]. Otrzymasz wszystkie potrzebne informacje. Jest tam -show_packets, który jest jeszcze szybszy i może okazać się wystarczający, jeśli wszystko, co chcesz wiedzieć, to referencyjne a niereferencyjne. – av501
4.1+ - szybciej niż mp4parser ponieważ odbywa się pod spodem i rodzimy kod jest czystsze
mp4parser trzeba obliczyć timestampów od getsyncsamples + isampledurations, które również są denerwujące i nie pasują do ffprobe. to dostaje dokładne wyniki
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(getVideoPath());
int trackindex = MediaExtractorUtil.selectVideoTrack(extractor);
extractor.selectTrack(trackindex);
while (extractor.getSampleTime() != -1) {
long sampleTime = extractor.getSampleTime();
// check not really necessary but JIC
if ((extractor.getSampleFlags() & MediaExtractor.SAMPLE_FLAG_SYNC) > 0) {
mKeyframeTimestampsMS.add(sampleTime/1000);
}
extractor.seekTo(sampleTime + 1, MediaExtractor.SEEK_TO_NEXT_SYNC);
}
dzięki za odpowiedź, sprawdzę to, gdy tylko wrócę do tego projektu –
Korzystanie MediaExtractor, można mieć wszystkie kluczowe (sync) ramki razy i/lub żadnej konkretnej klatki kluczowej w dowolnym czasie. + trochę więcej przydatnych danych.
Następnie przez MediaMetadataRetriever -> getFrameAtTime można uzyskać ramki bitmap.
tutaj jest przykładowy kod używać MediaExtractor:
mediaExtractor = new MediaExtractor() ;
mediaExtractor.setDataSource(mediaPath);
int numTracks = mediaExtractor.getTrackCount();
for (int i = 0; i < numTracks; ++i) {
MediaFormat format = mediaExtractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith("video")) {
mediaExtractor.selectTrack(i);
}
Log.i("LOG_Extractor" , "track "+i+" "+mime);
}
currentTime = mediaPlayer.getCurrentPosition();
mediaExtractor.seekTo((long)currentTime*1000 , MediaExtractor.SEEK_TO_PREVIOUS_SYNC);
previousKeyFrameTimeMilis = mediaExtractor.getSampleTime() /1000 ;
- 1. jak zmienić interwał klatek kluczowych w ffmpeg
- 2. Jak uzyskać obsługiwane rozdzielczości kamer wideo w systemie Android?
- 3. Jak uzyskać listę wszystkich plików wideo w telefonie iPhone?
- 4. Przetwarzanie ramek wideo z Androidem
- 5. Przerwa między animacjami klatek kluczowych
- 6. DirectShow - Pobieranie klatek wideo
- 7. Konwersja klatek na milisekundy w systemie Android
- 8. Jak uzyskać rozmiar pliku wideo na żywo w systemie Android?
- 9. Czy Android używa NTP do synchronizacji czasu?
- 10. Warunki warunkowe CMake: porównywanie znaczników czasu plików
- 11. Tworzenie wideo z ramek iPhone
- 12. Jak zastosować filtrowanie wideo w systemie Android?
- 13. Jak uzyskać statystyki ruchu sieciowego dla aplikacji do strumieniowego przesyłania wideo w systemie Android?
- 14. Słownik słów kluczowych w systemie Android - sprawdzanie pisowni - Android Studio
- 15. Czy można uzyskać rozdzielczość wideo w systemie Android?
- 16. Jak uzyskać listę zmienionych plików w svn?
- 17. Czy można uzyskać listę drukarek Bluetooth w systemie Android?
- 18. Deszyfrowanie plików wideo w systemie iOS
- 19. Jak wyświetlić listę plików w katalogu android?
- 20. Jak określić parametr psycopg2 dla tablicy dla znaczników czasu (dat):
- 21. Jak mogę utworzyć miniaturkę URL-a wideo w systemie Android?
- 22. Strumieniowanie wideo UDP w systemie Android
- 23. Jak uzyskać katalog plików wideo użytkownika?
- 24. Android Asynctask do przetwarzania klatek wideo na żywo
- 25. Przechwytywanie klatek wideo z HTML5 i JavaScriptem
- 26. OpenCV + python - grab klatek z pliku wideo
- 27. Pobieranie/ustawianie bieżących procentów @keyframes/zmiana klatek kluczowych
- 28. wartości Set Webkit klatek kluczowych przy użyciu JavaScript Zmienna
- 29. Jak uzyskać wartość przełączania w systemie Android?
- 30. API do edycji wideo w systemie Android
tak, ale isoparser nie zawiera dekodera/kodera do utworzenia bitmapy z sekcji mdatów skrzynek – Nativ