es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Android: ¿Cómo abrir un archivo de video utilizando MediaStore con ExoPlayer?

Estoy intentando reproducir archivos de video locales utilizando la API de MediaStore, pero todo lo que veo es que puedo acceder a él como un objeto OpenFileDescriptor o como InputStream.
Pero ExoPlayer no tiene ninguno de estos métodos para admitirlo.
Entonces, ¿cómo puedo abrir este archivo utilizando la API de MediaStore y reproducirlo en Android 10+?

Además, ¿alguien sabe también cómo puedo crear y guardar un video con bibliotecas nativas? como FFmpeg utilizando la API de MediaStore.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Reproducción de archivos de vídeo locales utilizando la API de MediaStore en Android 10+

    Si estás intentando reproducir archivos de vídeo locales utilizando la API de MediaStore en Android 10+, es posible que hayas notado que solo puedes acceder a ellos como un objeto OpenFileDescriptor o como un InputStream. Desafortunadamente, ExoPlayer no tiene ningún método integrado para admitir este tipo de entradas.

    Sin embargo, aún puedes utilizar la API de MediaStore con ExoPlayer creando un DataSource personalizado. El DataSource debe abrir el OpenFileDescriptor o el InputStream y proporcionar los metadatos multimedia a ExoPlayer.

    Aquí tienes un ejemplo de cómo puedes reproducir un archivo de vídeo local utilizando la API de MediaStore con ExoPlayer:

    // Crea un Uri para el archivo de vídeo local
    Uri videoUri = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL);
    String[] projection = new String[] {
            MediaStore.Video.Media._ID,
            MediaStore.Video.Media.DISPLAY_NAME,
            MediaStore.Video.Media.SIZE
    };
    String selection = MediaStore.Video.Media.DISPLAY_NAME + "=?";
    String[] selectionArgs = new String[] { "mi_archivo_video.mp4" };
    Cursor cursor = getContentResolver().query(videoUri, projection, selection, selectionArgs, null);
    cursor.moveToFirst();
    long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media._ID));
    Uri fileUri = ContentUris.withAppendedId(videoUri, id);
    
    // Crea un DataSource personalizado que pueda manejar OpenFileDescriptor o InputStream
    DataSource.Factory dataSourceFactory = new DataSource.Factory() {
        @Override
        public DataSource createDataSource() {
            try {
                ParcelFileDescriptor descriptor = getContentResolver().openFileDescriptor(fileUri, "r");
                FileInputStream inputStream = new FileInputStream(descriptor.getFileDescriptor());
                return new FileDataSource(inputStream.getFD());
            } catch (Exception e) {
                // Manejar excepciones
                return null;
            }
        }
    };
    
    // Utiliza el DataSource personalizado para crear un MediaSource y reproducir el vídeo con ExoPlayer
    MediaSource videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(fileUri);
    ExoPlayer exoPlayer = new SimpleExoPlayer.Builder(context).build();
    exoPlayer.prepare(videoSource);
    exoPlayer.setPlayWhenReady(true);
    

    Creación y guardado de un vídeo con librerías nativas utilizando la API de MediaStore

    Para crear y guardar un vídeo utilizando librerías nativas como FFmpeg utilizando la API de MediaStore, puedes seguir estos pasos:

    1. Crea el contenido del vídeo con FFmpeg o cualquier otra librería nativa.
    2. Almacena el contenido del vídeo como un array de bytes byte[] o InputStream.
    3. Crea un resolvedor de contenidos a la API de MediaStore e inserta el contenido del vídeo en él utilizando ContentValues.
    4. Recupera el Uri del archivo de vídeo guardado y reprodúcelo o guárdalo en una ruta de archivo.

    Aquí tienes un ejemplo de cómo puedes guardar un vídeo creado con FFmpeg utilizando la API de MediaStore:

    // Crea el contenido del vídeo con FFmpeg
    // Almacena el vídeo como un array de bytes o InputStream
    byte[] videoContent = new byte[]{ 0x00, 0x01, 0x02, 0x03, ... };
    
    // Crea ContentValues con los metadatos del vídeo
    ContentValues values = new ContentValues();
    values.put(MediaStore.Video.Media.DISPLAY_NAME, "mi_archivo_video.mp4");
    values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
    
    // Inserta el contenido del vídeo en MediaStore utilizando el resolvedor de contenidos
    Uri videoUri = getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
    OutputStream outputStream = getContentResolver().openOutputStream(videoUri);
    outputStream.write(videoContent);
    outputStream.close();
    
    // Recupera el Uri del archivo de vídeo guardado y reprodúcelo o guárdalo en una ruta de archivo
    String filePath = videoUri.getPath();
    Uri savedVideoUri = Uri.parse("file://" + filePath);
    

Comments are closed.