7
votes

Catégorie vidéo de capture Android

Je dois obtenir une image d'un fichier vidéo (il peut être sur SDCard, Cache Dir ou App Dir). J'ai Package Android.Media dans mon application et à l'intérieur, j'ai la classe MediaMetaTatareReviever. Pour obtenir la première image dans un bitmap, j'utilise le code: xxx

mais cela ne fonctionne pas. Il jette une exception (Java.lang.RuntimeException: SetDataSource a échoué: Status = 0x80000000) lorsque je définit la source de données. Savez-vous comment faire fonctionner ce code? Ou avez-vous une solution similaire (simple) sans utiliser FFMPEG ou d'autres bibliothèques externes? Videouri est un URI valide (lecteur multimédia peut lire une vidéo à partir de cet URI)


1 commentaires

Pouvez-vous fournir un échantillon à votre question, j'ai beaucoup essayé pour ce type d'échantillon, j'ai enfin dû vous demander.


8 Réponses :


0
votes

J'ai la même erreur sur ma demande. J'ai vu sur ce site que

C'est une façon non officielle de le faire et cela ne fonctionnera que dans le cupcake (et Peut-être que la version ultérieure). L'équipe Android ne garantit pas que libmedia_jni.so, que le fichier Java utilise, sera inclus ou avoir le même interface dans les versions futures.

http://osdir.com/ml/androidDevelopers/2009-06/ msg02442.html

J'ai mis à jour mon téléphone à Gingerbread et cela ne fonctionne plus.


0 commentaires

13
votes

Les œuvres suivantes pour moi:

public static Bitmap getVideoFrame(FileDescriptor FD) {
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        try {
            retriever.setDataSource(FD);
            return retriever.getFrameAtTime();
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        } catch (RuntimeException ex) {
            ex.printStackTrace();
        } finally {
            try {
                retriever.release();
            } catch (RuntimeException ex) {
            }
        }
        return null;
    }


5 commentaires

Quelle valeur doit être transmettre en tant qu'argument de descripteur de fichier. Real pense que c'est que, dans ma candidature, il existe uniquement une URL vidéo et souhaitez obtenir la liste des cadres de ce fichier vidéo ...


Pour obtenir un objet FileDeScriptor Do - OpenFileInput (MyVideOfilename) .getfd (). Pour ce faire, la vidéo doit être dans votre annuaire privé d'applications. Vous pouvez également changer de bitmap getVideoframe (String FD) et transmettez votre chemin de vidéos.


En une seconde, une vidéo contient 25 à 30 images. Vous êtes capable d'obtenir tous les cadres. Parce que par cette technique, j'ai eu 3-4 cadres répétés à chaque fois. Et certains cadres sont manquants.


@Rab Ross veuillez donner un code de détail. comment fais tu ça . Je suis incapable de le faire fonctionner. Ce qui doit être l'extension et vice versa


@Nepster ceci a été quelque temps et je n'ai plus accès au code détaillé. Mes excuses.



0
votes

URI n'est pas très spécifique. Parfois, ils font référence à quelque chose dans un paquet. Ils doivent souvent être traduits sur une forme de chemin absolu. L'autre exemple dans lequel vous avez utilisé l'URI, il était probablement assez intelligent pour vérifier quel type d'urion était. Ce cas que vous avez montré semble ne pas avoir l'air très fort.


0 commentaires

-2
votes

Il y a donc un moyen spécifique d'obtenir le cadre de la vidéo comme xxx


4 commentaires

Il faisait des erreurs ... maintenant son travail ... Je suppose qu'il y a un problème avec mon éditeur Eclipse. Merci quand même


Mon commentaire était de vous demander que "ce code de 2 lignes est votre réponse ou une question avec votre problème?"


C'était une question ... Le code ci-dessus ne fonctionnait pas initialement ... mais c'est correct son travail maintenant


@Pareshmayani, comment obtenir la liste des cadres de fichier vidéo à afficher dans la vue Galerie, veuillez consulter ma question



6
votes

Essayez ceci, je l'ai utilisé et son travail

public static Bitmap getVideoFrame(Context context, Uri uri) {
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    try {
        retriever.setDataSource(uri.toString(),new HashMap<String, String>());
        return retriever.getFrameAtTime();
    } catch (IllegalArgumentException ex) {
        ex.printStackTrace();
    } catch (RuntimeException ex) {
        ex.printStackTrace();
    } finally {
        try {
            retriever.release();
        } catch (RuntimeException ex) {
        }
    }
    return null;
}


2 commentaires

Cela nécessitait API 14. Comment utiliser dans API en dessous.


Vous venez d'utiliser ce ffmpegmediamemettadataretriever Github.com/wseemann/ffmpegmediametaTatareReviever



0
votes

J'obtiens la même erreur en utilisant la classe la classe Thumbnautils forte> http://developer.android.com/reference/andrroid/media/thumbnailutils.html
Il utilise MediaMetadatareRetriever Strong> sous la hotte et la plupart du temps, vous pouvez l'envoyer un fichier Filpath en utilisant cette méthode sans problème: xxx pré>

Cependant, sur Android 4.0.4, sur Android 4.0.4, sur Android 4.0.4, J'ai continué à obtenir la même erreur @gabi voyait. L'utilisation d'un descripteur de fichier a plutôt résolu le problème et fonctionne toujours pour les appareils non-4.0.4. J'ai effectivement fini par le sous-classement des vignettes. Voici ma méthode de sous-classe: P>

 public static Bitmap createVideoThumbnail(FileDescriptor fDescriptor, int kind) 
 {
    Bitmap bitmap = null;
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    try {
        retriever.setDataSource(fDescriptor);
        bitmap = retriever.getFrameAtTime(-1);
    } 
    catch (IllegalArgumentException ex) {
        // Assume this is a corrupt video file
        Log.e(LOG_TAG, "Failed to create video thumbnail for file description: " + fDescriptor.toString());
    }
    catch (RuntimeException ex) {
        // Assume this is a corrupt video file.
        Log.e(LOG_TAG, "Failed to create video thumbnail for file description: " + fDescriptor.toString());
    } finally {
        try {
            retriever.release();
        } catch (RuntimeException ex) {
            // Ignore failures while cleaning up.
        }
    }

    if (bitmap == null) return null;

    if (kind == Images.Thumbnails.MINI_KIND) {
        // Scale down the bitmap if it's too large.
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int max = Math.max(width, height);
        if (max > 512) {
            float scale = 512f / max;
            int w = Math.round(scale * width);
            int h = Math.round(scale * height);
            bitmap = Bitmap.createScaledBitmap(bitmap, w, h, true);
        }
    } else if (kind == Images.Thumbnails.MICRO_KIND) {
        bitmap = extractThumbnail(bitmap,
                TARGET_SIZE_MICRO_THUMBNAIL,
                TARGET_SIZE_MICRO_THUMBNAIL,
                OPTIONS_RECYCLE_INPUT);
    }
    return bitmap;
}


0 commentaires

0
votes

L'exception est également lancée lorsque le fichier n'existe pas. Donc, avant d'appeler setdatasource () vous feriez mieux de vérifier si nouveau fichier (URL) .exists () . .


0 commentaires

1
votes

J'ai utilisé ce code et cela fonctionne pour moi. Vous pouvez essayer celui-ci.

if (Build.VERSION.SDK_INT >= 14) {
                ffmpegMetaDataRetriever.setDataSource(
                        videoFile.getAbsolutePath(),
                        new HashMap<String, String>());
            } else {
                ffmpegMetaDataRetriever.setDataSource(videoFile
                        .getAbsolutePath());
            }


0 commentaires