簡體   English   中英

在 Xamarin UWP 中播放音頻崩潰

[英]Playing audio in Xamarin UWP crashes

我正在為 UWP(目標版本 10.0.19041.0)構建 Xamarin 應用程序,並且我正在嘗試根據特定條件通過揚聲器播放音頻。 它利用 Xam.Plugin.SimpleAudioPlayer(1.6.0 版)來執行此操作(我無法加載/使用內置的 MediaPlayer)。

基於與此類似的其他 StackOverflow 問題( 此處此處),我制作了一個 function,它應該允許我將 a.mp3 或 .wav 作為 stream 加載,然后使用 Xam.Plugin.SimpleAudioPlayer 通過我的揚聲器播放它.

這是我的 function 的定義,它嘗試將音頻文件加載為 stream。 我的 UWP 應用程序的 Assets 文件夾中有兩個文件beep.wavbeep.mp3 ,它們的 Build Action 都設置為 Content。

Stream GetStreamFromFile(string filename) {
    var assembly = typeof(Application).GetType().Assembly;

     var stream = assembly.GetManifestResourceStream(
         "Assets/" + filename // have also tried "Assets." since that was in a stackoverflow response
     );
     return stream;
}

這是調用 GetStreamFromFile function 的 function。 我包括了所有嵌套的條件/開關/等。 以防萬一這可能是問題的原因。 如果我注釋掉音頻代碼行,我的代碼運行時不會出錯並且具有預期的行為。

private void AddOrUpdateData() {
    InvokeOnMainThread(() => {
        ...
        switch (SensorType) {
             case 0:
                 ...
             case 1:
                 ...
             default:
                 try {
                     ...
                 }
                 finally {
                     if (my_value < 20) {
                         var stream = GetStreamFromFile("beep-09.mp3");
                         // stream.Seek(0L, SeekOrigin.Begin); // Have tried with and without this, not really sure what Seek does
                         var audio = Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current;
                         audio.Load(stream);
                         audio.Play();
                     }
                     ...
                 }
        }
        ...
    }
}

當此代碼運行時,我得到 null 引用異常: System.NullReferenceException:'對象引用未設置為 object 的實例。 每當調用 'stream' 時,它都會發生; 如果 stream.Seek 未注釋,它會在那里崩潰,否則它會在 audio.Load(stream) 發生時崩潰,因為 stream 似乎是 None。

如果我嘗試在沒有 stream 的情況下執行此操作,並且僅從 AudioPlayer 加載文件,則會收到此錯誤: System.Runtime.InteropServices.COMException: 'Error HRESULT E_FAIL has been returned from a call to a COM component.' 代碼如下所示:

var audio = Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current;
// Have tried both the mp3 and wav, with/without the Assets directory, all get the same error
audio.Load("Assets/beep.mp3");
audio.Play();

關於如何解決這個問題有什么建議嗎? 我會嘗試使用 MediaPlayer,但我似乎無法在 Xamarin Forms 中正確導入它,因為我正在編譯到我所有平台的通用 C# 文件中進行編碼。 我也不確定它是否與嵌套鎖、開關和條件有關,它們可能會弄亂代碼的 rest 的運行方式(我不是 Xamarin 的專家,所以可能有一些過程在我頭頂上進行) .

如果您將文件(例如beep.mp3 )放在 UWP 應用程序的Assets文件夾中,您可以嘗試以下代碼:

var player = Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current;

player.Load("beep.mp3");

player.Play();

注意:這里您不需要添加Assets作為前綴。並確保將構建操作設置為Content

audio.Load("Assets/beep.mp3");

SimpleAudioPlayer這里有示例,你可以參考它的代碼。

當您將文件放入 xamarin forms 的文件夾中時,我們可以使用以下代碼獲取 stream:

Stream GetStreamFromFile(string filename)
    {
        var assembly = typeof(App).GetTypeInfo().Assembly;

        var stream = assembly.GetManifestResourceStream("SAPlayerSample." + filename);

        return stream;
    }

並使用以下代碼加載 mp3:

 ISimpleAudioPlayer player;

 var stream = GetStreamFromFile("Diminished.mp3");
 player = CrossSimpleAudioPlayer.CreateSimpleAudioPlayer();
 player.Load(stream);

並使用 function Seek特殊位置。

player.Seek(sliderPosition.Value); 

有關更多信息,您可以查看示例: LibraryAudioPage.xaml.cs

暫無
暫無

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

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