2012-12-07 20 views
8

Opracowuję niestandardowy odtwarzacz wideo dla systemu Android, ale muszę grać więcej niż pliki wideo obsługiwane przez Androida (mp4, 3gp ...), takie jak wmv, avi, flv.Odtwarzanie wideo z JavaCV i FFmpeg

W tym czasie konwertowałem już dowolny typ wideo na .mp4 i mogę odtwarzać je po przekodowaniu, ale nie mam pojęcia, jak mogę odtwarzać te pliki wmv, avi bez przekodowywania ich na mp4.

Czy mogę odtwarzać dowolny film na Androida bez ich przekodowania? JavaCV + biblioteka FFmpeg już działa, po prostu nie wiem jak to zrobić.

Nawiasem mówiąc, herezje kod, który używam do przekodowania filmy:

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

Szukałem od dawna i nadal nie mam odpowiedzi. Ktoś? – Wamasa

Odpowiedz

0

najpierw stworzyć CanvasFrame następnie użyć „canvas.showImage (captured_frame);” zamiast "recorder.record (captured_frame);"

Oto kod:

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

Co z dźwiękiem? – Moonlit

+1

Zapytał o android, myślę, że odpowiedziałeś na aplikację desktopową abput –

0

Czy jest jakiś sposób mogę odtwarzać dowolny film na Androida bez ich recoding?

Dlaczego nagrywasz wideo? Nie ma potrzeby nagrywania wideo. JavaCv.

To jest przykładowy kod, dzięki któremu można uzyskać pomysł, w jaki sposób można go osiągnąć.

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();