簡體   English   中英

在FFMPEG寫入文件的同時讀取文件

[英]Reading a File while it is being written by 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);
                }

如果有人可以為我解決這個問題,我會很高興的。

再次回來。 從技術上講,這不能解釋為答案,而只是完成該任務的不同邏輯,因此我可以放心地說,這可以作為答案():)。 我所做的不是在寫入文件時讀取文件,而是使用“在后台運行”選項啟動了ffmpeg shell exec命令,並在ffmpeg轉換文件后讀取文件,對於4MB之類的小文件,結果是准確的但是當我開始轉換和讀取超過30MB的文件時,我立即遇到了另一個問題。 經過一些深入的研究,我知道當我使用ffmpeg轉換30MB或以上的文件時,轉換后發生的事情是,php腳本沒有將控制權交還給JAVA applet,以便它讀取流,因此我所做的是,在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();

希望它可以幫助陷入類似問題的任何人。

關於哈里斯·塔薩瓦爾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM