2016-12-01 70 views
1

目前我正在利用List-variable來存儲相機提供的BitmapSources,並藉助SharpAvi將它們保存爲AVI文件。在第二步中,我通過Nrecos ffmpeg wrapper編碼保存的文件以減小文件大小。最後,我刪除原始的AVI文件,只保留編碼的文件。將WPF BitmapSources另存爲h264編碼的視頻直接從內存中

對我來說,這似乎設計得不好,可能會導致應用程序運行在SSD上的有害寫週期(我可能會在未編碼視頻中每天創建高達TB的TB),這就是爲什麼我想改變它的原因到使用PC的RAM更集成的解決方案。然而,SharpAvi和Nreco都依賴創建和閱讀實際文件。 Nreco確實有接受流的ConvertLiveMedia方法 - 但是在我的實驗中,它並沒有創建文件,同時也沒有給出錯誤警告。

+0

是否可以使用相機作爲NReco ffmpeg包裝的輸入源?如果相機可以作爲DirectShow設備訪問,或者流由URL提供,則可以這樣做。這將是轉碼視頻並保存到文件的最有效方式。 –

+0

我不這麼認爲。特別是因爲我仍然需要能夠在Aforge中使用相機進行並行圖像分析併爲用戶提供實時預覽。通過我提供的解決方案,我認爲爲這個特定的用例提供了最好的選擇。 –

+1

如果您在C#(位圖對象)中將幀作爲圖像,則還可以使用ConvertLiveMedia方法(使用特殊的「raw_video」格式)將它們直接推送到ffmpeg輸入。 –

回答

1

好吧我想我解決了它: 我改變了SharpAvi代碼,以便AviWriter有一個額外的構造函數接受一個MemoryStream而不是一個字符串。然後將此MemoryStream傳遞給BinaryWriter,並且不創建FileStream。

此外,必須更改close方法,以便即使在BinaryWriter關閉時MemoryStream仍保持活動狀態。 fileWriter.Close被替換

if (fileWriter.BaseStream is MemoryStream) 
    fileWriter.Flush(); 
else 
    fileWriter.Close(); 

這讓我在我的主應用程序可用的MemoryStream。

memstream.Position = 0; //crucial or otherwise ffmpeg will not work 
var task = nrecoconverter.ConvertLiveMedia(memstream, "avi", filepath, "avi", settings); 
task.Start(); 
task.Wait(); 

編輯:SharpAvi已正式在github上更改爲允許現在使用Streams。

+0

現在我的問題是,我正在使用AviWriter MemoryStream方法,但我不確定如何讓NReco馬上進行轉換,而不是等待SharpAvi完成錄製。所以我在我的主錄音完成後我做了 'rec.Dispose(); byte [] file = File.ReadAllBytes(outfile);MemoryStream aStream = new MemoryStream(file); aStream.Position = 0; var task = conv.ConvertLiveMedia(aStream,「avi」,outfile,「mp4」,s); task.Start(); task.Wait();' –

+0

我不知道我明白你的問題是什麼。您顯然必須等待sharpavi完成才能將流傳遞給nreco(或ffmpeg),因爲它需要將整個文件表示爲整體。 –