2014-04-18 18 views
6

如果我有一個支持字節範圍,是有可能檢索單個字節範圍,並創建該範圍數據的新的/自含式MP4一臺服務器上的遠程mp4文件?是否可以從單個流式字節範圍塊創建新的mp4文件?

如果我嘗試使用fs.createWriteStream(remoteFilename)將返回的字節範圍數據直接寫入mp4文件,它不會獲取需要播放的視頻元數據(持續時間,維度等)。

當我得到以0開頭並以XX結尾的字節範圍時,輸出mp4可播放,但將具有整個視頻長度的持續時間元數據,並且將在字節範圍完成後凍結屏幕剩餘的持續時間。

我還能如何採取一個字節範圍,並創建該流對象獨立.MP4文件?

的這個整點是避免下載整個10分鐘文件之前,我可以製成5第二夾子使用FFMPEG。如果我可以計算並下載字節範圍,應該有辦法將它寫入獨立的mp4文件。

在此先感謝您提供的任何幫助。

回答

6

MP4文件與箱結構。兩個主要的他們是的moov和的mdat(非片段MP4的一般的情況下)的:

  • moov框:包含其他框:) - 它們中的每包含關於存在於mdat框所編碼的數據(信息MOOV =關於MP4文件的元數據)。典型metadatas是持續時間,幀率,編解碼器的信息,參考視頻/音頻幀...
  • mdat箱:包含文件的實際編碼數據。它可以來自各種編解碼器,包括音頻和視頻數據(如果它恰好是其中只有一個)。對於H264,NAL單元包含在mdat框中。

MOOV盒是(應該是)在爲MP4文件的網絡傳遞文件的開頭,所以如果你寫一個0字節範圍請求,XX,你可能會得到整個影片包+一定量的mdat數據。因此該文件可以播放到某個點。如果你的字節範圍從YY到XX,你將不會得到一個像樣的moov盒子,但有很多mdat,因爲它們不能被使用,除非它們被重新包裝在一個帶有合適的moov盒子的MP4文件中,並引用關於「cut」mdat的信息。

可以從字節範圍區塊重新創建一個有效的MP4文件,但它需要MP4文件格式結構的高級知識(您還需要檢索moov盒以使其可以承受)。 MP4文件格式基於ISO base media file format - 這被指定爲ISO/IEC 14496-12(MPEG-4 Part 12)。

我知道2個庫,可以幫助做你想做的事:一個在PHPJava。我不知道這個lib是否存在node.js(我猜它可能會被移植)。即使你不使用它們,上面的2個庫也包含有關該主題的有價值的信息。

爲了提供一個回答你的問題,你可以用不同的角度解決這個問題。在毫秒內知道文件的哪一部分,你可以執行一個ffmpeg命令將全長MP4文件服務器端拼接成一個較小的文件,然後用這個新的較小的MP4文件做你需要的(因爲你不需要在客戶端上下載不必要的數據)。對於

ffmpeg的命令(在這種情況下,從文件的開頭1分鐘切):

ffmpeg -i input.mp4 -ss 00:00:00.000 -t 00:01:00.000 -c:a copy -c:v copy output.mp4 

看到這個職位上的above command line

這更多的信息是非常快的完成MP4文件結構只是重新組織,無需重新轉碼。

編輯:或者我可以在遠程文件上使用ffmpeg並在本地創建新的剪輯?

ffmpeg -ss 00:01:00.000 -i "http://myfile.mp4" -t 00:02:00.000 -c:a copy -c:v copy output.mp4 

假設你有ffmpeg的客戶端(應用程序/網絡)上,如果你運行上面的命令的ffmpeg將獲取的MP4到輸入網址,然後尋求將第1分鐘和削減2分鐘,從那裏這麼寫的生成的內容輸出.mp4 本地(當然沒有下載完整的文件)。

ffmpeg需要支持http protocol input(你會在大多數的二進制文件中找到)。您可以閱讀here以獲取有關放置-ss參數(優點/缺點)的更多信息。

+0

感謝您的回覆。我用ffmpeg命令看到的唯一問題是,我必須在我的服務器上擁有完整的視頻文件才能創建剪輯服務器端,然後再將一個單獨的mp4提供給客戶端。或者我可以在遠程文件上使用ffmpeg並在本地創建新的剪輯? – bevinlorenzo

+0

嗨,我在閱讀您的評論後更新了我的答案。我希望這能達到你所需要的。 –

+0

我能夠得到這個工作的遠程文件。非常感謝你的幫助。 – bevinlorenzo

相關問題