Wie spiele ich Videos in Android aus dem Assets-Ordner oder dem Raw-Ordner ab?

70

Ich versuche, ein Video im Android-Emulator abzuspielen. Ich habe das Video sowohl in meinem Assets-Ordner als auch im Raw-Ordner. Nach einigen Recherchen kann ich jedoch kein Video in meinem Emulator abspielen. Ich arbeite an Android 2.1. Mein Videoformat ist mp4 Ich glaube 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 Videoansicht, die ich zum Anzeigen des Videos benötige, nur einen URI oder einen Dateipfad verwendet, um auf das Video zu verweisen.

Wenn ich das Video im Raw- oder Assets-Ordner speichere, kann ich nur einen Eingabestream oder einen Dateideskriptor abrufen, und es scheint, dass nichts davon zum Initialisieren der VideoView verwendet werden kann.

Aktualisieren

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

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 bekomme ich folgende Ausnahme:

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

Es scheint, dass es keinen anderen Weg gibt, als die Datei beim Start auf die SD-Karte zu kopieren, und das scheint eine Verschwendung von Zeit und Speicher zu sein.

Abhishek Talwar
quelle
Ich denke, das Problem ist, dass mp4 ein komprimiertes Format ist. Überprüfen Sie meine Antwort für Details
Sephy
Hier Erklärung zu 'rohen' Floder stackoverflow.com/questions/11356601/…
Roman M
1
Das Jahr war 2020 und obwohl ich Android Studio 3.6, Android 10 Betriebssystem, verwendete, gab es Audio in der folgenden Videoansicht, aber das Bild war schwarz. Schließlich haben die Codes dieses Freundes funktioniert und ich kann nicht erklären, wie glücklich ich war. Keiner der unten aufgeführten Lösungen hat zum ersten Mal bei mir funktioniert. Zum Glück bin ich froh, mein Problem endlich lösen zu können. Vielen Dank: D
Görkem KARA

Antworten:

120

## Perfekt funktioniert 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ändiges Tutorial überprüfen ##

Sherif elKhatib
quelle
9
WICHTIG: Um den R.rawPfad zu verwenden, müssen Sie Ihr Video im Ordner "res / raw" und nicht unter "Assets" ablegen.
Kent
Was ist "R" hier? aka R.raw? Was ist der Typ der R-Variablen oder das ist Klasse?
Bialix
Es funktioniert nicht auf Micromax Canvas 4, sondern gibt StringIndexOutofBound eine Ausnahme
Pranav
Auch - funktioniert nur für Videoformate, die vom nativen Android unterstützt werden
Vaiden
1
Wenn Sie getWindow (). setFormat (PixelFormat.TRANSLUCENT) nicht aufrufen, stellen Sie sicher, dass Sie videoView.setZOrderOnTop (true) aufrufen. in Ihrer Videoansicht vor dem Abspielen des Videos, andernfalls wird es hinter Ihren Ansichten angezeigt und Sie werden sehr verwirrt sein; Wenn Sie einen Fehler (-21851621) erhalten, müssen Sie Ihre H264-Dateien neu codieren (H264 hat beispielsweise bei mir mit LEAWO Total Media Converter
funktioniert
11
String UrlPath="android.resource://"+getPackageName()+"/"+R.raw.ur file name;
videocontainer.setVideoURI(Uri.parse(UrlPath));
videocontainer.start();

wo Videocontainer vom Typ Videoview.

Bishoy Fakhry
quelle
10

Versuchen:

AssetFileDescriptor afd = getAssets().openFd(fileName);
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());
Jay
quelle
2
Die AssetFileDescriptorVersion von setDataSourcewurde in API-Level 24 hinzugefügt. OP fragt nach etwas, das auf Android 2.3 funktioniert.
Ernest3.14
10

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>
Haotang
quelle
4

Wenn ich mich gut erinnere, hatte ich das gleiche Problem beim Laden von Sachen aus dem Asset-Ordner, aber mit einer Datenbank. Es scheint, dass das Material in Ihrem Asset-Ordner zwei Statistiken haben kann: komprimiert oder nicht.
Wenn es komprimiert ist, dürfen Sie 1 Mo Speicher dekomprimieren, andernfalls erhalten Sie diese Art von Ausnahme. Es gibt mehrere Fehlerberichtedarüber, weil die Dokumentation nicht klar ist. Wenn Sie also weiterhin Ihr Format verwenden möchten, müssen Sie entweder eine unkomprimierte Version verwenden oder Ihrer Datei eine Erweiterung wie .mp3 oder .png geben. Ich weiß, dass es ein bisschen verrückt ist, aber ich lade eine Datenbank mit der Erweiterung .mp3 und es funktioniert einwandfrei. Diese andere Lösung besteht darin, Ihre Anwendung mit einer speziellen Option zu verpacken, um sie anzuweisen, bestimmte Erweiterungen nicht zu komprimieren. Aber dann müssen Sie Ihre App manuell erstellen und die Option "zip -0" hinzufügen.
Der Vorteil eines unkomprimierten Assests besteht darin, dass die Phase der Zip-Ausrichtung vor der Veröffentlichung einer Anwendung die Daten korrekt ausrichtet, sodass sie beim Laden in den Speicher direkt zugeordnet werden können.

