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

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

В настоящее время я уже конвертирую любой тип видео в .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();
    }
}

person Wamasa    schedule 07.12.2012    source источник
comment
Я искал довольно долго и до сих пор нет ответов. Любой?   -  person Wamasa    schedule 10.12.2012


Ответы (2)


сначала вы создаете 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();
}
}
person user2885052    schedule 14.02.2014
comment
Он спросил об андроиде, я думаю, вы ответили о десктопном приложении. - person Guy Levin; 09.09.2015

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