玩JavaCV和FFmpeg的视频 [英] Playing a video with JavaCV and FFmpeg

查看:2387
本文介绍了玩JavaCV和FFmpeg的视频的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以,我正在开发一个定制的视频播放器Android版,但我需要多打了Android支持的视频文件(MP4,3GP ......),如对WMV,AVI,FLV。

在这个时候我已经转换任何视频类型的MP4,我能重新编码后打他们,但我不知道我怎么可以玩这些WMV,AVI文件,而无需重新编码它们的MP4。

有没有什么办法可以发挥在Android上任何视频而无需重新编写呢? JavaCV + FFmpeg的库已经工作,只是不知道该怎么做。

通过,我使用重新code视频的方式,继承人的code:

 公共静态无效的转换(档案文件){

    FFmpegFrameGrabber采集卡=
            新FFmpegFrameGrabber(file.getAbsolutePath());

    IplImage的captured_frame = NULL;

    FrameRecorder记录= NULL;
    记录=新FFmpegFrameRecorder(到/ mnt / SD卡/ external_sd / videosteste / primeiroteste.mp4,300,300);
    recorder.setVideo codeC(13);
    recorder.setFrameRate(30);
    recorder.setFormat(MP4);
    尝试 {
        recorder.start();
        frameGrabber.start();
        而(真){
            尝试 {
                captured_frame = frameGrabber.grab();

                如果(captured_frame == NULL){
                    的System.out.println(!!!失败cvQueryFrame);
                    打破;
                }
                recorder.record(captured_frame);
            }赶上(例外五){
            }
        }
        recorder.stop();
        recorder.release();
    }赶上(例外五){
        e.printStackTrace();
    }
}
 

解决方案

首先创建CanvasFrame然后使用canvas.showImage(captured_frame);代替recorder.record(captured_frame);

下面是code:

 公共类GrabberShow实现Runnable
{
    最终静态INT间隔= 40; ///你可以使用间隔
    IplImage的形象;
    静态CanvasFrame帆布=新CanvasFrame(JavaCV播放器);


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


    公共静态无效的转换(档案文件)
    {

    FFmpegFrameGrabber采集卡=新FFmpegFrameGrabber(file.getAbsolutePath());

    IplImage的captured_frame = NULL;

    FrameRecorder记录= NULL;
    //记录=新FFmpegFrameRecorder(到/ mnt / SD卡/ external_sd / videosteste / primeiroteste.mp4,300,300);
    录音机=新FFmpegFrameRecorder(D://temp.mp4,300,300);
    recorder.setVideo codeC(13);
    recorder.setFrameRate(30);
    recorder.setFormat(MP4);
    尝试 {
        recorder.start();
        frameGrabber.start();
        而(真){
            尝试 {
                captured_frame = frameGrabber.grab();

                如果(captured_frame == NULL){
                    的System.out.println(!!!失败cvQueryFrame);
                    打破;
                }
                //recorder.record(captured_frame);
                canvas.showImage(captured_frame);
                视频下载(间隔);
            }赶上(例外五){
            }
        }
        recorder.stop();
        recorder.release();
    }赶上(例外五){
        e.printStackTrace();
    }
}
@覆盖
公共无效的run()
{
    转换(新文件(D://aes.mp4));
}

公共静态无效的主要(字串[] args){
    GrabberShow GS =新GrabberShow();
    主题日=新主题(GS);
    th.start();
}
}
 

So, I'm developing a custom video player for Android but I need to play more than the android supported video files (mp4, 3gp...), like wmv, avi, flv.

At this time I do already convert any video type to .mp4 and I'm able to play them after recoding, but I have no idea how can I play those wmv, avi files without recoding them to mp4.

Is there any way I can play any video on Android without recoding them? JavaCV + FFmpeg library already working, just don't know how to do that.

By the way, heres the code that I'm using to recode videos:

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

解决方案

first you create the CanvasFrame then use "canvas.showImage(captured_frame);" instead of "recorder.record(captured_frame);"

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

这篇关于玩JavaCV和FFmpeg的视频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