Воспроизведение видео с помощью JavaCV и FFmpeg

Итак, я разрабатываю пользовательский видеоплеер для Android, но мне нужно играть больше, чем поддерживаемые андроидами видеофайлы (mp4, 3gp …), такие как wmv, avi, flv.

В это время я уже конвертирую любой тип видео в .mp4, и я могу воспроизвести их после перекодировки, но я понятия не имею, как я могу проигрывать эти файлы wmv, avi, не перекодируя их в mp4.

Есть ли способ воспроизвести любое видео на Android без их перекодировки? Библиотека JavaCV + FFmpeg уже работает, просто не знаю, как это сделать.

Кстати, heres код, который я использую, чтобы перекодировать видео:

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

Solutions Collecting From Web of "Воспроизведение видео с помощью JavaCV и FFmpeg"

Сначала вы создаете CanvasFrame, затем используйте «canvas.showImage (capture_frame)»; Вместо «recorder.record (capture_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(); } } 

Есть ли способ воспроизвести любое видео на 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(); в 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();