Flutter音频流处理插件flutter_audio_streaming的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter音频流处理插件flutter_audio_streaming的使用

flutter_audio_streaming 是一个用于通过RTMP录制或流式传输音频的 Flutter 插件。

开始使用

对于 Android 平台,我使用了 rtmp-rtsp-stream-client-java。对于 iOS 平台,我使用了 HaishinKit.swift

功能特性

  • 推送 RTMP 音频
  • 录制音频(开发模式)

安装

首先,在你的 pubspec.yaml 文件中添加 flutter_audio_streaming 作为依赖项。

iOS 配置

ios/Runner/Info.plist 文件中添加两行:

  • 一行带有键 Privacy - Camera Usage Description 和描述。
  • 另一行带有键 Privacy - Microphone Usage Description 和描述。

或者以文本格式添加以下键:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
<key>UIBackgroundModes</key>
<array>
    <string>processing</string>
</array>
<key>NSMicrophoneUsageDescription</key>
<string>App requires access to the microphone for live streaming feature.</string>

Android 配置

android/app/build.gradle 文件中将最小 Android SDK 版本改为 21 或更高版本:

minSdkVersion 21

还需要在打包选项中排除一个文件,否则 Gradle 在构建时会报错:

packagingOptions {
   exclude 'project.clj'
}

示例代码

以下是完整的示例代码,展示了如何使用 flutter_audio_streaming 插件进行音频流处理。

import 'package:flutter/material.dart';

import 'streaming.dart';
import 'streaming_and_record.dart';

Future<void> main() async {
  runApp(App());
}

class App extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Home(),
    );
  }
}

class Home extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        body: Center(
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          ElevatedButton(
              onPressed: () {},
              child: Row(
                mainAxisSize: MainAxisSize.min,
                children: [
                  Icon(Icons.multitrack_audio_outlined),
                  const SizedBox(
                    width: 4,
                  ),
                  Text(
                    "Recording",
                    style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
                  )
                ],
              )),
          const SizedBox(
            height: 24,
          ),
          ElevatedButton(
              onPressed: () => Navigator.push(context,
                  MaterialPageRoute(builder: (_) => StreamingExample())),
              child: Row(
                mainAxisSize: MainAxisSize.min,
                children: [
                  Icon(Icons.audiotrack_rounded),
                  const SizedBox(
                    width: 4,
                  ),
                  Text(
                    "Streaming",
                    style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
                  )
                ],
              )),
          const SizedBox(
            height: 24,
          ),
          ElevatedButton(
              onPressed: () => Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (_) => StreamingAndRecordExample())),
              child: Row(
                mainAxisSize: MainAxisSize.min,
                children: [
                  Icon(Icons.audiotrack_rounded),
                  Icon(Icons.multitrack_audio_outlined),
                  const SizedBox(
                    width: 4,
                  ),
                  Text(
                    "Streaming And Record",
                    style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
                  )
                ],
              ))
        ],
      ),
    ));
  }
}

更多关于Flutter音频流处理插件flutter_audio_streaming的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音频流处理插件flutter_audio_streaming的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用flutter_audio_streaming插件进行音频流处理的示例代码。这个插件允许你实时录制和处理音频数据。请确保你已经在pubspec.yaml文件中添加了flutter_audio_streaming依赖,并运行了flutter pub get

1. 添加依赖

首先,在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_audio_streaming: ^0.8.0  # 请确保版本号是最新的

2. 配置权限

在Android的AndroidManifest.xml中添加录音权限:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

在iOS的Info.plist中添加麦克风使用描述:

<key>NSMicrophoneUsageDescription</key>
<string>App needs access to microphone to record audio</string>

3. 使用flutter_audio_streaming插件

以下是一个简单的Flutter应用示例,展示了如何使用flutter_audio_streaming插件来录制和处理音频数据:

import 'package:flutter/material.dart';
import 'package:flutter_audio_streaming/flutter_audio_streaming.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AudioStreamingExample(),
    );
  }
}

class AudioStreamingExample extends StatefulWidget {
  @override
  _AudioStreamingExampleState createState() => _AudioStreamingExampleState();
}

class _AudioStreamingExampleState extends State<AudioStreamingExample> {
  FlutterAudioStreaming? _audioStreaming;
  bool _isRecording = false;

  @override
  void initState() {
    super.initState();
    _audioStreaming = FlutterAudioStreaming();

    // 配置音频参数
    _audioStreaming?.configure(
      AudioSessionConfiguration(
        android: AndroidAudioSessionConfiguration(
          audioManager: AudioManager.STREAM_MUSIC,
          audioAttributes: AudioAttributes.USAGE_MEDIA,
        ),
        ios: IosAudioSessionConfiguration(
          category: AVAudioSessionCategoryPlayAndRecord,
          mode: AVAudioSessionModeDefault,
          options: [AVAudioSessionCategoryOptionMixWithOthers, AVAudioSessionCategoryOptionDuckOthers],
        ),
      ),
    );

    // 设置音频数据回调
    _audioStreaming?.setAudioDataCallback((data, duration) {
      // 在这里处理音频数据
      // data 是 PCM 数据,duration 是数据的时长(毫秒)
      print('Received audio data: $data with duration: $duration ms');
    });
  }

  @override
  void dispose() {
    _audioStreaming?.stop();
    _audioStreaming?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Audio Streaming Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            if (!_isRecording) {
              await _audioStreaming?.start();
              setState(() {
                _isRecording = true;
              });
            } else {
              await _audioStreaming?.stop();
              setState(() {
                _isRecording = false;
              });
            }
          },
          child: Text(_isRecording ? 'Stop Recording' : 'Start Recording'),
        ),
      ),
    );
  }
}

4. 运行应用

确保你的设备或模拟器有麦克风权限,然后运行应用。点击按钮开始或停止录音,音频数据将通过回调方法实时获取。

这个示例展示了如何配置音频会话、启动和停止录音以及处理音频数据。你可以根据需要对音频数据进行进一步的处理,比如保存到文件、进行实时分析等。

回到顶部