1

我必须在 java 中开发一个工具来从网络摄像头捕获帧,现在我所做的是,我使用Runtime类来运行ffmpeg和其他命令,当它开始从我的网络摄像头捕获帧时,我正在使用以下方法。

public class FFMPEGClass {

    private String ffmpegExeLocation, line;
    private final String FRAME_DIGITS = "010";

    public FFMPEGClass(String capturingDName, String outputImagesLocation, int framesPerSecond) {
        ffmpegExeLocation = System.getProperty("user.dir") + "\\bin\\";
        System.out.println(ffmpegExeLocation);
        try {            
            System.out.println(ffmpegExeLocation + "ffmpeg -t 100000 "
                    + "-f vfwcap -s 640x480 -i 0 -r 1/" + framesPerSecond + " -f image2 " + outputImagesLocation + "\\camera%"+FRAME_DIGITS+"d.jpg");
            Process pp = Runtime.getRuntime().exec(ffmpegExeLocation + "ffmpeg -t 100000 "
                    + "-f vfwcap -s 640x480 -i 0 -r 1/" + framesPerSecond + " -f image2 " + outputImagesLocation + "\\camera%"+FRAME_DIGITS+"d.jpg");
            BufferedReader br = new BufferedReader(new InputStreamReader(pp.getErrorStream()));
            while((line = br.readLine()) != null){
                 System.out.println(line);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

在我的情况下captureDNameUSB2.0 UVC VGA WebCam
outputImagesLocatione:\myfolder\frames\
framesPerSecond10

该代码运行良好,但无法有效捕获帧,换句话说我想说它的处理速度很慢,谁能告诉我如何优化它以便它可以非常快速地捕获帧。

我有带有6 GB RAMIntel Core i3处理器

我已经检查了谷歌和 stackoverflow 的许多答案,但这些在我的情况下不起作用

4

1 回答 1

0

如果您使用 10 fro frameperseconds,则以下调用

Process pp = Runtime.getRuntime().exec(ffmpegExeLocation + "ffmpeg -t 100000 "
                    + "-f vfwcap -s 640x480 -i 0 -r 1/" + framesPerSecond + " -f image2 " + outputImagesLocation + "\\camera%"+FRAME_DIGITS+"d.jpg");

将扩展为:

ffmpeg -t 100000 -f vfwcap -s 640x480 -i 0 -r 1/10 -f image2 output%05d.jpg

您使用该-r选项的方式是错误的(请参阅ffmpeg doc),如果您想要每秒 10 帧,请更新您的代码以删除小数!

Process pp = Runtime.getRuntime().exec(ffmpegExeLocation + "ffmpeg -t 100000 "
                        + "-f vfwcap -s 640x480 -i 0 -r " + framesPerSecond + " -f image2 " + outputImagesLocation + "\\camera%"+FRAME_DIGITS+"d.jpg");
于 2013-08-22T11:22:56.133 回答