Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中通过管道将ffmpeg的输出传输到ffplay?_Java_Ffmpeg - Fatal编程技术网

如何在java中通过管道将ffmpeg的输出传输到ffplay?

如何在java中通过管道将ffmpeg的输出传输到ffplay?,java,ffmpeg,Java,Ffmpeg,目前,我已经创建了一个java项目,它允许我使用ffmpeg将来自网络摄像头的实时视频分割成许多60秒的视频片段。 以下是主要方法: @Override public boolean startRecording(String fileName, Integer clipPrefix, String folderClipName) { final String methodName = "startRecording(fileName, folderClipPath)&

目前,我已经创建了一个java项目,它允许我使用ffmpeg将来自网络摄像头的实时视频分割成许多60秒的视频片段。 以下是主要方法:

    @Override
public boolean startRecording(String fileName, Integer clipPrefix, String folderClipName) {
    final String methodName = "startRecording(fileName, folderClipPath)";
    this.startLog(methodName, fileName, folderClipName);
    try {
        File folder = new File(folderClipName + System.getProperty("file.separator") +fileName);
        if( !folder.exists() ) {
            folder.mkdir();
        }
    }catch(Exception e) {
        e.printStackTrace();
    }
    String fileNameFull = buildFileName(fileName, clipPrefix);
    String[] cmd = buildCommandArray(fileNameFull);
    logger.debug("{} - executing FfmpegStartRecordingCommand with cmd:{}", methodName, Arrays.toString(cmd));
    Process p = new FfmpegStartRecordingCommand().execute(cmd);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return p.isAlive();
}

public String[] buildCommandArray(String fileNameFull) {
    String cmd[] = new String[37];
    cmd[0] = "-f";
    cmd[1] = "dshow";
    cmd[2] = "-rtbufsize";
    cmd[3] = "2000M";
    cmd[4] = "-i";
    cmd[5] = cameraName;
    cmd[6] = "-preset";
    cmd[7] = "slow";
    cmd[8] = "-codec:a";
    cmd[9] = "libfdk_aac";
    cmd[10] = "-b:a";
    cmd[11] = "128k";
    cmd[12] = "-codec:v";
    cmd[13] = "libx264";
    cmd[14] = "-pix_fmt";
    cmd[15] = "yuv420p";
    cmd[16] = "-b:v";
    cmd[17] = "1000k";
    cmd[18] = "-minrate";
    cmd[19] = "500k";
    cmd[20] = "-maxrate";
    cmd[21] = "2000k";
    cmd[22] = "-bufsize";
    cmd[23] = "2000k";
    cmd[24] = "-vf";
    cmd[25] = "scale=854:480";
    cmd[26] = "-f";
    cmd[27] = "segment";
    cmd[28] = "-segment_time";
    cmd[29] = "60";
    cmd[30] = "-reset_timestamps";
    cmd[31] = "1";
    cmd[32] = "-flush_packets";
    cmd[33] = "1";
    cmd[34] = "-loglevel";
    cmd[35] = "quiet";
    cmd[36] = fileNameFull;
    return cmd;
}
对于这些,我希望我可以使用一种方法,允许我同时使用ffplay,以查看我获得了什么? 在internet上,我找到了以下命令

ffmpeg -i <video> out.mp4 | ffplay -i video
ffmpeg-i out.mp4 | ffplay-i视频
但我不知道如何用java实现它。 有什么想法??
提前感谢

我想您需要为
ffmpeg
创建一个
进程
,为
ffplay
创建另一个进程。然后,您需要一个线程来过滤第一个
进程的输出
,并将其推入第二个进程的标准输入。您可能需要在该线程中进行一些缓冲,以跟上视频数据速率。我怀疑这个实现将是非常重要的。我想您需要为
ffmpeg
创建一个
进程
,为
ffplay
创建另一个进程。然后,您需要一个线程来过滤第一个
进程的输出
,并将其推入第二个进程的标准输入。您可能需要在该线程中进行一些缓冲,以跟上视频数据速率。我怀疑这个实现将是非常重要的。