我有这段代码:
public InputStream getInputStream() throws Exception {
try {
process = Runtime.getRuntime().exec("ffmpeg -f dshow -i video=\"" + query + "\":audio=\"" + microPhoneName + "\" -r 25 -vcodec mpeg4 -acodec mp3 -f avi -");
}
catch (Exception e) {
}
return process.getInputStream();
}
当我使用inputStream.read(b)
命令时,它只能运行一段时间(180到400次,取决于我使用的格式和编解码器),然后inputStream
锁定read
并且应用程序不再存在了。
有什么问题?内存饱和度(ffmpeg进程内存至少为14mb)? 有没有办法解锁这种情况(清理内存,使用文件作为桥梁来防止锁定)?
当然我需要一点“实时”,而不是“后期处理”。 我不限制使用ffmpeg,如果需要我可以更改它。
答案 0 :(得分:3)
在阅读this article之后,我自己找到了解决方案:问题是errorStream
已满,必须阅读以让process
继续工作,所以我插入了Thread
消费errorStream
:
public InputStream getInputStream() throws Exception {
try {
process = Runtime.getRuntime().exec("ffmpeg -f dshow -i video=\"" + query + "\":audio=\"" + microPhoneName + "\" -r 25 -vcodec mjpeg -acodec mp3 -f " + getContentExtension() + " -");
new Thread("Webcam Process ErrorStream Consumer") {
public void run() {
InputStream i = process.getErrorStream();
try {
while (!isInterrupted()) {
i.read(new byte[bufferLength]);
}
} catch (IOException e) {
}
}
}.start();
} catch (Exception e) {
}
return process.getInputStream();
}