gpt4 book ai didi

java - 如何使用 FFMPEG 对文件进行转码并在 Java servlet 的响应中流式传输输出文件?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:30:15 24 4
gpt4 key购买 nike

基本上,这就是我想要做的:1. 用户将 URL 作为 GET 参数传递给我的 servlet。2. Servlet 使用 ProcessBuilder 将该 URL 中包含的媒体转换为有效的媒体格式(即:MP3)。3. servlet 将由 FFMPEG 转码的输出文件流式传输回浏览器。

1 和 2 工作正常,但我遇到问题的是 3。我能做的最好的事情是为正在转码的输出文件创建一个 FileInputStream 并将其作为响应发送,但它不起作用。我的猜测是,这是因为文件在我尝试流式传输时正在写入。

有没有办法拦截 FFMPEG 中的输出文件参数并将其读入 InputStream?在我看来,获取输入文件 A、将其转码为输出文件 B,然后将输出文件 B 即时流式传输回客户端似乎并不困难。

ProcessBuilder pb = new ProcessBuilder("ffmpeg.exe", "-i", url, "file.mp3");
Process p = pb.start();

final InputStream inStream = p.getErrorStream();

new Thread(new Runnable() {

public void run() {
InputStreamReader reader = new InputStreamReader(inStream);
Scanner scan = new Scanner(reader);
while (scan.hasNextLine()) {
System.out.println(scan.nextLine());
}
}
}).start();

ServletOutputStream stream = null;
BufferedInputStream buf = null;
try {

stream = response.getOutputStream();
File mp3 = new File(file.mp3");

//set response headers
response.setContentType("audio/mpeg");

response.addHeader("Content-Disposition", "attachment; filename=file.mp3");

response.setContentLength(-1);

//response.setContentLength((int) mp3.length());

FileInputStream input = new FileInputStream(mp3);
buf = new BufferedInputStream(input);
int readBytes = 0;
//read from the file; write to the ServletOutputStream
while ((readBytes = buf.read()) != -1) {
stream.write(readBytes);
}
} catch (IOException ioe) {
throw new ServletException(ioe.getMessage());
} finally {
if (stream != null) {
stream.close();
}
if (buf != null) {
buf.close();
}
}

最佳答案

FFmpeg 不必写入文件。它可以写入标准输出:

ffmpeg -i $input -f mp3 -

- 表示标准输出。由于没有文件名,需要用-f指定格式。

如果你这样调用它,你可以直接从ProcessInputStream读取mp3流。

关于java - 如何使用 FFMPEG 对文件进行转码并在 Java servlet 的响应中流式传输输出文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12736698/

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