Я изучаю visual basic .net, и я пытаюсь перевести некоторый исходный код java в проект vb.net. Проект читает детали mp3, а затем точно разбивает файл в соответствии с деталями фрейммера и т. Д.Чтение MP3 Frameheader - присвоение значений бит переменным
Мой вопрос связан с чтением заголовка кадра mp3-файлов. Я понимаю, что детали фрейма содержатся в первых 4 (32-битных) байтах кадра, а некоторые биты представляют определенные значения, как описано здесь: http://www.mp3-tech.org/programmer/frame_header.html
Использование FileStream Я смог прочитать эти данные и отобразить их в двоичный код в текстовом поле.
Я ищу помощь по чтению бит и присвоению их переменным в моем классе. Я не уверен, что было бы правильной процедурой для этого, поскольку некоторые значения равны 1, 2 или 4 битам, например. бит 19-20 = тип MpegType, бит 12-15 = биттрестэкдекс, бит 9 = заполнение и т. д.
Я смотрел аналогичные проекты, доступные на codeproject.com, но я не понимаю, как они достигли вышеуказанного.
Любая помощь очень ценится.
EDIT:
Вот основной югу до сих пор, я не включил код, объявляя переменные и свойства и т.д.
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 бит для значения синхронизации. Прочитать бит 13 для значения mpegID. Читайте бит 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;
}
}
Опубликуйте свой исходный код Java и VB, и я верю, что кто-то придумает что-то для вас. –
Добавлен мой текущий код и дополнительная информация. – mheptinstall
Добавлен ответ. –