2013-07-03 3 views
0

Кто-нибудь знает, как получить продолжительность AMR-файла? С уважением, я не очень много знаю о кодировании AMR.android - запрограммировать длительность аудиофайла AMR

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

Я хочу, чтобы получить длительность файла после остановки записи без создания каких-либо MediaPlayer и получить длительность от него. Для обычного файла Wav я просто сделать это:

fileLength/byteRate 

но АСКУЭ я не знаю byteRate, и я не уверен, что это будет нормально, хотя, так как WAV является необработанных данных PCM (несжатый) и AMR является сжат.

ответ

5

Возможно, контейнер 3GP содержит информацию о длине содержимого? 3GPP file format spec доступен, если вы хотите его прочитать.


Для исходного файла .amr вы должны пройти все кадры, чтобы найти длину аудио, так как каждый кадр может быть закодирован с различным битрейтом.

Процесс для этого будет:

  • Пропустить первые 6 байт файла (AMR подпись).

  • Остальная часть файла будет звуковыми кадрами, каждый из которых начинается с однобайтового заголовка. Прочитайте этот байт и посмотрите на биты 3..6 (режим кодека). Для AMR-NB допустимые режимы кодеков равны 0..7, которые можно сопоставить с размером кадра в байтах, используя приведенную ниже таблицу.

  • Как только вы знаете размер текущего кадра, пропустите его и проанализируйте следующий кадр. Повторяйте, пока не дойдете до конца файла.

Если вы подсчитывали количество кадров в файле вы можете умножить это число на 20, чтобы получить длину аудио в миллисекундах.

Типоразмер стол:

 
Codec mode Frame size 
---------------------- 
0    13 
1    14 
2    16 
3    18 
4    20 
5    21 
6    27 
7    32 

(Source)

+0

Спасибо за ваш ответ, он мне очень помогает. Думаю, я могу даже добавить 2 amr-файлы, просто получив все байты, начиная с 7-го из файла, и привяжу их к концу второго. Просто добавление фреймов ... Я блуждаю, если я должен что-то изменить в заголовок прикрепленного файла, но я думаю, что нет ... –

+1

Заголовок файла должен быть просто сигнатурой, идентифицирующей содержимое как данные AMR-NB, поэтому конкатенация должна работать так вы описали его. Однако я его не тестировал сам. – Michael