使用JavaCV和FFmpeg播放视频

8

我正在开发一款定制的 Android 视频播放器,但我需要播放更多不受 Android 支持的视频文件格式(如wmv、avi、flv)

目前我已经将任何视频类型转换为.mp4并且可以在重编码后播放它们,但我不知道如何在不将它们重新编码为mp4视频格式的情况下播放wmvavi文件。

有没有办法在 Android 上播放任何视频而无需进行重编码呢?JavaCVFFmpeg库已经在工作,只是不知道如何做到这一点。

顺便说一下,这是我用来重新编码视频的代码:

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
我已经搜索了相当长一段时间,但仍然没有答案。有人能帮忙吗? - Joao Guilherme
2个回答

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

1
他问的是关于安卓的,我认为你回答的是关于桌面应用程序的。 - Guy Levin

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接