0

Visual Basic .netを学習していて、Javaソースコードをvb.netプロジェクトに変換しようとしています。プロジェクトはmp3の詳細を読み取り、フレームヘッダーの詳細などに従ってファイルを正確に分割します。

私の質問は、mp3ファイルのフレームヘッダーの読み取りに関するものです。フレームの詳細はフレームの最初の4(32ビット)バイトに含まれ、特定のビットはここで詳しく説明されているように特定の値を表すことを理解しています:http ://www.mp3-tech.org/programmer/frame_header.html

FileStreamを使用して、このデータを読み取り、テキストボックス内にバイナリで表示することができました。

ビットを読み取り、クラス内の変数に割り当てるためのヘルプを探しています。長さが1、2、または4ビットの値として、これを行うための正しい手順がわかりません。たとえば、ビット19〜20 = MpegType、ビット12〜15 = BitrateIndex、ビット9=パディングなどです。

codeproject.comで入手できる同様のプロジェクトを見てきましたが、それらが上記をどのように達成したのかわかりません。

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

編集:

これがこれまでのメインサブです。変数やプロパティなどを宣言するコードは含まれていません。

Public Sub decode()
    Dim fs As FileStream
    Dim bytes(3) As Byte
    fs = New FileStream(mFilename, FileMode.Open, FileAccess.Read)

    If fs.CanRead Then
        fs.Read(bytes, 0, bytes.Length)
        For i As Integer = 0 To bytes.Length - 1
            Form1.RichTextBox.Text += Convert.ToString(bytes(i), 2).PadLeft(8, "0"c) & vbCrLf
        Next
        fs.Close()
        fs.Dispose()
    Else
        MsgBox("File CANNOT be read!!!")
    End If
End Sub

これを実行すると、リッチテキストボックスの出力は次のようになります。

11111111
11111010
10110011
01001100

これらのビットを読み、変数に適切な値を割り当てたいと思います。

同期値の最初の12ビットを読み取ります。mpegID値のビット13を読み取ります。layerID値などのビット14と15を読み取ります。

それがより明確になることを願っています。

Javaコードは次のとおりです。

public FrameHeader() {
    this.header32 = 0;
    valid = false;
}

public FrameHeader(int header32) {
    this.header32 = header32;
    decode();
}

public void setHeader32(int header32) {
    this.header32 = header32;
    decode();
}

private void decode() {
    mpegID = (header32 >> 19) & 3;
    layerID = (header32 >> 17) & 3;
    crc16used = (header32 & 0x00010000) == 0;
    bitrateIndex = (header32 >> 12) & 0xF;
    samplingrateIndex = (header32 >> 10) & 3;
    padding = (header32 & 0x00000200) != 0;
    privateBitSet = (header32 & 0x00000100) != 0;
    mode = (header32 >> 6) & 3;
    modeExtension = (header32 >> 4) & 3;
    copyrighted = (header32 & 0x00000008) != 0;
    original = (header32 & 0x00000004) == 0; // bit set -> copy
    emphasis = header32 & 3;
    valid = (mpegID != ILLEGAL_MPEG_ID) && (layerID != ILLEGAL_LAYER_ID) && (bitrateIndex != 0)
            && (bitrateIndex != 15) && (samplingrateIndex != ILLEGAL_SR);
    if (valid) {
        samplingrateHz = SAMPLING_RATES[samplingrateIndex];
        if (mpegID == MPEG2_ID)
            samplingrateHz >>= 1; // 16,22,48 kHz
        if (mpegID == MPEG25_ID)
            samplingrateHz >>= 2; // 8,11,24 kHz
        channels = (mode == MODE_MONO) ? 1 : 2;
        bitrateKBPS = BITRATE_MAP[mpegID][layerID][bitrateIndex];
        if (layerID == LAYER1_ID) {
            // layer 1: always 384 samples/frame and 4byte-slots
            samplesPerFrame = 384;
            bytesPerSlot = 4;
        }
        else {
            // layer 2: always 1152 samples/frame
            // layer 3: MPEG1: 1152 samples/frame, MPEG2/2.5: 576
            // samples/frame
            samplesPerFrame = ((mpegID == MPEG1_ID) || (layerID == LAYER2_ID)) ? 1152 : 576;
            bytesPerSlot = 1;
        }
        frameSize = ((bitrateKBPS * 125) * samplesPerFrame) / samplingrateHz;
        if (bytesPerSlot > 1)
            frameSize -= frameSize % bytesPerSlot;
        if (padding)
            frameSize += bytesPerSlot;
    }
}
4

2 に答える 2

0

フレームの詳細な説明と、フレームの最初の4バイトであるヘッダーにデータがどのように保持されるかについての式を次に示しますあなたが何を達成しようとしているのかわかりませんが、念のため、ここに行きます。車輪の再発明には意味がありません。

.Netには、ビットを格納するために使用するBitArrayというクラスがあります。

于 2011-12-21T05:46:23.460 に答える
0

関数を使用してビットを文字列に変換する同様のプロジェクトに出くわしました。このコードを、バイナリ文字列を整数に変更した別の例と組み合わせました。別の方法について聞きたいですか?

Public Function BinaryToInteger(ByVal objBitArray As BitArray, ByVal intStart As Integer, ByVal intEnd As Integer) As Integer

    Dim BinaryString As String
    Dim BinaryNum As Integer
    Dim BitCount As Short

    BinaryString = ""

    For i As Integer = intStart To intEnd
        BinaryString &= IIf(objBitArray.Item(i), "1", "0")
    Next

    For BitCount = 1 To Len(BinaryString)
        BinaryNum = BinaryNum + (CDbl(Mid(BinaryString, Len(BinaryString) - BitCount + 1, 1)) * (2 ^ (BitCount - 1)))
    Next BitCount

    BinaryToInteger = BinaryNum

End Function
于 2011-12-21T20:38:02.940 に答える