2012-12-07 115 views
8

因此,我正在開發一款適用於Android的自定義視頻播放器,但我需要播放的不僅僅是android支持的視頻文件(mp4,3gp ...),比如wmv,avi,flv。使用JavaCV和FFmpeg播放視頻

此時我已經將任何視頻類型轉換爲.mp4,我可以在重新編碼後播放它們,但我不知道如何播放這些wmv,avi文件而無需將它們重新編碼爲mp4。

有什麼辦法可以在Android上播放任何視頻而不需要重新編碼它們? JavaCV + FFmpeg庫已經在工作,只是不知道該怎麼做。

順便說一句,繼承人,我使用重新編碼視頻代碼:

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

我一直在尋找相當一段時間,仍然沒有答案。任何人? – Wamasa

回答

0

首先創建CanvasFrame然後使用「canvas.showImage(captured_frame);」而不是「recorder.record(captured_frame);」

下面是代碼:

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

音頻是怎麼回事? – Moonlit

+1

他問了一些關於android的問題,我想你回答了abput桌面應用程序 –

0

有什麼辦法,我可以玩Android上的任何視頻而無需重新編寫他們?

你爲什麼要錄製視頻?沒有必要記錄視頻。 JavaCv。

這是給你的想法,你如何實現它的示例代碼。

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