gpt4 book ai didi

java - 在 FFMPEG 写入文件时读取文件

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:01 27 4
gpt4 key购买 nike

正如标题所示,我正在创建一个客户端/服务器应用程序,其中服务器(PHP)读取由 ffmpeg 写入的文件,然后将其输出到客户端(JAVA)。我已经成功地用php编写了服务器脚本,该脚本启动ffmpeg,然后在一段时间后开始读取文件并将其同时发送到JAVA客户端,问题是,过了一会儿客户端停止接收任何类型的数据并且然后退出,例如,如果我有一个 5MB 的文件,它只会读取 12KB,然后退出。有人能告诉我这里可能有什么问题吗?是在服务器端还是在客户端。作为引用,我附上了 php 中文件代码的读取和客户端代码。

FFMPEG 转换文件时读取文件的代码(PHP):

$file = 'D:\\'.$destination;
$fp = @fopen($file, 'r');
//ob_end_clean();
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Cache-control: private");
header('Pragma: private');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header('Content-Length: ' . filesize($file));

$buffer = 4096;
while(!feof($fp)) {

usleep(300000);
echo fread($fp, $buffer);
ob_flush();
flush();


}
fclose($fp);
exit();

读取PHP(JAVA)传输的文件代码:

URL u = new URL(streamURL);

clientSocket = (HttpURLConnection) u.openConnection();

if( clientSocket.getResponseCode() == HttpURLConnection.HTTP_OK ){
//clientSocket.setReadTimeout(0);
inRemoteStream = clientSocket.getInputStream();


while (((count = inRemoteStream.read(buf)) != -1)) {
offset += count;
System.out.println(offset);
fileOutputStream.write(buf, 0, count);
setVideoOffset(offset, contentLength);
}

如果有人能为我解决这个问题,我会非常高兴:)。

最佳答案

又回来了。这在技术上不能解释为答案,而只是完成我发布的这项任务的不同逻辑,因此我可以有把握地说这可以是答案(软):)。 我所做的不是在写入文件时读取文件,而是使用“在后台运行”选项启动 ffmpeg shell exec 命令,并在 ffmpeg 转换文件后读取文件,对于 4MB 等小文件,结果是准确的但当我开始转换和读取超过 30MB 的文件时,我立即遇到了另一个问题。经过一些深入的研究,我发现当我使用 ffmpeg 转换 30MB 或以上的文件时,转换后发生的情况是,php 脚本没有将其控制权交还给 JAVA 小程序以便它读取流,所以我所做的是,在 ffmpeg 完成转换和保存文件后插入一个简单的“http_response_code(200)”,瞧,它可以工作了。作为引用,这里是我在 PHP 中所做的:

http_response_code(200);  
$file = 'D:\\'.$destination;
$fp = fopen($file, 'r');
//ob_end_clean();
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
//header("Cache-control: private");
//header('Pragma: private');
//header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header('Content-Length: ' . filesize($file));

$buffer = 1024*8;
while(!feof($fp)) {

echo fread($fp, $buffer);
ob_flush();
flush();



}
fclose($fp);
exit();

希望它可以帮助任何遇到类似问题的人。

问候哈里斯·塔萨瓦。

关于java - 在 FFMPEG 写入文件时读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23911460/

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