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.
Antworten:
## 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 ##
quelle
R.raw
Pfad zu verwenden, müssen Sie Ihr Video im Ordner "res / raw" und nicht unter "Assets" ablegen.String UrlPath="android.resource://"+getPackageName()+"/"+R.raw.ur file name; videocontainer.setVideoURI(Uri.parse(UrlPath)); videocontainer.start();
wo Videocontainer vom Typ Videoview.
quelle
Versuchen:
quelle
AssetFileDescriptor
Version vonsetDataSource
wurde in API-Level 24 hinzugefügt. OP fragt nach etwas, das auf Android 2.3 funktioniert.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>
quelle
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:
quelle
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 .
quelle
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
quelle
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
quelle
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.
Ich empfehle jedoch weiterhin, die Informationen unter dem Link zu lesen.
quelle
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
quelle
In der
fileName
müssen Sie den relativen Pfad zur Datei (ohne/asset
) eingeben, zum Beispiel:player.setDataSource( getAssets().openFd(**"media/video.mp4"**).getFileDescriptor() );
quelle
Verwenden Sie die
MediaPlayer
API und den Beispielcode.Legen Sie die Mediendatei in einen
raw
Ordner.Holen Sie sich die
file descriptor
in die Datei.mediaplayer.setDataSource(fd,offset,length);
- Es ist ein Konstruktor mit drei Argumenten.Dann wann
onPreared
,mediaplayer.start();
quelle
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>
quelle