Я многого не понимаю:
- Журнал в моем приложении 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
Мобильная версия