Не удалось передать звук с помощью flutter_sound через сервер nodejs сокета.ioAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Не удалось передать звук с помощью flutter_sound через сервер nodejs сокета.io

Сообщение Anonymous »

Прежде всего, я пытаюсь сделать как приложение для рации, я сначала устанавливаю соединения с сервером NodeJS через сокет.io, соединение работает, но проблема с передачей звука, у меня есть напечатал много информации на сервере узла и в приложении Flutter, чтобы увидеть, передаю и получаю ли я информацию, и на самом деле я передаю и получаю, но в момент воспроизведения звука он ничего не делает.
Я многого не понимаю:
  • Журнал в моем приложении Flutter, когда я получаю аудио, повторяет множество процессов.
    Аудио не воспроизводится или не звучит на моем устройстве
    Нужно ли сохранять аудиофайл на устройстве для его воспроизведения?
Это мой флаттер-код:

Код: Выделить всё

import 'package:flutter/material.dart';
import 'package:socket_io_client/socket_io_client.dart' as IO;
import 'package:flutter_sound/flutter_sound.dart';
import 'package:permission_handler/permission_handler.dart';
import 'dart:async';
import 'dart:typed_data';

class Index extends StatefulWidget {
const Index({super.key});

@override
State createState() => _IndexState();
}

class _IndexState extends State {
late IO.Socket socket;
FlutterSoundRecorder? _audioRecorder;
FlutterSoundPlayer? _audioPlayer;
bool _isRecording = false;
final StreamController _audioStreamController =
StreamController();

@override
void initState() {
super.initState();
_initSocket();
_initAudioRecorder();
_initAudioPlayer();

_audioStreamController.stream.listen((data) {
print('Audio length: ${data.length}');
if (socket.connected) {
socket.emit('audio', data);
}
});
}

void _initSocket() {
socket = IO.io(
'http://Server',
{
'transports': ['websocket'],
'autoConnect': true,
},
);

socket.onConnect((_) {
print('Connected to Server');
});

socket.onConnectError((err) {
print('Failed to connect: $err');
});

socket.onDisconnect((_) {
print('Disconnected from server');
});

socket.on('audio', (data) async {
try {
if (_audioPlayer != null && _audioPlayer!.isOpen()) {
if (_audioPlayer?.isPlaying ?? false) {
await _audioPlayer?.stopPlayer();
}
await _audioPlayer?.startPlayer(
fromDataBuffer: Uint8List.fromList(data),
codec: Codec.pcm16,
whenFinished: () {
print("Transmission ended");
},
);
print("Correct audio transmission, length: ${data.length}");
} else {
print('Error: The player is not open.');
}
} catch (e) {
print('Error Transmitting the audio: $e');
}
});
}

Future _initAudioRecorder() async {
_audioRecorder = FlutterSoundRecorder();

if (await Permission.microphone.request().isGranted) {
try {
await _audioRecorder!.openRecorder();
await _audioRecorder!
.setSubscriptionDuration(Duration(milliseconds: 40));
print('Recorder opened.');
} catch (e) {
print('Error.  Failed to open recorder: $e');
}
} else {
print("Microphone permission denied");
}
}

Future _initAudioPlayer() async {
_audioPlayer = FlutterSoundPlayer();
await _audioPlayer!.openPlayer();

if (_audioPlayer!.isOpen()) {
await _audioPlayer!.setSubscriptionDuration(Duration(milliseconds: 40));
} else {
print('Error: The player could not be opened.');
}
}

Future _startRecording() async {
if (_audioRecorder != null) {
try {
await _audioRecorder!.startRecorder(
codec: Codec.pcm16,
toStream: _audioStreamController.sink,
);

setState(() {
_isRecording = true;
});
} catch (e) {
print("Error at starting the recorder: $e");
}
} else {
print("Error: The recorder is not started.");
}
}

Future _stopRecording() async {
await _audioRecorder!.stopRecorder();
setState(() {
_isRecording = false;
});
}

@override
void dispose() {
socket.dispose();
_audioRecorder?.closeRecorder();
_audioPlayer?.closePlayer();
_audioStreamController.close();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Audio Transmission'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
if (_isRecording) {
_stopRecording();
} else {
_startRecording();
}
},
child: Text(
_isRecording ? 'Stop transmission' : 'Start transmission'),
),
),
);
}
}

Это код с моего сервера узла:

Код: Выделить всё

const { Socket } = require('dgram');
const express = require('express');
const app = express();
const http = require('http').createServer(app);
const port = process.env.PORT || 9002;
const path = require('path')
const io = require('socket.io')(http);

http.listen(port, () => {
console.log(`Server listening on port: ${port}`);
});

io.on('connection', (socket) => {
console.log('New connected client');

socket.on('message', (data) => {
console.log('Message received:', data);

socket.emit('response', `Server received: ${data}`);
});

socket.on('audio', (audioData) => {
console.log('Received audio length: ' + audioData.length);
socket.broadcast.emit('audio', audioData);
});

socket.on('disconnect', () => {
console.log('Client disconnected');
});
});

Со стороны сервера меня бы это не беспокоило, но я думаю, что проблема в флаттере.
Я пытался решить эту проблему с помощью ChatGPT, но застрял с этой проблемой, я действительно разрабатывал это приложение с помощью ChatGPT, потому что я не знаю флаттера.
Я пытался сменить аудиокодек с pcm16 на aac или opus, но решил теперь использовать pcm16, потому что я даже не знаю разницы, и нужно ли сохранять аудиофайл на приемнике или отправителе mi
также я не знаю, должна ли длина файла быть одинаковой на сервере узла Я получаю длину данных от 480, 640 и видел 1200 думаю. ChatGpt мне сказал, что это зависит от кодека, я не знаю.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ejs-server
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»