Comment lire des vidéos dans Android depuis un dossier de ressources ou un dossier brut?

J’essaie de lire une vidéo dans l’émulateur Android J’ai la vidéo dans mon dossier d’actifs ainsi que le dossier brut Mais après avoir fait des recherches encore je ne peux pas lire la vidéo dans mon émulateur je travaille sur 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 pour que je puisse en comprendre un peu plus?

Le problème est que le VideoView dont j’ai besoin pour afficher la vidéo prendra uniquement un URI ou un chemin de fichier pour pointer vers la vidéo.

Si je sauvegarde la vidéo dans le dossier raw ou assets, je ne peux obtenir qu’un stream d’entrée ou un descripteur de fichier et rien ne semble pouvoir être utilisé pour initialiser VideoView.

Mettre à jour

J’ai examiné de plus près l’exemple MediaPlayer et j’ai essayé de démarrer un MediaPlayer avec un FileDescriptor dans les fichiers de ressources, 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 que de copier le fichier sur la carte SD au démarrage et cela semble être une perte de temps et de mémoire.

## Parfaitement fonctionnel 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érifiez le tutoriel complet ##

 Ssortingng UrlPath="android.resource://"+getPackageName()+"/"+R.raw.ur file name; videocontainer.setVideoURI(Uri.parse(UrlPath)); videocontainer.start(); 

où vidéocontaineur de type vidéoview.

Essayer:

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

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:

      

Si je me souviens bien, j’ai eu le même genre de problème lors du chargement de choses à partir du dossier de ressources, mais avec une firebase database. Il semble que le contenu de votre dossier d’actifs puisse avoir 2 statistiques: compressé ou non.
Si elle est compressée, vous êtes autorisé à 1 Mo de mémoire pour le décompresser, sinon vous obtiendrez ce type d’exception. Il existe plusieurs rapports de bogues à ce sujet car la documentation n’est pas claire. Donc, si vous voulez toujours utiliser votre format, vous devez soit utiliser une version non compressée, soit donner une extension comme .mp3 ou .png à votre fichier. Je sais que c’est un peu fou mais je charge une firebase database avec une extension .mp3 et cela fonctionne parfaitement bien. Cette autre solution consiste à emballer votre application avec une option spéciale pour lui indiquer de ne pas compresser certaines extensions. Mais alors vous devez construire votre application manuellement et append l’option “zip -0”.
L’avantage d’un test non compressé est que la phase de zip-align avant la publication d’une application alignera correctement les données, de sorte que, une fois chargées en mémoire, elles pourront être directement mappées.

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

Avez-vous essayé de mettre manuellement la vidéo sur la SDCard et d’essayer de lire la vidéo sur la SDCard?

Si cela fonctionne, vous pouvez trouver le moyen de copier de Raw vers SDcard ici:

android-copy-rawfile-to-sdcard-video-mp4 .

Je l’ai trouvé :

 Uri raw_uri = Uri.parse(/+R.raw.); 

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

Je pense que vous devez regarder cela – il devrait avoir tout ce que vous voulez.

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

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

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

 VideoView myVideo = (VideoView) rootView.findViewById(R.id.definition_video_view); //Set video name (no extension) Ssortingng myVideoName = "my_video"; //Set app package Ssortingng 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

Il semble peut-être 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 le convertisseur vidéo … vous devez juste vous assurer que vous avez le bon encodeur, comme H.264x ou quelque chose. désolé d’être un peu vague, ça fait longtemps. Aussi, si c’est possible, ne vous souciez plus de Android 2.1, et aussi, quelque chose ne fonctionnera pas dans l’émulateur. donc si cela fonctionne sur beaucoup d’appareils, alors supposons que cela fonctionne (en particulier 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: lecteur multimédia Android ne fonctionne pas

Dans le nom de fileName vous devez placer le chemin d’access relatif au fichier (sans /asset ), par exemple:

 player.setDataSource( getAssets().openFd(**"media/video.mp4"**).getFileDescriptor() ); 
  1. Utilisez l’API MediaPlayer et l’exemple de code.

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

  3. Obtenez le file descriptor dans le fichier.

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

  5. Ensuite, lorsque onPreared , mediaplayer.start();

Code principal

 Uri raw_uri=Uri.parse("android.resource:///+R.raw.); myVideoView=(VideoView)findViewbyID(R.idV.Video_view); myVideoView.setVideoURI(raw_uri); myVideoView.setMediaController(new MediaController(this)); myVideoView.start(); myVideoView.requestFocus(); 

XML