web-dev-qa-db-fra.com

Comment lire des vidéos dans Android à partir du dossier assets ou du dossier raw?

J'essaie de lire une vidéo dans Android émulateur. J'ai la vidéo dans mon dossier d'actifs, ainsi que dans le dossier brut. Après quelques recherches, je ne peux toujours pas lire la vidéo dans mon émulateur sur lequel je travaille. Android 2.1 Mon format vidéo est mp4, donc je ne pense pas que cela devrait être un problème. Quelqu'un pourrait-il me donner un exemple de code afin que je puisse comprendre un peu plus?

Le problème est que le VideoView dont j'ai besoin pour afficher la vidéo ne prend qu'un URI ou un chemin de fichier pour pointer vers la vidéo.

Si j'enregistre la vidéo dans le dossier raw ou assets, je ne peux obtenir qu'un flux d'entrée ou un descripteur de fichier et il semble que rien de tout cela ne puisse être utilisé pour initialiser VideoView.

Mise à jour

J'ai examiné de plus près l'exemple MediaPlayer et essayé de démarrer un MediaPlayer avec un FileDescriptor vers les fichiers d'actif comme dans le code ci-dessous:

SurfaceView videoView = (SurfaceView) findViewById(gettingStarted)
SurfaceHolder holder = videoView.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_Push_BUFFERS);
final MediaPlayer player = new MediaPlayer();
player.setDisplay(holder);

player.setDataSource(getAssets().openFd(fileName).getFileDescriptor());
player.prepareAsync();
player.setOnPreparedListener(new OnPreparedListener() {

   @Override
   public void onPrepared(MediaPlayer mp) {
      mp.start();
   }
});

Maintenant, je reçois une exception suivante:

Java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed

Il semble qu'il n'y ait pas d'autre moyen de copier le fichier sur la carte SD au démarrage, ce qui semble être une perte de temps et de mémoire.

67
Abhishek Talwar

## Travaille parfaitement depuis Android 1.6 ##

getWindow().setFormat(PixelFormat.TRANSLUCENT);
VideoView videoHolder = new VideoView(this);
//if you want the controls to appear
videoHolder.setMediaController(new MediaController(this));
Uri video = Uri.parse("Android.resource://" + getPackageName() + "/" 
+ R.raw.your_raw_file); //do not add any extension
//if your file is named sherif.mp4 and placed in /raw
//use R.raw.sherif
videoHolder.setVideoURI(video);
setContentView(videoHolder);
videoHolder.start();

## Vérifier le tutoriel complet ##

114
Sherif elKhatib
String UrlPath="Android.resource://"+getPackageName()+"/"+R.raw.ur file name;
videocontainer.setVideoURI(Uri.parse(UrlPath));
videocontainer.start();

où vidéoconteneur de type vidéoview.

11
Bishoy Fakhry

Essayer:

AssetFileDescriptor afd = getAssets().openFd(fileName);
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());
10
Jay

PlayVideoActivity.Java:

public class PlayVideoActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play_video);

        VideoView videoView = (VideoView) findViewById(R.id.video_view);
        MediaController mediaController = new MediaController(this);
        mediaController.setAnchorView(videoView);
        videoView.setMediaController(mediaController);
        videoView.setVideoURI(Uri.parse("Android.resource://" + getPackageName() + "/" + R.raw.documentariesandyou));
        videoView.start();
    }
}

activity_play_video.xml:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:gravity="center" >

    <VideoView
        Android:id="@+id/video_view"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" >
    </VideoView>

</LinearLayout>
8
haotang

