1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Probleme beim Einbinden von Videos!

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von gurkenprinz, 19.05.2010.

  1. gurkenprinz, 19.05.2010 #1
    gurkenprinz

    gurkenprinz Threadstarter Neuer Benutzer

    Beiträge:
    22
    Erhaltene Danke:
    0
    Registriert seit:
    13.04.2010
    Hallo Leute !!

    Meine App soll Videos zum Streamen zur Verfügung stellen! Da ich mich noch nie damit beschäftigt habe, wollte ich einfach mal ein Video in einer VideoView einbinden. Kann ja net so schwer sein oder ??? Hier mal mein Code:

    Code:
    protected void onCreate(Bundle savedInstanceState) 
        {
            
            super.onCreate(savedInstanceState);
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            this.setContentView(R.layout.videos);
            
            VideoView video = (VideoView)this.findViewById(R.id.video);
            MediaController mediaController = new MediaController(this);
            mediaController.setAnchorView(video);
            video.setMediaController(mediaController);
            video.setVideoPath("W://android_testvideo.3gp");
            video.requestFocus();
    
            video.start();
            
            
        }
    Wenn ich diese Aktivität starte bekomm ich allerdings eine Fehlermeldung ("Dieses Video kann leider nicht abgespielt werden").

    Habs auch schon mit einem Video von einem Webserver probiert.
    Code:
            Uri uri =  Uri.parse("http://....../20100515_dfb-pokal-finals-zwanziger.mp4");
           video.setVideoURI(uri);
    Dann bekomm ich diese Fehlermeldung: "Leider ist dieses Video nicht für Streaming auf diesem Gerät gültig"

    Falls jemand was damit anfangen kann poste ich hier auch noch den Auszug aus der LogCat der angezeigt wird wenn ich die Aktivität starte:

    05-19 08:59:40.729: ERROR/PlayerDriver(57): Command PLAYER_INIT completed with an error or info UNKNOWN PVMFStatus
    05-19 08:59:40.729: VERBOSE/MediaPlayerService(57): [43] notify (0x227e0, 100, 200, -32)
    05-19 08:59:40.729: VERBOSE/MediaPlayer(15803): message received msg=100, ext1=200, ext2=-32
    05-19 08:59:40.739: ERROR/MediaPlayer(15803): error (200, -32)
    05-19 08:59:40.739: VERBOSE/MediaPlayer(15803): callback application
    05-19 08:59:40.739: ERROR/MediaPlayer(15803): Error (200,-32)
    05-19 08:59:40.739: DEBUG/VideoView(15803): Error: 200,-32


    Meine eigentliche Frage ist jetzt: Ist etwas an meinem Programmcode falsch ?? Muss ich irgendwas besonderes beachten ?? Irgendwelche besonderen Permissions setzen ? (Internet Permission ist übrigens gesetzt).

    Oder müssen sich unsere Videomenschen weiter mit der Codierung herumquälen ?? Sie haben mir bereits 3 oder 4 verschiedene Videos zur verfügung gestellt und mit allen is es das selbe Problem.

    lg gurkenprinz
     
    Zuletzt bearbeitet: 19.05.2010
  2. MichaelS, 21.05.2010 #2
    MichaelS

    MichaelS Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    Bei den Beispielen vom SDK, sind sogar 2 arten von abspielen von Videos vorhanden. auch das Streamen von Videos ist dabei. Du solltest dir diese einfach mal ansehen und deine videos mit dieser app einfach testen ;) Du kannst natürlich nicht jedes Format abspielen deswegen einfach mit der app testen...

    Gruß
    Michael
     
  3. gurkenprinz, 26.05.2010 #3
    gurkenprinz

    gurkenprinz Threadstarter Neuer Benutzer

    Beiträge:
    22
    Erhaltene Danke:
    0
    Registriert seit:
    13.04.2010
    danke für die antwort michael.

    nach langem hin und herprobieren hab ich eine Methode gefunden mit der sich die Videos abspielen lassen.

    Allerdings habe ich jetzt das Problem das die Videos erst komplett geladen werden bevor sie abgespielt werden (Dauert bei einem 3min. Video fast eine Minute).

    Hier mal mein Code.

    Code:
    public class ShowVideo extends Activity
    {
        private String path = "";
    
        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            this.setContentView(R.layout.video);
            
            Bundle extra = this.getIntent().getExtras();
            if(extra!=null)
            {
                path = extra.getString("videoUrl");
            }
            
            VideoView vv = (VideoView)this.findViewById(R.id.surface);
    
            MediaController mc = new MediaController(this);
            
            vv.setMediaController(mc);
        
            try 
            {
                vv.setVideoURI(Uri.parse(this.getDataSource(path)));
                
            } 
            catch (IOException e) 
            {
                Log.e("IOException", e.getMessage());
            }
    
            vv.start();
            vv.requestFocus();
            
            
        
        }
        
        private String getDataSource(String path) throws IOException 
        {
                Log.v("getDataSource", "start");
               if (!URLUtil.isNetworkUrl(path)) 
               {
                       return path;
               } 
               else 
               {
                    URL url = new URL(path);
                    URLConnection cn = url.openConnection();
                    cn.connect();
                    InputStream stream = cn.getInputStream();
                    if (stream == null)
                    {
                           throw new RuntimeException("stream is null");
                    }
                    File temp = File.createTempFile("mediaplayertmp", "dat");
                    temp.deleteOnExit();
                    String tempPath = temp.getAbsolutePath();
                    FileOutputStream out = new FileOutputStream(temp);
                    byte buf[] = new byte[128];
                    do 
                    {
                        int numread = stream.read(buf);
                        if (numread <= 0)
                            break;
                        out.write(buf, 0, numread);
                    } 
                    while (true);
                    try 
                    {
                        stream.close();
                    } 
                    catch (IOException ex) 
                    {
                        Log.e("error: " + ex.getMessage(), ex.getMessage());
                    }
                    Log.v("getDataSource", "fertig");   
                    return tempPath;
                 
               }
               
        }
    
        
        
    
    }
    
    Das Video lässt sich nur abspielen wenn ich den UrlString vorher in der Methode "getDataSource" verarbeite und dann den neuen String in die VideoView einlese.

    Wenn ich diese Methode nicht verwende und die VideoUrl gleich der VideoView übergebe bekomm ich die Fehlermeldung "Dieses Video ist für Streaming auf diesem Gerät nicht gültig".

    Ich habe die Methode getDataSource aus dem Internet kopiert. Ich versteh sie um ehrlich zu sein gar nicht. Aber sie hat es zumindest mal ermöglicht meine Videos abzuspielen (nach sehr langer ladezeit).

    Kann mir jemand einen Tipp geben wie ich es schaffe, dass die Videos bereits gestartet werden bevor sie fertig geladen sind ??

    Die Videos kommen übrigens aus der selben Quelle wie sie ein Kollege für sein IPhone App verwendet hat. Sie sollten also fürs onlinestreaming gültig sein.

    Besten Dank !!
    lg gurkenprinz
     
  4. Operator, 26.05.2010 #4
    Operator

    Operator Android-Lexikon

    Beiträge:
    1,235
    Erhaltene Danke:
    189
    Registriert seit:
    17.12.2009
    Phone:
    Galaxy Nexus
    Hi gurkenprinz,

    ein Ausrufezeichen im Thread-Titel hätte auch gereicht ;).
     

Diese Seite empfehlen