gpt4 book ai didi

java - FFmpeg 停止从 104 MB 开始读取流数据

转载 作者:行者123 更新时间:2023-11-30 04:03:46 26 4
gpt4 key购买 nike

当我在 shell 中启动此命令时:/home/ffmpeg-2.0.1-64bit-static/ffmpeg -i rtmp://localhost:1935/livetv/2ch5h264 -vn -ar 44100 -ac 2 -ab 128k -f wav -ss 00:00:00 -t第7200章/home/Data/file.wav

这样就可以了,“file.wav”将被写入,例如 +-600MB。 (该命令成功运行)我确认该文件至少有 2 小时的音频。

我的问题:当我在 Java 上启动此进程时:

//Current Java App
Runtime rt = Runtime.getRuntime();

//Command Process to get data from streaming
String cmdLine = "/home/ffmpeg-2.0.1-64bit-static/ffmpeg -i rtmp://localhost:1935/livetv/2ch5h264 -vn -ar 44100 -ac 2 -ab 128k -f wav -ss 00:00:00 -t 7200 /home/Data/file.wav";

//Start the process
proc_ffmpeg = rt.exec(cmdLine);

//Wait to Exit
int exitVal = proc_split.waitFor();

FFmpeg 不会在 file.wav 中写入超过 +- 104MB 的内容?在这种情况下,我的音频文件只有 +- 10 分钟。

谢谢

最佳答案

听起来问题是 ffmpeg 正在写入日志信息,而您没有在 Java 代码中读取它。进程之间会有一个小缓冲区,当该缓冲区填满时,ffmpeg 在尝试写入更多日志信息时将阻塞。

您可以使用ProcessBuilder并调用ProcessBuilder.redirectError/ProcessBuilder.redirectOutput,或者您可以从标准错误/输出流中读取你的Java代码。除非您确定它只会写入其中一个线程,否则您应该在其他线程中执行此操作。举个简单的例子:

public class StreamConsumer implements Runnable {
private final InputStream input;

public StreamConsumer(InputStream input) {
this.input = input;
}

@Override
public void run() {
byte[] buffer = new byte[1024];
try {
while (input.read(buffer) > 0) {
// No-op; we're not interested in the data
}
} catch (IOException e) {
// Log the error or whatever you want to do. The stream is probably
// broken now...
}
}
}

...

new Thread(new StreamConsumer(proc_ffmpeg.getInputStream())).start();
new Thread(new StreamConsumer(proc_ffmpeg.getErrorStream())).start();

关于java - FFmpeg 停止从 104 MB 开始读取流数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21283689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com