簡體   English   中英

僅音頻播放列表中的聲音<int>原始數據</int>

[英]Just Audio play sound from a List<int> of raw data

我正在嘗試從 Flutter 中的 stream 字節播放音頻。我使用了 Just Audio 包的示例來讀取 stream 字節,但我仍然遇到錯誤。 錯誤是:

Playback error
E/ExoPlayerImplInternal(19173):   com.google.android.exoplayer2.ExoPlaybackException: Source error
E/ExoPlayerImplInternal(19173):       at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:632)
E/ExoPlayerImplInternal(19173):       at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:602)
E/ExoPlayerImplInternal(19173):       at android.os.Handler.dispatchMessage(Handler.java:98)
E/ExoPlayerImplInternal(19173):       at android.os.Looper.loop(Looper.java:154)
E/ExoPlayerImplInternal(19173):       at android.os.HandlerThread.run(HandlerThread.java:61)
E/ExoPlayerImplInternal(19173):   Caused by: com.google.android.exoplayer2.source.UnrecognizedInputFormatException: None of the available extractors (Mp3Extractor, FlvExtractor, FlacExtractor, WavExtractor, FragmentedMp4Extractor, Mp4Extractor, AmrExtractor, PsExtractor, OggExtractor, TsExtractor, MatroskaExtractor, AdtsExtractor, Ac3Extractor, Ac4Extractor, AviExtractor, JpegExtractor) could read the stream.
E/ExoPlayerImplInternal(19173):       at com.google.android.exoplayer2.source.BundledExtractorsAdapter.init(BundledExtractorsAdapter.java:92)
E/ExoPlayerImplInternal(19173):       at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1017)
E/ExoPlayerImplInternal(19173):       at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:412)
E/ExoPlayerImplInternal(19173):       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
E/ExoPlayerImplInternal(19173):       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
E/ExoPlayerImplInternal(19173):       at java.lang.Thread.run(Thread.java:762)
E/AudioPlayer(19173): TYPE_SOURCE: None of the available extractors (Mp3Extractor, FlvExtractor, FlacExtractor, WavExtractor, FragmentedMp4Extractor, Mp4Extractor, AmrExtractor, PsExtractor, OggExtractor, TsExtractor, MatroskaExtractor, AdtsExtractor, Ac3Extractor, Ac4Extractor, AviExtractor, JpegExtractor) could read the stream.

我可以看到輸入格式有問題。 但是,我只是不確定它是什么。 這是應該執行播放的代碼:

void initAudio() async {
    final server = await ServerSocket.bind(InternetAddress.anyIPv4, port);
    final player = AudioPlayer();
    final session = await AudioSession.instance;
    await session.configure(const AudioSessionConfiguration.speech());
    await session.setActive(true);
    server.listen((socket) {
      // event is a socket
      socket.listen((Uint8List data) async {
        print(data);
        player.setAudioSource(MyCustomSource(data), preload: false);
        player.play();
      });
    });
  }

MyCustomSource來自 Just Audio pub.dev 清單,它看起來像這樣:

// Feed your own stream of bytes into the player
class MyCustomSource extends StreamAudioSource {
  final List<int> bytes;
  MyCustomSource(this.bytes);

  @override
  Future<StreamAudioResponse> request([int? start, int? end]) async {
    start ??= 0;
    end ??= bytes.length;
    return StreamAudioResponse(
      sourceLength: bytes.length,
      contentLength: end - start,
      offset: start,
      stream: Stream.value(bytes.sublist(start, end)),
      contentType: 'audio/mpeg',
    );
  }
}

我正在嘗試通過套接字將Stream<List<int>>通過 inte.net 發送到 stream 音頻。 這是音頻發送端:

void recordAudio() async {
    print("recording and sampling");
    final socket = await Socket.connect(a5atHome, port);
    Stream<Uint8List>? stream = await MicStream.microphone(sampleRate: 44100);
    socket.addStream(stream!);

    StreamSubscription<List<int>> listener = stream.listen((samples) async {
      print(samples);
    });
  }

我也不確定發送方是否有問題。 我剛開始使用 JustAudio,我不確定錯誤來自何處。 任何幫助將不勝感激。

編輯:順便說一句,我正在使用mic_stream pub.dev package 以 Stream 的形式獲取麥克風數據

最終想通了。 感謝 Ryan Heise 為我指明了正確的方向。

MicStream package 以原始 PCM 格式記錄音頻數據,所以我需要找到一個也可以播放這種格式音頻的 package。 這個答案中,我發現有人想做完全相同的事情——基本上是從音頻數據List<int>中播放音頻。

根據其他答案,名為flutter_sound的 package 能夠為我做到這一點。

發送方:

final socket = await Socket.connect(a5atHome, port);

Stream<Uint8List>? stream = await MicStream.microphone(
        sampleRate: 44100, audioFormat: AudioFormat.ENCODING_PCM_16BIT);
await socket.addStream(stream!);

和播放方面,需要修復:

FlutterSoundPlayer player = FlutterSoundPlayer();

final server = await ServerSocket.bind(InternetAddress.anyIPv4, port);

final session = await AudioSession.instance;
await session.configure(const AudioSessionConfiguration.speech());
await session.setActive(true);
await player.openPlayer(enableVoiceProcessing: true);
server.listen((socket) async {
   await player.startPlayerFromStream(
        codec: Codec.pcm16, numChannels: 1, sampleRate: 44100);
   socket.listen((Uint8List data) async {
     player.foodSink!.add(FoodData(data));
   });
 });

MicStreamENCODING_PCM_16BITflutter_soundCodec.pcm16格式相同。 格式匹配,聲音播放!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM