[英]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.wav和beep.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.