Si je me souviens bien, j'ai eu le même genre de problème lors du chargement de choses à partir du dossier des ressources mais avec une base de données. Il semble que le contenu de votre dossier de ressources puisse avoir 2 statistiques: compressé ou non.
S'il est compressé, vous disposez de 1 Mo de mémoire pour le décompresser, sinon vous obtiendrez ce genre d'exception. Il y a plusieurs rapports de bugs à ce sujet car la documentation n'est pas claire. Ainsi, si vous souhaitez toujours utiliser votre format, vous devez utiliser une version non compressée ou attribuer une extension telle que .mp3 ou .png à votre fichier. Je sais que c'est un peu fou, mais je charge une base de données avec une extension .mp3 et cela fonctionne parfaitement. Cette autre solution consiste à empaqueter votre application avec une option spéciale lui indiquant de ne pas compresser certaines extensions. Mais ensuite, vous devez créer votre application manuellement et ajouter l'option "Zip -0".
L’avantage d’un test non compressé est que la phase de Zip-align avant la publication d’une application aligne correctement les données de sorte qu’elles puissent être directement mappées lorsqu’elles sont chargées en mémoire.

Donc, des solutions:

  • changer l'extension du fichier en .mp3 ou .png et voir si cela fonctionne
  • construisez votre application manuellement et utilisez l'option Zip-0
4
Sephy

Avez-vous essayé de mettre manuellement la vidéo sur une carte SD et de lire le magasin de vidéos sur une carte SD?

Si cela fonctionne, vous pouvez trouver le moyen de copier de Raw vers une carte SD ici:

Android-copie-rawfile-à-sdcard-video-mp4 .

3
NicoMinsk
VideoView myVideo = (VideoView) rootView.findViewById(R.id.definition_video_view);

//Set video name (no extension)
String myVideoName = "my_video";

//Set app package
String myAppPackage = "com.myapp";

//Get video URI from raw directory
Uri myVideoUri = Uri.parse("Android.resource://"+myAppPackage+"/raw/"+myVideoName);

//Set the video URI
myVideo.setVideoURI(myVideoUri);

//Play the video
myVideo.start();

https://Gist.github.com/jrejaud/b5eb1b013c27a1f3ae5f

2
Jordan Réjaud

Je l'ai trouvé :

Uri raw_uri = Uri.parse(<package_name>/+R.raw.<video_file_name>);

Personnellement Android a trouvé la ressource, mais ne peut pas la lire pour l'instant. Mon fichier est un fichier .m4v

2
Nabil Gardon

Je pense que vous devez regarder this - il devrait avoir tout ce que vous voulez.

EDIT: Si vous ne voulez pas regarder le lien - cela résume assez bien ce que vous voulez.

MediaPlayer mp = MediaPlayer.create (contexte, R.raw.sound_file_1); p.start ();

Mais je recommande toujours de lire les informations sur le lien.

1
hwrdprkns

Dans le fileName vous devez mettre le chemin relatif au fichier (sans /asset) par exemple:

player.setDataSource(
    getAssets().openFd(**"media/video.mp4"**).getFileDescriptor()
);
0
digolloco

On dirait que vous avez le même problème que moi. au lieu d'utiliser MP4, le 3GPP est-il possible? Je pense que j'ai utilisé comme HandBrake ou quelque chose comme convertisseur de vidéo ... vous devez simplement vous assurer que vous avez le bon encodeur, comme H.264x ou quelque chose du genre. désolé d'être un peu vague, ça fait longtemps. En outre, si cela est possible, ne vous inquiétez plus de Android 2.1, et encore, quelque chose ne fonctionnera pas dans EMULATOR.). Si cela fonctionne sur beaucoup de périphériques, alors ça marche (surtout avec différents fabricants)

ici, vous pouvez lire mon problème et comment j'ai résolu le problème (après une longue période et personne n'a eu de réponse). J'ai expliqué plus en détail ici: Android Media Player ne fonctionne pas

0
David T.
  1. Utilisez l'API MediaPlayer et le code exemple.

  2. Placez le fichier multimédia dans le dossier raw.

  3. Obtenez le file descriptor Dans le fichier.

  4. mediaplayer.setDataSource(fd,offset,length); - c'est un constructeur à trois arguments.

  5. Puis quand onPreared, mediaplayer.start();

0
Khajan