Как создать потоковый преобразователь uint16 в Dart

#dart #ffmpeg #stream #waveform #uint16

Вопрос:

Я пытаюсь получить форму сигнала из MP3-файла с помощью flutter_ffmpeg: ^0.4.2 .

Как рекомендуется здесь, я выполняю следующую команду:

-i songPath.mp3 -ac 1 -filter:a aresample=10 -map 0:a -c:a pcm_s16le -f data - songPath.waveform

Это создает двоичный файл с именем «songPath.waveform», который содержит 10 выборок в секунду, представленных 16-разрядными целыми числами. Мне нужно извлечь из этого двоичного файла a, List<int> чтобы легко нарисовать форму сигнала в моем приложении.

Есть какие-нибудь предложения? Это может закончиться чем-то вроде:

Stream<int> waveform = File("songPath.waveform").openRead().transform(uint16.decoder);

Сейчас я борюсь с чем-то вроде:

     Stream<int> waveform = File("songPath.waveform").openRead().transform(
      StreamTransformer<List<int>, int>.fromHandlers(
        handleData: (List<int> event, EventSink<int> output) {
          print("event: $event");
          ByteData bytes = ByteData.view(Uint64List.fromList(event).buffer);
          print("bytes: $bytes");
          int readSampleNumber = bytes.lengthInBytes~/16;
          print("readSampleNumber: ${bytes.lengthInBytes/16}");
          for (var i = 0; i <= readSampleNumber-1; i  ){
            output.add(bytes.getInt16(i));
          }
        }
      )