Also, Lösungen:

  • Ändern Sie die Erweiterung der Datei in .mp3 oder .png und prüfen Sie, ob sie funktioniert
  • Erstellen Sie Ihre App manuell und verwenden Sie die Option zip-0
Sephy
quelle
3

Haben Sie versucht, Video manuell auf SDCard zu legen und Video Store auf SDCard abzuspielen?

Wenn es funktioniert, finden Sie hier den Weg zum Kopieren von Raw auf SD-Karte:

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

NicoMinsk
quelle
2

Ich habe es gefunden :

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

Persönlich hat Android die Ressource gefunden, kann sie aber vorerst nicht abspielen. Meine Datei ist eine .m4v

Nabil Gardon
quelle
2
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

Jordan Réjaud
quelle
Ich habe es versucht, aber in Gummibärchen funktioniert es nicht. Ich weiß nicht, ob es nur an meinem Telefon liegt. Aber es funktioniert auf neueren Geräten.
Kairi San
1

Ich denke , dass Sie benötigen , betrachten dies - es alles haben , sollten Sie wollen.

EDIT: Wenn Sie sich den Link nicht ansehen möchten, fasst dies ziemlich genau zusammen, was Sie möchten.

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

Ich empfehle jedoch weiterhin, die Informationen unter dem Link zu lesen.

hwrdprkns
quelle
Hey, danke, aber ich habe diese Seite wie eine Million Mal angesehen und diese Codezeile verwendet. Es spielt Audiodateien ab, aber nicht das Video, und ich denke, es gibt etwas, das mit Videoview und Assets oder Raw-Ordnern zu tun hat. Wenn Sie eine Idee im Kopf haben, können Sie diese gerne teilen oder einen Teil des Codes.
Abhishek Talwar
Wenn ich MediaPlayer.create (contect, R.raw.video) aufrufe, erhalte ich innerhalb der MediaPlayer-Klasse dieselbe Ausnahme, als würde ich den Mediaplayer selbst mit einem Dateideskriptor vorbereiten.
Janusz
0

Es klingt vielleicht so, als hätten Sie das gleiche Problem wie ich. Ist 3GPP möglich, anstatt MP4 zu verwenden? Ich glaube, ich habe wie HandBrake oder so etwas als Videokonverter verwendet ... Sie müssen nur sicherstellen, dass Sie den richtigen Encoder haben, wie H.264x oder so. Es tut mir leid, dass ich ein bisschen vage bin, es ist eine Weile her. Wenn es möglich ist, machen Sie sich keine Sorgen mehr um Android 2.1, und auch etwas, was im EMULATOR nicht funktioniert. Wenn es also auf vielen Geräten funktioniert, nehmen Sie einfach an, dass es funktioniert (insbesondere bei verschiedenen Herstellern).

Hier können Sie mein Problem lesen und wie ich das Problem gelöst habe (nach langer Zeit hatte niemand eine Antwort). Ich habe hier viel ausführlicher erklärt: Android Media Player funktioniert nicht

David T.
quelle
0

In der fileNamemüssen Sie den relativen Pfad zur Datei (ohne /asset) eingeben, zum Beispiel:

player.setDataSource(
    getAssets().openFd(**"media/video.mp4"**).getFileDescriptor()
);
Digolloco
quelle
0
  1. Verwenden Sie die MediaPlayerAPI und den Beispielcode.

  2. Legen Sie die Mediendatei in einen rawOrdner.

  3. Holen Sie sich die file descriptorin die Datei.

  4. mediaplayer.setDataSource(fd,offset,length); - Es ist ein Konstruktor mit drei Argumenten.

  5. Dann wann onPreared,mediaplayer.start();

Khajan
quelle
ok, danke, ich werde es versuchen, aber können Sie mir bitte einen Beispielcode geben, der sehr hilfreich wäre?
Nochmals vielen
Funktioniert nicht, schauen Sie sich die Frage für eine Erklärung an.
Janusz
-1

Haupt code

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>
Sandeep
quelle
Das funktioniert überhaupt nicht. Der Uri zeigt im Fall meiner Ressource nur auf / 2130968576.
Janusz
Ja ... diese Lösung funktioniert nicht. Der URI, der auf 2130968576 verweist, ist jedoch in Ordnung, da dies die Ressourcen-ID ist und eine legale Methode zum Erstellen eines verwendbaren URI darstellt.
Cristian
Überprüfen Sie Ihren Code. Vielleicht scheint es für dich zu funktionieren, @Sandeep. Dies reicht jedoch möglicherweise nicht aus, um das Problem zu lösen.
David Dimalanta