如何在java中通过管道将ffmpeg的输出传输到ffplay?
目前,我已经创建了一个java项目,它允许我使用ffmpeg将来自网络摄像头的实时视频分割成许多60秒的视频片段。 以下是主要方法:如何在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)&
@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
创建另一个进程。然后,您需要一个线程来过滤第一个进程的输出
,并将其推入第二个进程的标准输入。您可能需要在该线程中进行一些缓冲,以跟上视频数据速率。我怀疑这个实现将是非常重要的。