Как воспроизвести аудиофайл m4a / aac, если фрагмент отсутствует?

У нас есть аудиофайл m4a, контейнер для аудио в кодировке AAC (поток контейнера - mpeg-4, аудиопоток - AAC).

Мы передаем этот файл частями (просто разбивая его случайным образом на нашем предельном размере и передавая эти байты) между двумя системами.

Если пьеса так и не была отправлена, как мне воссоздать ее, чтобы хотя бы часть из них можно было играть?

Что я обнаружил до сих пор, так это то, что если я разбиваю файл и отправляю его, я могу восстановить его, если у меня есть все части (конечно), но если я оставлю фрагмент, ни один звуковой инструмент не распознает его или не сможет воспроизвести его. .

Как правильно это сделать? Как m4a является потоковым форматом, если мне нужны все части?

Изменить: чтобы уточнить, мы записываем звук на ограниченных устройствах IoT и отправляем записи в облако для последующего воспроизведения. У нас максимальный размер загрузки 128 КБ. Изначально мы могли бы просто сохранить необработанный звук во множество небольших файлов m4a и просто загрузить их, но разве там нет потерь со всеми метаданными в каждом файле? Как будто мы хотим 30 секунд звука, но сохраняем это в 10 файлов m4a по 3 секунды вместо одного 30-секундного файла m4a, который мы разделяем?


person Fraggle    schedule 22.11.2017    source источник
comment
Вы используете UDP? Если вы используете TCP, почему бы вам не хватать частей?   -  person Alex K.    schedule 22.11.2017
comment
На самом деле используется mqtt, но это не имеет значения. Интернет может отключиться, и политика повторных попыток может завершиться ошибкой. Устройство, подключенное к LTE, которое может перемещаться и т. Д. В любом случае, часть может отсутствовать, или, по крайней мере, я хочу это учесть.   -  person Fraggle    schedule 22.11.2017
comment
Я тоже столкнулся с той же проблемой. Есть зацепки?   -  person Bhuvanendra Pratap Maurya    schedule 12.09.2019


Ответы (1)


Я бы извлек ваш поток AAC из вашего контейнера MPEG-4 (m4a) и поместил ваш AAC в ADTS (поток передачи аудиоданных). ADTS состоит из небольших кадров, и каждый кадр имеет заголовок, за которым следуют аудиоданные AAC (аналогично потоку MP3). ADTS является самосинхронизирующимся и рассчитан на потерю пакетов, например, для беспроводной передачи.

person Markus Schumann    schedule 22.11.2017
comment
Хорошо, не уверен, что мы можем сделать это на стороне клиента. У нас есть ограничения. Но я могу исследовать. Итак, вот ответ на мой первоначальный вопрос о воссоздании m4a с отсутствующим фрагментом: это невозможно, использовать другой формат кодировки / контейнера или сохранять каждый фрагмент как полный файл m4a? - person Fraggle; 23.11.2017
comment
Превращение вашего AAC / M4A в ADTS - вам не нужно перекодировать. - person Markus Schumann; 23.11.2017
comment
@Fraggle Вы не делаете это на стороне клиента, вы делаете это на стороне сервера. Без чего-то вроде ADTS вы не сможете произвольно пересобрать поток. - person Brad; 23.11.2017
comment
Пропустить случайные байты из mp4 / m4a сложно. Ваш файл может быть ‹MOOV› ‹MDAT› (таблица с образцами, за которой следуют образцы) или ‹MDAT› ‹MOOV› (за образцами следует таблица с образцами). Если вы потеряете какие-либо байты из выборочной таблицы - восстановление будет довольно сложным и нет избыточности. Потеря известного количества байтов выборки может быть восстановлена. Попробую поставить нули. Если ваш файл - ‹MOOV› ‹MDAT›, вы можете воспроизвести усеченный файл - большинство игроков это сделают. - person Markus Schumann; 23.11.2017