2010-02-02 8 views
7

Ich habe mehrere verschiedene Beispiele versucht, aber ich kann kein Video erhalten, um zu zeigen. Ich höre Ton, aber kein Video. Ich dachte, vielleicht hatte ich gerade ein falsches Videoformat, also habe ich einen Fiat-Werbespot im 3GP-Format heruntergeladen und immer noch keine Freude. Ich verwende die Eclipse Java EE mit Android SDK und meine App zielt auf die 1.5 SDK (Api Level 3) ohne Google API. Könnte jemand bitte einen Link zu einem Video posten, das bekannt ist, um auf Android zu spielen, oder auf mein Problem mit dem Code hinweisen. Ich habe alle habe ich versucht, von .. mit/ohne Vorbereitung denken könnte .. verschiedene Layouts usw.Android-Video, hören Sie Ton aber kein Video

Hier ist meine onCreate in Tätigkeit

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

this.setContentView(R.layout.video_test); 
    SurfaceView v = (SurfaceView) findViewById(R.id.surface_video); 
    SurfaceHolder holder = v.getHolder(); 
// Set the transparency 
    //getWindow().setFormat(PixelFormat.UNKNOWN); 


    // Set a size for the video screen 
    //holder.addCallback(this); 
    holder.setFixedSize(400,300); 


    MediaPlayer mp = MediaPlayer.create(this, R.raw.fiat); 
    mp.setDisplay(holder); 
    //mp.setAudioStreamType(2); 
    try { 
     //mp.prepare(); 
     mp.start(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

ihr ist das Layout in video_test.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" 
> 
<SurfaceView android:id="@+id/surface_video" 
android:layout_width="250px" 
android:layout_height="250px"> 
</SurfaceView> 
<LinearLayout 
android:orientation="horizontal" 
android:layout_height="wrap_content" 
android:layout_width="fill_parent" 
android:padding="10dip" 
> 
</LinearLayout> 
</LinearLayout> 

> Blockquote

+0

Ich hatte dieses Problem auch mit einem VideoView, aber wenn ich den Fokus nach dem Start des Videos anfordere, dann funktioniert es ok. – draksia

Antwort

1

Wenn Sie den Emulator verwenden, funktioniert es möglicherweise nicht. Dem Emulator fehlt die Hardwarebeschleunigung, die in Android-Geräten verfügbar ist. Zum Beispiel kann ich bei einem 2,6 GHz Core 2 Duo manchmal ein Video abspielen, aber nicht immer. Auf langsameren Computern funktioniert die Videowiedergabe nicht. Auf einem 2,5 GHz Core 2 Quad bekomme ich immer Videowiedergabe. Davon abgesehen teste ich die Videowiedergabe normalerweise auf tatsächlichen Geräten.

Ich bin auch unsicher, ob Video-Wiedergabe von Rohstoffen funktioniert. Ich empfehle Ihnen dringend, zunächst ein Video aus einer Datei auf der SD-Karte zu verwenden.

In Bezug auf Videos, die definitiv funktionieren, weiß ich, dass "Documentaries and You" und "Musik für unsere Enkel" von here in ihren MP4-Formularen funktionieren.

+0

Ich verwende ein Core 2 Duo 3.0 GHz. Ich bin mir nicht sicher, warum, aber ich fand ein anderes Team in diesem Forum, das mit VideoView funktioniert. Danke für die Antwort .. Ich wusste nicht, es ist CPU abhängig hier ist der Link zu was für mich funktioniert http://stackoverflow.com/questions/2167608/android-not-player-video-mp4 – slytron

+0

Diese Antwort ist einfach nicht wahr. Die Videowiedergabe in seinem Fall funktioniert nicht, da er den Callback auf SurfaceHolder nicht initialisiert ... er hat nichts mit Emulator- oder Computergeschwindigkeit zu tun. Siehe Antwort auf der Unterseite mit Code für die ordnungsgemäße Initialisierung von SurfaceHolder. – kape123

1

Sie können ein vollständiges Beispiel erhalten, indem an der Android ApiDemo Beispielanwendung suchen (siehe das Beispiel unter ‚Media‘): http://developer.android.com/resources/samples/ApiDemos/index.html

Wie für einen Beispielfilm mit der Demo zu verwenden, habe ich verwende Links Die mobile Website von YouTube mit Erfolg.

0

Ich lief auf das gleiche Problem. Ich konnte es beheben, indem ich SurfaceView zu VideoView in der XML-Layout-Datei änderte. Behalte den Rest des Codes gleich. Das hat für mich funktioniert, weiß nicht warum.

17

Ihre Klasse muss SurfaceHolder.Callback implementieren und die Methoden setDisplay, prepare und etc erst aufrufen, nachdem Sie in die Oberfläche gelangt sind. Außerdem müssen Sie möglicherweise den Typ des Oberflächenhalters in SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS ändern. Wie folgt aus:

import android.view.SurfaceHolder.Callback; 

public class TestActivity extends Activity implements Callback { 

// ... 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // ... 
     mSurfaceView = (SurfaceView)findViewById(R.id.yousurfaceview); 
     holder = mSurfaceView.getHolder(); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    try { 
     mp.setDisplay(holder); 
     mp.setDataSource(somesource); 
     mp.prepare(); 
     mp.start(); 
     // etc... 
    } catch (IOException e) { 
     } catch (IllegalArgumentException e) { 
     } catch (IllegalStateException e) { 
    } 

} 

// ... 
} 

Wenn Sie es in OnCreate versuchen bekam man nichts als Ergebnis, da Oberfläche ist noch nicht erstellt ...

+0

Ich liebe dich so sehr. Du rettest mein Leben! Ich habe eine kleine Bearbeitung Ihrer Antwort hinzugefügt – Aracem

+1

Vielen Dank für 'SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS'! Unglaublich! Herzlichen Glückwunsch zu Ihrem goldenen Abzeichen - es ist sehr gut verdient! –

+0

Aus dem offiziellen Dokument: Diese Konstante wurde in API-Ebene 11 nicht mehr unterstützt. Dies wird ignoriert. Dieser Wert wird bei Bedarf automatisch festgelegt. –

0

Dies ist ein altes Problem, aber meine Antwort kann jemand helfen.

Um alte Versionen von Android zu unterstützen Sie benötigen diese Zeile hinzufügen:

videoHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
0

Ob eine Videodatei in einem bestimmten Spieler drei Dinge, hängt davon ab, spielen:

  • Das Video-Container-Format (Dateityp).
  • Der Codec die Video (und möglicherweise Audio) Streams Codierung; Unterstützung Ihres Players für diese Kombination aus Containerformat und Codec
  • Der Codec und die Player-/Geräteunterstützung für diesen Player sind mit ziemlicher Sicherheit die Ursache für die widersprüchlichen Ergebnisse, die Sie gesehen haben. (A-Codec, wenn Sie nicht wissen, ist im Grunde eine wiederholbare mathematische Formel, die Ihr System sagt, wie Bits und Bytes in eine Datei in bewegten Bildern gepackt drehen (und wieder zurück, was das betrifft))
Verwandte Themen