iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
生成式 AI

用AI寫程式也是要點本事的系列 第 25

再嘗試一個套件 : flutter_ffmpeg

  • 分享至 

  • xImage
  •  

這個套件是哪裡來的?(從哪裡問到的?)

問它:「decodeAudioData後除了getChannelData以外還有沒有別的辦法?或是不使用AudioContext?」

回答是...


在 JavaScript 的 Web Audio API 中,`AudioBuffer` 物件提供了 `getChannelData` 方法來獲取 PCM 數據。這是從 `AudioBuffer` 中讀取音訊數據的主要方式。除此之外,`AudioBuffer` 還提供了 `copyFromChannel` 和 `copyToChannel` 方法,但這兩個方法主要用於修改 `AudioBuffer` 中的數據,而不是讀取數據。

如果你不想使用 `AudioContext` 和 `AudioBuffer`,你可能需要使用其他的 JavaScript API 或庫來處理音訊數據。例如,你可以使用 `FileReader` API 來讀取音訊檔案的內容,並使用 `DataView` 或 `TypedArray` 來解析 PCM 數據。然而,這通常需要你對音訊編碼有深入的理解,並且可能需要寫大量的代碼來處理不同的音訊格式和編碼。

在 Dart 中,由於 `dart:html` 庫並未完全支援 Web Audio API,因此你可能需要使用 `dart:js` 或 `dart:js_util` 來呼叫 JavaScript 的程式碼。你也可以考慮使用一個支援音訊處理的 Dart 庫,如 `audioplayers` 或 `flutter_sound`。

那好...

「如何使用flutter_sound轉檔成PCM?」


在 Flutter 中,`flutter_sound` 庫提供了一個 `startPlayerFromBuffer` 方法,該方法可以從一個包含 PCM 數據的 `Uint8List` 中播放音訊。然而,`flutter_sound` 並未提供直接將音訊檔案轉換為 PCM 數據的功能。

如果你需要將音訊檔案轉換為 PCM 數據,你可能需要使用其他的庫或服務。例如,你可以使用 `ffmpeg` 來轉換音訊檔案,或者使用 CloudConvert API 來進行在線轉換。

請注意,轉換音訊檔案可能需要大量的計算資源,並且可能會消耗大量的電池壽命。如果可能,你應該在伺服器端進行轉換,而不是在用戶的設備上進行轉換。

我的天哪!不能一口氣告訴我答案嗎?(不是都知道我一直在找如何轉出PCM檔的方法嗎?)

那好吧...

「請使用ffmpeg轉檔」


import 'package:flutter_ffmpeg/flutter_ffmpeg.dart';

class AudioConverter {
  final FlutterFFmpeg _ffmpeg = FlutterFFmpeg();

  Future<void> convertAudioToPcm(String inputFilePath, String outputFilePath) async {
    final arguments = '-i $inputFilePath -f s16le -acodec pcm_s16le $outputFilePath';
    final returnCode = await _ffmpeg.execute(arguments);
    if (returnCode != 0) {
      throw Exception('Failed to convert audio file, return code: $returnCode');
    }
  }
}

(這裡需要搭配一些之前使用過的「將錄音檔轉為本地URL後提供給convertAudioToPcm這個函數使用」。
總之執行後....跳出了這段錯誤訊息。


DartError: MissingPluginException(No implementation found for method executeFFmpegWithArguments on channel flutter_ffmpeg)
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 297:3  throw_
packages/flutter/src/services/platform_channel.dart 332:7                    _invokeMethod
dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 45:50           <fn>
dart-sdk/lib/async/zone.dart 1661:54                                         runUnary
dart-sdk/lib/async/future_impl.dart 162:18                                   handleValue
dart-sdk/lib/async/future_impl.dart 838:44                                   handleValueCallback
dart-sdk/lib/async/future_impl.dart 867:13                                   _propagateToListeners
dart-sdk/lib/async/future_impl.dart 643:5                                    [_completeWithValue]
dart-sdk/lib/async/future_impl.dart 713:7                                    callback
dart-sdk/lib/async/schedule_microtask.dart 40:11                             _microtaskLoop
dart-sdk/lib/async/schedule_microtask.dart 49:5                              _startMicrotaskLoop
dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 181:7           <fn>
Application finished.

原來又是同樣的問題!
「flutter_ffmpeg」不支援「FlutterWeb」環境。(少了一步確認的動作。)

(今天的文章只是讓「外行人」有機會看看什麼叫錯誤訊息而已。文章一路寫來都忘了介紹這個,這本來是很早很早就該介紹的東西。今天的重點進度其實是繼續回去研究CloudConvertAPI。)


上一篇
最後一週,準備開始衝刺....
下一篇
新的UI!DropdownButton!
系列文
用AI寫程式也是要點本事的30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言