0

オーディオ データを既存の ac3 ファイルに挿入できるようにする必要があります。AC3 ファイルは非常にシンプルで、ヘッダーなどを削除することなく相互に追加できます。私が抱えている問題は、ac3 ファイルのチャンクを追加/上書き/消去する場合、32 ミリ秒単位で実行する必要があり、各 32 ミリ秒は 1536 バイトのデータに等しいということです。したがって、データ チャンク (先ほど言ったように 1536 バイトでなければなりません) を挿入するときは、1536 で割り切れる最も近いオフセット (0、1536 (0x600)、3072 (0xC00) など) を見つける必要があります。私がそれを理解できるとしましょう。特定のオフセットで特定の文字を変更することについて読んだことがありますが、その 1536 バイトのデータ チャンク全体を挿入する (上書きしない) 必要があります。開始オフセットと 1536 バイトのデータ チャンクが与えられた場合、C# でこれを行うにはどうすればよいでしょうか?

編集: 挿入したいデータ チャンクは、基本的に 32 ミリ秒の無音であり、16 進、ASCII、および ANSI テキストの翻訳があります。もちろん、このチャンクを複数回挿入して、たとえば 32 ミリ秒ではなく 128 ミリ秒の無音を取得することもできます。

4

2 に答える 2

0
byte[] filbyte=File.ReadAllBytes(@"C:\abc.ac3");
byte[] tobeinserted=;//allocate in your way using encoding whatever

byte[] total=new byte[filebyte.Length+tobeinserted.Length];

for(int i=0;int j=0;i<total.Length;)
{
   if(i==1536*pos)//make pos your choice
   { 
     while(j<tobeinserted.Length) 
       total[i++]=tobeinserted[j++];
   }
   else{total[i++]=filbyte[i-j];}
}

File.WriteAllBytes(@"C:\abc.ac3",total);
于 2012-08-25T11:29:13.270 に答える
0

必要なことを行うヘルパーメソッドは次のとおりです。

public static void Insert(string filepath, int insertOffset, Stream dataToInsert)
{
    var newFilePath = filepath + ".tmp";
    using (var source = File.OpenRead(filepath))
    using (var destination = File.OpenWrite(newFilePath))
    {
        CopyTo(source, destination, insertOffset);// first copy the data before insert
        dataToInsert.CopyTo(destination);// write data that needs to be inserted:
        CopyTo(source, destination, (int)(source.Length - insertOffset)); // copy remaining data
    }

    // delete old file and rename new one:
    File.Delete(filepath);
    File.Move(newFilePath, filepath);
}

private static void CopyTo(Stream source, Stream destination, int count)
{
    const int bufferSize = 32 * 1024;
    var buffer = new byte[bufferSize];

    var remaining = count;
    while (remaining > 0)
    {
        var toCopy = remaining > bufferSize ? bufferSize : remaining;
        var actualRead = source.Read(buffer, 0, toCopy);

        destination.Write(buffer, 0, actualRead);
        remaining -= actualRead;
    }
}

そして、ここに使用例を含む NUnit テストがあります。

[Test]
public void TestInsert()
{
    var originalString = "some original text";
    var insertString = "_ INSERTED TEXT _";
    var insertOffset = 8;

    var file = @"c:\someTextFile.txt";

    if (File.Exists(file))
        File.Delete(file);

    using (var originalData = new MemoryStream(Encoding.ASCII.GetBytes(originalString)))
    using (var f = File.OpenWrite(file))
        originalData.CopyTo(f);

    using (var dataToInsert = new MemoryStream(Encoding.ASCII.GetBytes(insertString)))
        Insert(file, insertOffset, dataToInsert);

    var expectedText = originalString.Insert(insertOffset, insertString);

    var actualText = File.ReadAllText(file);
    Assert.That(actualText, Is.EqualTo(expectedText));
}

コードをわかりやすくするためにいくつかのチェックを削除したことに注意してください。null、ファイル アクセス許可、およびファイル サイズをチェックすることを忘れないでください。たとえばinsertOffset、ファイルの長さよりも大きくなる可能性があります。この条件はここではチェックされません。

于 2012-08-25T12:59:22.327 に答える