¿Hay alguna API que pueda darme la lista de marcas de tiempo de los fotogramas clave para el archivo de video dado en Android?¿Cómo obtener una lista de fotogramas clave (fotogramas de sincronización) de fecha y hora para un archivo de video en Android?
Respuesta
Creo que la respuesta correcta es http://code.google.com/p/mp4parser/
La API isoparser puede leer y escribir la estructura de archivos MP4. Es una herramienta de bajo nivel que se ocupa de los denominados recuadros, pero también trata con estructuras como pistas y películas.
Niza activos y de maneras mucho más rápido que ffmpeg gigante
Para una solución elegante, parece como si tuviera que usar ffmpeg para Android para lograr esto. Alguien más lo intentó de esta manera: How to get the frame from video file in android; y se sugirió usar ffmpeg.
he comprobado el manual de referencia, pero sólo pudo encontrar una manera de conseguir un fotograma clave en sí (sin marca de tiempo) en relación con una posición determinada en el tiempo mediante el MediaMetadataRetriever(), como se explica aquí: http://developer.android.com/reference/android/media/MediaMetadataRetriever.html#extractMetadata%28int%29
si no' t desea utilizar ffmpeg puede probar lo siguiente:
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;
}
Esto por supuesto no es muy elegante, pero probablemente funcionaría sin problemas para instalar ffmpeg ... es probablemente también bastante lento (no sé) . Pero tal vez es justo lo que necesitas.
PD: Un tutorial ffmpeg que se adapte a su problema se puede encontrar aquí: http://dranger.com/ffmpeg/tutorial07.html
Hola Stefan, gracias por sus esfuerzos, pero ya han probado esta solución y funciona maldita lento y ofrece resultados extraños. Investigaré más a fondo (por ejemplo, ffmpeg/ffprobe) y mantendré este hilo actualizado. –
Eso es lo que esperaba. Una idea para acelerar esto es intentar 'time + = lastdistance;' Donde use set 'lastdistance = lastFrameTime - time;' si se encuentra un fotograma clave, verifique si 'lastFrameTime + lastdistance - 1' sigue siendo el último fotograma. Si es así, continúe ... else use la "búsqueda lenta" para encontrar el siguiente fotograma – SDwarfs
compilación cruzada ffmpeg en android. use el comando ffprobe con la opción -show_frames para obtener la lista de I imágenes. Esto debería funcionar para todo tipo de videos y es bastante rápido. Compruébalo en la PC primero. [Si ha instalado ffmpeg, también debería tener ffprobe]. Obtendrás toda la información que necesitas. Hay -show_packets que es aún más rápido y puede ser suficiente si todo lo que quiere saber es referencia vs marcos de referencia. – av501
4.1+ - más rápido que mp4parser porque hace en nativa debajo y el código es más limpio
mp4parser tienes que calcular las marcas de tiempo de los getsyncsamples + getsampledurations que también es molesto y no coinciden con ffprobe. esto da resultados precisos
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);
}
gracias por su respuesta, lo comprobaría tan pronto como regrese a este proyecto –
Usando MediaExtractor, puede hacer que toda la llave (sincronización) marcos de tiempos y/o cualquier fotograma clave específica en cualquier momento deseado. + algunos datos más útiles.
Luego, mediante MediaMetadataRetriever -> getFrameAtTime puede obtener marcos Bitmaps.
aquí es un código de ejemplo para utilizar 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. Sincronización de fotogramas con AVPlayer
- 2. Obteniendo fotogramas de video .avi usando OpenCV
- 3. fotogramas clave de activación CSS3 y jQuery
- 4. Extraer fotogramas de video en Python
- 5. ¿Cómo calculan los navegadores la velocidad de fotogramas (fps) para HTML5 <video> para una búsqueda de fotogramas precisa?
- 6. Animación básica de fotogramas clave (rotación)
- 7. Pausa entre animaciones de fotogramas clave
- 8. Uso de DirectShow para capturar fotogramas y OpenCV para procesar
- 9. Extrayendo fotogramas de MP4/FLV?
- 10. Número total de fotogramas con ffmpeg
- 11. Nombres de fotogramas asignados automáticamente
- 12. ¿cómo puedo obtener la cantidad de fotogramas por segundo de un archivo gif?
- 13. Posible error en OpenCV2.4 capturando fotogramas del video
- 14. Cómo leer fotogramas de un volcado de memoria (sin GDB)?
- 15. Velocidad de fotogramas mágicos de Flash Player
- 16. cómo obtener una miniatura de video de youtube video en la lista de android en android
- 17. Cómo extraer fotogramas de una animación GIF con PHP
- 18. Determinar el número de fotogramas en un Core Audio AudioBuffer
- 19. Velocidad de fotogramas constante en WPF para el juego
- 20. ffmpeg split avi en marcos con velocidad de fotogramas conocida
- 21. Captura de pantalla de video usando AForge.Video.FFMPEG/AForge.Video.VFW. Problema de tasa de fotogramas
- 22. ¿Cómo lograr 30 fotogramas por segundo con Android SurfaceView?
- 23. Límite de velocidad de fotogramas para aplicaciones wpf?
- 24. OpenCV: Cómo capturar fotogramas desde una cámara Ethernet
- 25. Capturar fotogramas desde la webcam con DirectShow.NET
- 26. ¿Es posible usar la animación de fotogramas clave en un pseudo-elemento?
- 27. ¿Cómo verifico la velocidad de fotogramas de mi aplicación?
- 28. Cómo obtener la fecha y la hora actual de la columna Fecha/Hora en la lista personalizada de SharePoint
- 29. Android: Obtenga tamaños de video compatibles
- 30. marca de tiempo Unix de fecha y hora en Android
sí, pero isoparser no contiene decodificador/codificador para crear mapas de bits a partir de la sección mdat de las cajas – Nativ