Невозможно преобразовать массив байтов в аудио файл AA C - PullRequest
2 голосов
/ 23 апреля 2020

Я пытаюсь найти решение для записи моего байтового массива в воспроизводимый аудиофайл AA C.

С внешнего интерфейса я кодирую свои .aac аудиофайлы в виде списка UInt8List и отправив его на мой сервер Spring-Boot. Затем я могу преобразовать их в правильный байтовый массив, где я затем пытаюсь записать его обратно в файл .aac, как показано ниже:

public void writeToAudioFile(ArrayList<Double> audioData) {
    byte[] byteArray = new byte[1024];

    Iterator<Double> iterator = audioData.iterator();

    System.out.println(byteArray);

    while (iterator.hasNext()) {
      // for some reason my list came in as a list of doubles
      // so I am making sure to get these values back to an int
      Integer i = iterator.next().intValue();
      byteArray[i] = i.byteValue();
    }
    try {
      File someFile = new File("test.aac");
      FileOutputStream fos = new FileOutputStream(someFile);
      fos.write(byteArray);
      fos.flush();
      fos.close();

      System.out.println("File created");
    } catch (Exception e) {
      // TODO: handle exception
      System.out.println("Error: " + e);
    }

Я могу записать свой байтовый массив обратно в аудио файл, однако, он не воспроизводится. Поэтому мне интересно, возможен ли такой подход и есть ли моя проблема в списке Java.

Я проводил посторонние исследования и думаю, что мне нужно как-то сказать, что этот файл является типом медиа-файла. Или, возможно, закодированный аудиофайл поврежден на моем сервере.

1 Ответ

1 голос
/ 24 апреля 2020

Ваше преобразование l oop

while (iterator.hasNext()) {
  // for some reason my list came in as a list of doubles
  // so I am making sure to get these values back to an int
  Integer i = iterator.next().intValue();
  byteArray[i] = i.byteValue();
 }

получает значение i от итератора, а затем пытается записать его в позиции i в byteArray, какой тип беспорядка ваши аудио байты странным образом.

Рабочая функция, которая преобразует List<Double> в byte[], будет выглядеть примерно так

byte[] inputToBytes(List<Double> audioData) {
  byte[] result = new byte[audioData.size()];
  for (int i = 0; i < audioData.size(); i++) {
    result[i] = audioData.get(i).byteValue();
  }
  return result;
}

, тогда вы можете использовать ее в writeToAudioFile() :

void writeToAudioFile(ArrayList<Double> audioData) {
  try (FileOutputStream fos = new FileOutputStream("test.aac")) {
    fos.write(inputToBytes(audioData));
    System.out.println("File created");
  } catch (Exception e) {
    // TODO: handle exception
    System.out.println("Error: " + e);
  }
}

Это, безусловно, создает воспроизводимый файл, если у вас есть действительные байты в audioData. Содержимое и расширение должны быть достаточными для того, чтобы ОС / проигрыватель распознал формат.

Если это не сработает, я посмотрю полученные данные, чтобы убедиться, что они верны.

...