72 Stimmen

Wie spielt man Videos in Android aus dem Ordner "Assets" oder "Raw" ab?

Ich versuche, ein Video im Android-Emulator abzuspielen Ich habe das Video sowohl in meinem Assets-Ordner als auch im Raw-Ordner. Aber nachdem ich einige Nachforschungen angestellt habe, kann ich das Video immer noch nicht in meinem Emulator abspielen Ich arbeite mit Android 2.1 Mein Videoformat ist mp4, also denke ich nicht, dass das ein Problem sein sollte Könnte mir jemand einen Beispielcode geben, damit ich ein bisschen mehr verstehen kann?

Das Problem ist, dass die VideoView, die ich brauche, um das Video anzuzeigen, nur einen URI oder einen Dateipfad zum Verweis auf das Video akzeptiert.

Wenn ich das Video im Raw- oder Assets-Ordner speichere, kann ich nur einen Input-Stream oder einen Dateideskriptor erhalten und es scheint, dass nichts davon zur Initialisierung der VideoView verwendet werden kann.

Update

Ich habe mir das MediaPlayer-Beispiel genauer angesehen und versucht, einen MediaPlayer mit einem FileDescriptor zu den Assets-Dateien zu starten, wie im folgenden Code:

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();
   }
});

Jetzt erhalte ich die folgende Ausnahme:

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

Es scheint keine andere Möglichkeit zu geben, als die Datei beim Start auf die SD-Karte zu kopieren, und das scheint eine Verschwendung von Zeit und Speicher zu sein.

0 Stimmen

Ich denke, das Problem ist, dass mp4 ein komprimiertes Format ist. Prüfen Sie meine Antwort für Details

0 Stimmen

Hier die Erklärung zum 'rohen' Floder stackoverflow.com/questions/11356601/

1 Stimmen

Wir schrieben das Jahr 2020 und obwohl ich Android Studio 3.6 und das Betriebssystem Android 10 benutzte, gab es in der folgenden Videoansicht zwar Ton, aber das Bild war schwarz. Schließlich funktionierten die Codes dieses Freundes und ich kann nicht erklären, wie glücklich ich war. Keiner von denen, die als Lösung unten geschrieben wurden, funktionierte bei mir zum ersten Mal. Zum Glück bin ich froh, dass ich mein Problem endlich gelöst habe. Ich danke Ihnen: D

124voto

Sherif elKhatib Punkte 45328

## Funktioniert einwandfrei seit 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 = getUriFromRawFile(context, R.raw.your_raw_file);
//if your file is named sherif.mp4 and placed in /raw
//use R.raw.sherif
videoHolder.setVideoURI(video);
setContentView(videoHolder);
videoHolder.start();

Und dann

public static Uri getUriFromRawFile(Context context, @ResRaw int rawResourceId) {
    return Uri.Builder()
        .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
        .authority(context.getPackageName())
        .path(String.valueOf(rawResourceId))
        .build();
}

## Vollständige Anleitung prüfen ##

9 Stimmen

WICHTIG! Zur Verwendung des R.raw Pfad, müssen Sie Ihr Video im Ordner "res/raw" ablegen und nicht unter "assets".

0 Stimmen

Was bedeutet "R" hier? aka R.raw? Was ist der Typ der R-Variable oder die Klasse?

0 Stimmen

Seine nicht auf micromax Leinwand 4 arbeiten, stattdessen seine StringIndexOutofBound Ausnahme geben

12voto

Bishoy Fakhry Punkte 161
String UrlPath="android.resource://"+getPackageName()+"/"+R.raw.ur file name;
videocontainer.setVideoURI(Uri.parse(UrlPath));
videocontainer.start();

wobei videocontainer vom Typ videoview.

11voto

Jay Punkte 141

Versuchen Sie es:

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

2 Stimmen

Les AssetFileDescriptor Version von setDataSource wurde in API-Level 24 hinzugefügt; OP fragt nach etwas, das unter Android 2.3 funktioniert.

10voto

haotang Punkte 5302

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>

4voto

Sephy Punkte 49232

Wenn ich mich recht erinnere, hatte ich das gleiche Problem beim Laden von Material aus dem Asset-Ordner, allerdings mit einer Datenbank. Es scheint, dass das Material in Ihrem Asset-Ordner 2 Stats haben kann: komprimiert oder nicht.
Wenn die Datei komprimiert ist, darf 1 Mo Speicherplatz zum Dekomprimieren verwendet werden, andernfalls wird diese Art von Ausnahme angezeigt. Es gibt mehrere Fehlerberichte darüber, weil die Dokumentation nicht eindeutig ist. Wenn Sie also Ihr Format trotzdem verwenden wollen, müssen Sie entweder eine unkomprimierte Version verwenden oder Ihrer Datei eine Erweiterung wie .mp3 oder .png geben. Ich weiß, das ist ein bisschen verrückt, aber ich lade eine Datenbank mit der Erweiterung .mp3 und es funktioniert einwandfrei. Die andere Lösung besteht darin, Ihre Anwendung mit einer speziellen Option zu verpacken, die besagt, dass bestimmte Erweiterungen nicht komprimiert werden sollen. Aber dann müssen Sie Ihre Anwendung manuell erstellen und die Option "zip -0" hinzufügen.
Der Vorteil einer unkomprimierten Datei besteht darin, dass die Daten in der Phase des zip-align vor der Veröffentlichung einer Anwendung korrekt ausgerichtet werden, so dass sie beim Laden in den Speicher direkt zugeordnet werden können.

Also, Lösungen :

  • Ändern Sie die Dateierweiterung in .mp3 oder .png und sehen Sie, ob es funktioniert
  • Ihre Anwendung manuell erstellen und die Option zip-0 verwenden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X