0

3GB から 10GB までの非常に大きなビデオ ファイル (.ts) がたくさんあります。それらの多くには特定のエラーがあり、私の解決策は、エラーを含む部分を単純に切り取ることです. 保持したい部分の開始オフセットと終了オフセットを知っていたので、メイン ファイルを読み込んで、start_offset から end_offset までを同じフォルダー内の新しいファイルにコピーしたいと考えていました。

たとえば、5.5GB のメイン ビデオ MAIN.ts があります。これらのエラーが2つあるとしましょう。0 ~ 1174698823 (エラーが始まる前のバイト) のオフセット (16 進数ではなく 10 進数) を保持し、それを新しいファイル PART1.ts に保存します。次に、オフセット 1257553244 (エラー終了後のバイト) からオフセット 4126897791 (2 回目のエラー開始) までを維持し、それを PART2.ts として保存します。次に、オフセット 4207333028 からファイルの末尾までを PART3.ts として保存する必要があります。基本的に、約 155MB のファイルを切り取り、3 つの部分に分割しました。複数の新しいファイルを作成せずに実際にカットを行い、代わりにそれらを相互に追加してから、新しいファイル全体を書き込むことができれば、それはボーナスになります (または、後で使用することもできます)copy /b

私はファイルストリームとバイト配列を調べていて、2GB の制限について知っています。これを回避するにはどうすればよいですか? また、保持しようとしているチャンクの長さが 2GB を超える場合、どのように書き込むのですか? これを行うために長さが制限されたバッファーを使用する方法がわかりません。可能であれば、どれだけ書かれたかを示す進行状況バーも表示したいと思います。

どんな助けでも大歓迎です。

4

1 に答える 1

5

新しいファイルを作成する必要はありません。出力ファイルを 1 回開き、入力ファイルを 1 回開き、入力ファイルをシークしてチャンクを追加し、入力ストリームから出力ストリームに 1 つのセクションをコピーしてから、次のセクションに進むことができます。

 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 作業を行うべきではないことを忘れないでください。

于 2013-02-16T08:30:18.663 に答える