Comment lire des vidéos sous android à partir du dossier assets ou du dossier raw?

j'essaie de lire une vidéo sur android emulator J'ai la vidéo dans mon dossier actif ainsi que le dossier brut Mais après avoir fait quelques recherches je ne peux pas lire la vidéo dans mon émulateur je suis en train de travailler sur android 2.1 Mon format vidéo est mp4 donc je ne pense pas que ce devrait être un problème Quelqu'un pourrait-il me donner un exemple de code pour que je puisse comprendre un peu plus?

le problème est que la vue vidéo dont j'ai besoin pour afficher la vidéo ne prendra qu'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 flux d'entrée ou un descripteur de fichier et il semble que rien de tout cela ne peut être utilisé pour initialiser la vue vidéo.

mise à Jour

j'ai regardé de plus près L'exemple de MediaPlayer et j'ai essayé de lancer un MediaPlayer avec un FileDescriptor vers les fichiers assets 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 j'obtiens l'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 vers la carte sdcard au démarrage et cela semble comme une perte de temps et de mémoire.

64
demandé sur Janusz 2010-06-12 16:54:19

13 réponses

# # 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érifier le tutoriel complet # #

109
répondu Sherif elKhatib 2012-06-19 00:45:39
String UrlPath="android.resource://"+getPackageName()+"/"+R.raw.ur file name;
videocontainer.setVideoURI(Uri.parse(UrlPath));
videocontainer.start();

où videocontainer de type videoview.

11
répondu Bishoy Fakhry 2013-03-05 14:11:42

, Essayez:

AssetFileDescriptor afd = getAssets().openFd(fileName);
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());
10
répondu Jay 2011-11-25 13:33:23

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
répondu haotang 2016-06-02 04:37:40

si je me souviens bien, j'ai eu le même genre de problème lors du chargement de trucs à partir du dossier de l'actif, mais avec une base de données. Il semble que la substance dans votre dossier d'actif peut avoir 2 stats: compressé ou non.

Si elle est compressée, alors vous êtes autorisé 1 Mo de mémoire pour la décompresser, sinon vous obtiendrez ce genre d'exception. Il y a plusieurs rapports de bogue à ce sujet parce que la documentation n'est pas claire. Donc si vous voulez continuer à utiliser votre format, vous devez soit utiliser une version non compressée, ou donner une extension comme .mp3 or .png à votre dossier. Je sais que c'est un peu fou mais je charge une base de données avec un .extension mp3 et il fonctionne parfaitement bien. Cette autre solution est d'empaqueter votre application avec une option spéciale pour lui dire de ne pas compresser une certaine extension. Mais ensuite vous devez construire votre application manuellement et ajouter l'option "zip -0".

L'avantage d'un assest non comprimé est que la phase de zip-align avant la publication d'une application alignera les données correctement de sorte qu'une fois chargé en mémoire, il peut être directement mappé.

Donc, des solutions :

  • changer l'extension du fichier .mp3 ou .png et voir si cela fonctionne
  • construisez votre application manuellement et utilisez l'option zip-0
4
répondu Sephy 2010-08-21 09:33:50

avez-vous essayé de mettre manuellement la vidéo sur SDCard et essayer de lire video store sur SDCard ?

si cela fonctionne, vous pouvez trouver le moyen de copier de Raw à SDcard ici:

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

3
répondu NicoMinsk 2017-05-23 11:47:05

Je l'ai trouvé:

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

personnellement Android trouvé la ressource, mais ne peut pas jouer pour le moment. Mon fichier est un .m4v

2
répondu Nabil Gardon 2011-12-05 15:27:16

je pense que vous devez regarder ce -- 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 souhaitez.

MediaPlayer mp = MediaPlayer.créer(contexte, R. raw.sound_file_1); député.start ();

mais je recommande toujours la lecture de l'information sur le lien.

1
répondu hwrdprkns 2010-06-12 19:54:05
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

1
répondu Jordan Réjaud 2015-12-02 20:45:20

on dirait que vous avez le même problème que moi. au lieu D'utiliser MP4, est-ce que 3GPP est possible? je pense que j'ai utilisé comme frein à main ou quelque chose comme le convertisseur vidéo... vous avez juste besoin de vous assurer que vous avez le bon encodeur, comme H. 264x ou quelque chose comme ça. désolé d'être un peu vague, ça fait longtemps. Aussi, si c'est possible, ne vous inquiétez plus pour android 2.1, et aussi, quelque chose que les choses ne fonctionneront pas dans L'émulateur. donc si cela fonctionne sur beaucoup d'appareils, alors supposez-le ouvrages (notamment avec différents fabricants)

ici, vous pouvez lire mon problème et comment j'ai résolu le problème (après un long moment, et personne n'avait de réponse). j'ai expliqué beaucoup plus en détail ici: Lecteur Multimédia android ne fonctionne pas

0
répondu David T. 2017-05-23 12:26:11

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

player.setDataSource(
    getAssets().openFd(**"media/video.mp4"**).getFileDescriptor()
);
0
répondu digolloco 2012-11-04 18:53:41
  1. utilisez L'API MediaPlayer et le code de l'échantillon.

  2. placez le fichier média dans le dossier raw .

  3. Get file descriptor dans le fichier.

  4. mediaplayer.setDataSource(fd,offset,length); - c'est un trois l'argument du constructeur.

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

0
répondu Khajan 2018-01-17 09:11:37

MainCode

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

myVideoView=(VideoView)findViewbyID(R.idV.Video_view);

myVideoView.setVideoURI(raw_uri);
myVideoView.setMediaController(new MediaController(this));
myVideoView.start();
myVideoView.requestFocus();

XML

<?xml version="1.0" encoding="utf-8" ?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
        <VideoView
            android:id="+@/Video_View"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
        />
</LinearLayout>
-1
répondu Sandeep 2010-08-19 08:57:36