2012-12-07 25 views
8

Also ich entwickle einen benutzerdefinierten Video-Player für Android, aber ich muss mehr als die Androide unterstützten Videodateien (MP4, 3GP ...), wie WMV, AVI, FLV.Abspielen eines Videos mit JavaCV und FFmpeg

Zur Zeit konvertiere ich schon jeden Videotyp in .mp4 und ich kann sie nach dem Recodieren abspielen, aber ich habe keine Ahnung wie ich diese wmv, avi Dateien abspielen kann, ohne sie auf mp4 zu kopieren.

Gibt es eine Möglichkeit, jedes Video auf Android zu spielen, ohne sie neu zu codieren? JavaCV + FFmpeg Bibliothek funktioniert bereits, weiß nur nicht, wie das geht.

By the way, herer der Code, den ich verwende Videos neu zu kodieren:

public static void convert(File file) { 

    FFmpegFrameGrabber frameGrabber = 
      new FFmpegFrameGrabber(file.getAbsolutePath()); 

    IplImage captured_frame = null; 

    FrameRecorder recorder = null; 
    recorder = new FFmpegFrameRecorder("/mnt/sdcard/external_sd/videosteste/primeiroteste.mp4", 300, 300); 
    recorder.setVideoCodec(13); 
    recorder.setFrameRate(30); 
    recorder.setFormat("mp4"); 
    try { 
     recorder.start(); 
     frameGrabber.start(); 
     while (true) { 
      try { 
       captured_frame = frameGrabber.grab(); 

       if (captured_frame == null) { 
        System.out.println("!!! Failed cvQueryFrame"); 
        break; 
       } 
       recorder.record(captured_frame); 
      } catch (Exception e) { 
      } 
     } 
     recorder.stop(); 
     recorder.release(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+1

Ich habe lange gesucht und immer noch keine Antworten. Jemand? – Wamasa

Antwort

0

zuerst erstellen Sie die CanvasFrame dann verwenden "canvas.showImage (captured_frame);" anstelle von "recorder.record (captured_frame);" Hier

ist der Code:

public class GrabberShow implements Runnable 
{ 
    final static int INTERVAL=40;///you may use interval 
    IplImage image; 
    static CanvasFrame canvas = new CanvasFrame("JavaCV player"); 


    public GrabberShow() 
    { 
     canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 
    } 


    public static void convert(File file) 
    { 

    FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(file.getAbsolutePath()); 

    IplImage captured_frame = null; 

    FrameRecorder recorder = null; 
    //recorder = new FFmpegFrameRecorder("/mnt/sdcard/external_sd/videosteste/primeiroteste.mp4", 300, 300); 
    recorder = new FFmpegFrameRecorder("D://temp.mp4", 300, 300); 
    recorder.setVideoCodec(13); 
    recorder.setFrameRate(30); 
    recorder.setFormat("mp4"); 
    try { 
     recorder.start(); 
     frameGrabber.start(); 
     while (true) { 
      try { 
       captured_frame = frameGrabber.grab(); 

       if (captured_frame == null) { 
        System.out.println("!!! Failed cvQueryFrame"); 
        break; 
       } 
       //recorder.record(captured_frame); 
       canvas.showImage(captured_frame); 
       Thread.sleep(INTERVAL); 
      } catch (Exception e) { 
      } 
     } 
     recorder.stop(); 
     recorder.release(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
@Override 
public void run() 
{ 
    convert(new File("D://aes.mp4")); 
} 

public static void main(String[] args) { 
    GrabberShow gs = new GrabberShow(); 
    Thread th = new Thread(gs); 
    th.start(); 
} 
} 
+0

Was ist mit Audio? – Moonlit

+1

Er fragte nach Android, ich glaube, Sie haben abput Desktop-App beantwortet –

0

Gibt es eine Möglichkeit, jedes Video auf Android spielen können, ohne sie zu Umkodierung?

Warum nehmen Sie das Video auf? Das Video muss nicht aufgenommen werden. JavaCv.

Dies ist ein Beispielcode für die Idee, wie Sie es erreichen können.

FrameGrabber grabber = new FrameGrabber(videoFile); 
grabber.start(); 
BufferedImage image= null; 
while((image=grabber.grab())!=null){ 
    // TODO set the image on the canvas or panel where ever you want. 
} 
grabber.stop(); 
Verwandte Themen