【问题标题】:Reading a File while it is being written by FFMPEG在 FFMPEG 写入文件时读取文件
【发布时间】:2014-05-28 12:20:48
【问题描述】:

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

如果有人能帮我解决这个问题,我会很高兴:)。

【问题讨论】:

    标签: java php ffmpeg


    【解决方案1】:

    又回来了。从技术上讲,这不能解释为答案,而只是完成我发布的此任务的不同逻辑,因此我可以肯定地说这可以是答案(软):)。 我所做的不是在写入文件时读取文件,而是使用“在后台运行”选项启动 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();
    

    希望对遇到类似问题的人有所帮助。

    问候 哈里斯·塔萨瓦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2020-06-24
      • 2011-12-16
      • 1970-01-01
      相关资源
      最近更新 更多