在FFMPEG写入文件时读取文件

时间:2014-05-28 12:20:49

标签: java php ffmpeg

正如标题所示,我正在创建一个客户端/服务器应用程序,其中服务器(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);
                }

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

1 个答案:

答案 0 :(得分:0)

再回来。这不能在技术上解释为答案,而只是一个不同的逻辑来完成我发布的任务,所以我可以有把握地说这可以是答案(软):)。          我所做的不是在写入文件时读取文件,而是在后台运行&f;运行ffmpeg shell exec命令。选项并读取文件AFTER ffmpeg转换文件后,结果对于4MB这样的小文件是准确的,但是当我开始转换和读取超过30MB的文件时,我立即遇到了另一个问题。经过一些深入的研究,我知道当我使用ffmpeg转换30MB或更高的文件时发生的事情是在转换之后,php脚本没有将其控制权交还给JAVA applet以便它读取流,所以我做的是我插入了一个简单的' http_response_code(200)'在ffmpeg完成转换并保存文件之后,它就可以工作了。这里的参考是我在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();

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

此致 Haris Tasawar。