我正在使用
jna
模块连接两个同时执行FFMPEG命令的进程。发送
SDTOUT
服务器端的FFMPEG命令到NampedPipe和receive
STDIN
我就是这样捕捉的
STDOUT
并发送到服务器端的管道:
InputStream out = inputProcess.getInputStream();
byte[] buffer = new byte[maxBufferSize];
while (inputProcess.isAlive()) {
int no = out.available();
if (no > 0 && no > maxBufferSize) {
int n = out.read(buffer, 0,maxBufferSize);
IntByReference lpNumberOfBytesWritten = new IntByReference(maxBufferSize);
Kernel32.INSTANCE.WriteFile(pipe, buffer, buffer.length, lpNumberOfBytesWritten, null);
}
}
标准丁
OutputStream in = outputProcess.getOutputStream();
while (pipeOpenValue >= 1 && outputProcess.isAlive() && ServerIdState) {
// read from pipe
resp = Kernel32.INSTANCE.ReadFile(handle, readBuffer,readBuffer.length, lpNumberOfBytesRead, null);
// Write to StdIn inputProcess
if (outputProcess != null) {
in.write(readBuffer);
in.flush();
}
// check pipe status
Kernel32.INSTANCE.GetNamedPipeHandleState(handle, null,PipeOpenStatus, null, null, null, 2048);
pipeOpenValue = PipeOpenStatus.getValue();
WinDef.ULONGByReference ServerId = new WinDef.ULONGByReference();
ServerIdState = Kernel32.INSTANCE.GetNamedPipeServerProcessId(handle, ServerId);
}
但我面临两个问题:
由于在服务器和客户端中迭代两个循环,CPU使用率很高。(通过VisualVM分析资源来查找)
|
命令提示符。速度取决于缓冲区的大小,但大的缓冲区大小会阻碍操作,而较小的缓冲区则会进一步降低速度。
问题:
有没有办法不发送和接收字节块?只是流
到名称管道并在客户端中捕获它。(消除两个回路)
如果我不能使用NAMPPEDPPIPE,是否有其他方法连接在不同java模块中但在同一台机器中运行的两个FFMPEG进程?
谢谢