[英]Copying offset to offset from file in C#
我有一堆非常大的視頻文件(.ts),范圍從3GB到10GB。 他們中的許多人都有特定的錯誤,我的解決方案是簡單地剪掉包含錯誤的部分。 我知道要保留的零件的開始和結束偏移量,我希望簡單地讀入主文件,然后將start_offset復制到end_offset並復制到同一文件夾中的新文件中。
例如,我有主視頻MAIN.ts,它是5.5GB。 假設它有兩個錯誤。 我想保持偏移量(十進制,而不是十六進制)0到1174698823(錯誤開始之前的字節)並將其保存到新文件PART1.ts中。 然后,我要通過偏移量4126897791(第二個錯誤開始)保留偏移量1257553244(錯誤結束后的字節)並將其另存為PART2.ts。 然后,我需要通過文件末尾將偏移量4207333028保存為PART3.ts。 基本上,我只剪切了大約155MB的文件,並將其分為三部分。 如果我實際上可以在不創建多個新文件的情況下進行剪切,而是在我進行操作時將它們彼此附加, 然后編寫整個新文件,那將是一個額外的收獲(或者以后可以使用copy /b
)。
我一直在研究文件流和字節數組,我知道2GB的限制。 我該如何解決這個問題,然后如果我要保留的塊的長度大於2GB,我該如何寫呢? 我不確定如何使用有限長度的緩沖區來做到這一點。 如果可能的話,我也想有一個進度條,以顯示已寫的內容。
任何幫助,將不勝感激。
您絕對不需要創建新文件。 您只需打開輸出文件一次,然后打開輸入文件一次,然后通過在輸入文件中查找來追加塊,然后將一個部分從輸入流復制到輸出流,然后再移至下一部分。
using (var output = File.Create("output.ts"))
using (var input = File.OpenRead("input.ts"))
{
AppendChunk(output, input, 0, 1174698823L);
AppendChunk(output, input, 1257553244L, 4126897791L);
}
...
private static void AppendChunk(Stream output, Stream input,
long start, long end)
{
// TODO: Argument validation
long size = end - start;
byte[] buffer = new byte[32 * 1024]; // Copy 32K at a time
input.Position = start;
while (size > 0)
{
int bytesRead = input.Read(buffer, 0, Math.Min(size, buffer.Length));
if (bytesRead <= 0)
{
throw new EndOfStreamException("Not enough data");
}
output.Write(buffer, 0, bytesRead);
size -= bytesRead;
}
}
要集成進度條,您需要預先計算要復制的總大小,然后在循環中增加到目前為止已復制的總大小,然后以這種方式更新進度條。 不要忘記,如果這是在WinForms或WPF中,則不應在UI線程上進行任何IO工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.