Извлечение аудиокадров из файла AMR-NBJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Извлечение аудиокадров из файла AMR-NB

Сообщение Anonymous »

Я написал алгоритм для извлечения каждого кадра из файла AMR. Я считал первые 6 байт файла заголовком, а следующую информацию — аудиокадрами. Каждый аудиокадр состоит из заголовка кадра и аудиоданных. Заголовок кадра сообщает размер кадра в байтах (с использованием таблицы режимов CMR — https://web.archive.org/web/20110625112 ... AMR_format). Размер кадра хранится в первом байте кадра -> от второго до 5-го бита, считая старший бит первым битом.
Алгоритм не работает и я решил отобразить на экранирует каждый байт в двоичном виде (0 и 1), и оказывается, что иногда номер размера кадра больше 7, а таблица CMR имеет только значения 0...7.
Ниже это таблица CMR:

Код: Выделить всё

CMR      MODE        FRAME SIZE( in bytes )
0 AMR    4.75        13
1 AMR    5.15        14
2 AMR    5.9         16
3 AMR    6.7         18
4 AMR    7.4         20
5 AMR    7.95        21
6 AMR    10.2        27
7 AMR    12.2        32
и мой вывод (каждый байт из файла amr):

Код: Выделить всё

0 -> 0 0 0 0 0 0 0 0
1 -> 0 0 0 0 0 0 0 0
2 -> 0 0 0 0 0 0 0 0
3 -> 0 0 0 1 1 0 0 0
4 -> 0 1 1 0 0 1 1 0
5 -> 0 0 1 0 1 1 1 0
6 -> 1 0 0 1 1 1 1 0
7 -> 0 0 0 0 1 1 1 0
8 -> 1 1 0 0 1 1 0 0
9 -> 1 1 1 0 0 1 1 0
10 -> 0 0 0 0 1 1 1 0
11 -> 0 0 1 0 1 1 0 0
12 -> 0 0 0 0 0 0 0 0
13 -> 0 0 0 0 0 0 0 0
14 -> 0 0 0 0 0 0 0 0
15 -> 0 0 0 0 0 0 0 0
16 -> 1 0 0 1 0 1 1 0
17 -> 1 1 0 0 1 1 1 0
18 -> 1 1 1 1 0 1 1 0
19 -> 1 0 1 1 0 1 1 0
20 -> 1 1 0 0 1 1 0 0
21 -> 1 1 1 0 0 1 1 0
22 -> 0 0 0 0 1 1 1 0
23 -> 0 0 1 0 1 1 0 0
24 -> 0 0 0 0 0 0 0 0
25 -> 0 0 0 0 0 0 0 0
26 -> 0 1 0 0 0 0 0 0
27 -> 1 0 0 1 1 0 0 0
28 -> 1 0 1 1 0 1 1 0
29 -> 1 1 1 1 0 1 1 0
30 -> 1 1 1 1 0 1 1 0
31 -> 0 1 1 0 1 1 1 0
32 -> 0 0 0 0 0 0 0 0
33 -> 0 0 0 0 0 0 0 0
34 -> 0 0 0 0 0 0 0 0
35 -> 0 0 1 1 0 1 1 0
36 -> 1 0 1 1 0 1 1 0
37 -> 0 1 1 0 1 1 1 0
38 -> 0 0 0 1 0 1 1 0
39 -> 0 0 1 0 0 1 1 0
40 -> 0 0 0 0 0 0 0 0
Я взял байт номер 6: 10011110 -> 0011 — это номер 3, а соответствующее значение CMR для 3 — 18. Я пропускаю 18 байтов и дохожу до байта номер. 6+18 = 24: 00000000 — значение CMR для 0 равно 13, и я пропускаю еще 13 байт -> 24+13=37: 01101110 -> 1101 — это 13, ЧЕГО НЕТ В таблице CMRЧто я делаю не так? Я полагаю, что печать в двоичном формате правильна. Ниже приведен алгоритм чтения каждого кадра (не для отображения в двоичном виде):

Код: Выделить всё

private void displayNrOfFrames() throws Exception{
FileInputStream fis = null;

try {
fis = new FileInputStream(mFile);
long result = fis.skip(6);
if(result != 6){
throw new Exception("Could not skip first 6 bytes(header) of AMR.");
}

int number = 0;
int bit = 0;
byte b;
BitSet bs;
while((b = Integer.valueOf(fis.read()).byteValue()) != -1){
bs = Util.fromByte(b);
number = 0;
//convert bits [1..4] to number
for (int i = 1; i 

Подробнее здесь: [url]https://stackoverflow.com/questions/17489970/extract-audio-frames-from-amr-nb-file[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»