日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件

發(fā)布時間:2025/5/22 windows 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第21部分:永久保存Wav音頻文件

原文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners/Part-21-Permanently-Saving-the-Audio-Wav-File

系列地址:http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners

源代碼:?http://aka.ms/absbeginnerdevwp8
PDF版本: http://aka.ms/absbeginnerdevwp8pdf

現(xiàn)在我們可以錄制聲音并將它保存到應(yīng)用程序獨立存儲的臨時文件中。接下來我們需要提示用戶輸入新的自定義聲音的顯示名稱來允許用戶永久保存聲音。

本課的計劃:

  • 向"save"應(yīng)用欄按鈕添加事件處理程序方法
  • 我們將管理應(yīng)用欄的狀態(tài),它應(yīng)該僅在臨時聲音文件被創(chuàng)建并準備好被永久保存時可見。
  • 我們將再次使用Coding4Fun工具包,這次用于顯示輸入對話框(InputDialog)以獲取新的自定義聲音音頻文件的名稱。
  • 我們將把CustomSounds數(shù)據(jù)序列化成一個JSON文件
  • 我們將修改數(shù)據(jù)模型以同時加載自定義聲音JSON文件并創(chuàng)建自定義聲音數(shù)據(jù)模型的實例
  • 1. 向"save"按鈕添加事件處理程序方法并管理應(yīng)用欄的狀態(tài)

    前面我們通過啟用BuildLocalizedApplicationBar()為RecordAudio.xaml頁面創(chuàng)建了應(yīng)用欄。所以我們需要做的就是激活它:

  • 在43行,我使用在整個系列中利用的技術(shù)向Click方法添加了一個事件處理程序
  • 在46行,我立即隱藏應(yīng)用欄。我們僅在有聲音需要保存時(在用戶錄制自定義聲音后)才顯示它
  • 接著,我們將在用戶停止錄制后啟用應(yīng)用欄。在RecordAudioUnchecked()方法中,我們將IsVisible屬性設(shè)置為true(見以下67行):

    2. 使用Coding4Fun工具包顯示輸入對話框以獲取新的自定義聲音音頻文件名稱

    在上面的步驟中我們?yōu)镾aveRecordingClick()方法添加了一個方法存根

    我將替換拋出異常作為提醒的那行代碼并編寫以下代碼(見51行):

    因為InputPrompt(輸入提示)來自與我們目前使用的其它類不同的命名空間,我們需要添加一個using語句(使用懸停于藍色虛線的方法以顯示一個上下文菜單)。

    接著我們將配置并顯示InputPrompt:

  • 我們在這里設(shè)置出現(xiàn)在InputPrompt中的標題和消息
  • 我們向Completed事件附加一個事件處理程序方法(并使用我在之前演示過的技術(shù)生成方法的存根)。我將在下一步繼續(xù)處理它。
  • 一旦配置完成,我將顯示對話框
  • 當用戶為新的自定義聲音輸入名稱并單擊勾選按鈕時,FileNameCompleted()事件處理程序?qū)⒈挥|發(fā)。

    我們將通過檢查結(jié)果確保用戶正確退出InputPrompt。我們將檢查作為輸入?yún)?shù)發(fā)送給事件處理程序方法的PopUpResult。如果結(jié)果是"OK",則我們就可以執(zhí)行必要的邏輯來將臨時文件保存為新的"永久的"聲音。請查看我添加的代碼以及代碼的注釋,這些注釋提供了一個我希望執(zhí)行的"后續(xù)步驟"的一個大綱:

  • 如果用戶正確輸入一個新的名稱并單擊勾選按鈕退出輸入對話框,那么我們將執(zhí)行保存自定義聲音所需的任務(wù)并使其出現(xiàn)在聲音面板的自定義聲音視圖中
  • 最后,我們將導航回MainPage.xaml
  • 在注釋1和2之間是一個需要做些什么以便正常工作的概述。在我們嘗試實施這些想法前,讓我們通過運行應(yīng)用程序來確保到目前為止流程的運作與我們的期望相一致。

    我使用切換按鈕錄制自定義聲音。當我停止錄制時,我將會看到應(yīng)用欄的出現(xiàn):

    當我單擊磁盤圖標保存自定義聲音時,將顯示輸入對話框:

    并且當我輸入聲音名稱并單擊勾選圖標時,對話框?qū)⑾Р盐規(guī)Щ豈ainPage.xaml。很好!

    現(xiàn)在讓我們處理困難的部分,執(zhí)行代碼注釋中列出的任務(wù)。

    3.將聲音文件保存到永久的獨立存儲區(qū)域,將CustomSounds數(shù)據(jù)序列化到JSON文件

    至此我們錄制了自定義聲音并將它作為臨時文件存儲,并且我們剛剛為聲音收集了一個友好的顯示名稱。我們需要完成兩項基本的任務(wù):

  • 首先,我們需要向數(shù)據(jù)模型添加自定義聲音。如果新的自定義聲音不被添加到數(shù)據(jù)模型,那么我們永遠無法在MainPage.xaml上的自定義聲音視圖呈現(xiàn)它。所以,我們將創(chuàng)建SoundData類的新的實例并正確填寫FilePath和Title屬性。
  • 接著,我們準備將文件從臨時位置移動到稱為/customAudio/的永久子文件夾。這純粹是為了在同一位置保存所有的自定義聲音文件。
  • 所以我向FileNameCompleted()方法添加了以下代碼:

  • 我創(chuàng)建一個新的SoundData實例并填寫Title和FilePath屬性。請注意我們將給自定義聲音一個新的名稱,但是文件的內(nèi)容保持不變。
  • 就像原來錄制自定義聲音那樣,我們獲得一個專門針對應(yīng)用程序的獨立存儲區(qū)域的引用。我們使用using語句以正確釋放非托管資源(例如手機的存儲)。代碼第一次執(zhí)行時將會創(chuàng)建存儲自定義音頻文件的特殊文件夾(76行)。最后,我們將臨時文件移動至新的永久存儲區(qū)域,并一次性給它一個新的名稱。
  • 接著,我們向CustomSounds.Items集合添加新的SoundData類的實例。這時我們應(yīng)該能夠返回MainPage.xaml,并在自定義聲音列表看到新的自定義聲音。
  • 然而,當我們關(guān)閉應(yīng)用程序并且它被完全從手機內(nèi)存中刪除,將會發(fā)生什么?屆時CustomSounds.Items集合將從內(nèi)存中刪除,并且下一次應(yīng)用程序運行時,應(yīng)用程序?qū)o法獲得我們的自定義聲音。我們需要一種方法存儲自定義的聲音數(shù)據(jù),這樣我們就可以在下次用戶運行應(yīng)用程序時將其加載到我們的數(shù)據(jù)模型中。

    4.將CustomSounds聲音組序列化到JSON,并從JSON反序列化到CustomSounds聲音組

    為此我們需要將CustomSounds.Items集合序列化到一種數(shù)據(jù)格式。有許多數(shù)據(jù)格式可供選擇,但是我們將選擇一種非常流行,輕量級并易于使用的格式——JSON。它是JavaScript Object Notion(JavaScript對象表示法)的縮寫。它使我們方便地用JavaScript對象表示集合。如果我們利用名為Json.NET的第三方開源庫,我們甚至不用考慮數(shù)據(jù)的格式,大部分復雜性將被簡單的方法調(diào)用隱藏。

    首先,我們將打開NuGet程序包管理器(使用我在前面演示過的技術(shù),右鍵單擊引用文件夾并選擇管理NuGet程序包選項)。

  • 搜索Json,排在頂部的應(yīng)該就是Json.NET。
  • 單擊Json.NET程序包旁的安裝按鈕。需要花一些事件將程序包安裝到您的項目中。
  • 單擊關(guān)閉按鈕。
  • 為驗證Json.NET是否安裝成功,打開SoundBoard項目的引用文件夾并驗證Newtonsoft.Json將出現(xiàn)在那里:

    回到FileNameCompleted()方法,下一步是將CustomSounds.Items轉(zhuǎn)換為Json,讓后將它存儲到磁盤。

    我們將使用Newtonsoft.Json.JsonConvert類執(zhí)行轉(zhuǎn)換。您需要添加適當?shù)膗sing語句以使用JsonConvert類:

    現(xiàn)在我們準備實現(xiàn)CustomSounds Json文件到磁盤的存儲。

  • 我們使用JsonConvert.SerializeObject()方法將CustomSounds對象(以及它的子對象)序列化到Json
  • 我們將使用獨立存儲中稱為IsolatedStorageSettings的特定區(qū)域保存對象數(shù)據(jù)。這是一個簡單的保存應(yīng)用程序設(shè)置的方法。您可以使用名稱/值對的模式為應(yīng)用程序保存任意設(shè)置。所以,在本例中我們將創(chuàng)建一個鍵并提供相應(yīng)的值,值部分顯然是數(shù)據(jù),即上一行代碼中被序列化的Json數(shù)據(jù)。鍵部分是一個我們將在SoundModel類的定義中作為常量屬性創(chuàng)建的字符串。我們稍后需要利用該鍵從IsolatedStorageSettings檢索回Json數(shù)據(jù)。
  • 我們將調(diào)用Save()方法以實際保存新的應(yīng)用程序設(shè)置,即我們在上一行代碼中創(chuàng)建的新的名稱/值對。
  • 在忘記之前,讓我們在SoundModel.cs文件中定義CustomSoundKey,我將添加以下代碼行(見19行):

    如您所見,這是一個常量字符串值。我們希望它是常數(shù),因為它不會改變。它只是在獨立存儲中找回正確的應(yīng)用設(shè)置(ApplicationSetting)的一個唯一的字符串。

    接著,我們將在實例化所有其它SoundGroup對象的同時加載自定義聲音到內(nèi)存中,在SoundModel.cs文件的LoadData()方法中:

    在上述28行,我們將調(diào)用一個輔助方法LoadCustomSounds()以填充SoundModel類的CustomSounds屬性。使用我在之前演示過的技術(shù)為新的方法生成一個存根。

    在LoadCustomSounds()方法中,我們將嘗試從IsolatedStorageSettings中檢索包含序列化自定義聲音的Json:

  • 我們執(zhí)行IsolatedStorageSettings.ApplicationSettings上的TryGetValue(),如果在IsolatedStorage中存在CustomSoundKey,那么它應(yīng)該在輸出參數(shù)"dataFromAppSettings"中返回相應(yīng)的值(即我們在之前存儲的Json)。如果沒有,else代碼塊將創(chuàng)建一個新的(空的)SoundGroup的實例。
  • 既然我們對數(shù)據(jù)進行了序列化,我們希望將數(shù)據(jù)反序列化回SoundGroup和SoundData對象的實例。我們調(diào)用泛型方法DeserializeObject<T>,向它提供我們希望反序列化成的類型(即SoundGroup)并傳遞從IsolatedStorageSettings檢索的數(shù)據(jù)。
  • 假設(shè)執(zhí)行TryGetValue失敗,這意味著沒有自定義聲音被創(chuàng)建(或檢索數(shù)據(jù)出現(xiàn)問題)。在任何情況下,返回一個空的SoundGroup。
  • 現(xiàn)在讓我們動手測試應(yīng)用程序。我將錄制一個聲音并嘗試用名稱"another test"保存該聲音。

    一切看起來都很好,但是當我保存新的自定義聲音后返回MainPage.xaml并嘗試播放它時會發(fā)現(xiàn),它無法播放!這是因為我們需要修改MainPage.xaml上的播放代碼以從新的文件夾加載自定義聲音。目前它僅從/Assets文件夾加載。

    我們的目標是將MediaElement的Source屬性設(shè)置為正確的聲音文件的位置,這些聲音文件與用戶點擊的磁貼相關(guān)。我們將在兩個位置查找,或者是/Assets文件夾,或者是獨立存儲區(qū)域。

    在MainPage.xaml.cs文件的LongListSelector事件處理程序方法中,我將添加以下內(nèi)容:

    這里我嘗試查看用戶選擇的磁貼是否是自定義聲音。如果我們不能在Assets\文件夾定位與磁貼相關(guān)的文件,那么將在應(yīng)用程序獨立存儲區(qū)域中的/customSounds/子文件夾中查找。

    對于上述檢查,我們需要訪問手機的文件系統(tǒng),所以我們將使用System.IO.File對象。以上截圖顯示了如何在代碼文件頂部添加合適的using語句以包含System.IO。

    此外,我們希望包含System.IO.IsolatedStorage引用,因為接下來我們將使用該命名空間中的類。

    回到LongListSelector的SelectionChanged()事件處理程序方法,如果SoundData對象的FilePath所指的文件不能在缺省位置被找到,則File.Exists()將返回false。否則,它將位于/Assets文件夾。所以基于以上分析我編寫了以下代碼:

  • 與之前一樣,我在此處使用SoundData的FilePath屬性設(shè)置MediaElement的Sound屬性。
  • 在本例中,文件不在/Assets文件夾中,所以我們將在獨立存儲中搜索。我在這里創(chuàng)建了一個IsolatedStorage引用。請注意using語句,通過using語句我們可以在結(jié)束時正確地釋放該資源。
  • 我們在這里使用了一種新的技術(shù)來訪問文件。我們以流的方式打開自定義聲音,或者更具體地講是IsolatedStorageFileStream。
  • 我們在這里將來自獨立存儲的包含自定義聲音的流作為參數(shù)傳遞給SetSource。
  • 這次我們運行應(yīng)用程序,錄制并保存聲音,然后返回“我的”自定義聲音類別,每一個保存的聲音應(yīng)該都可以正確播放了!

    回顧

    綜上所述,本課的重點是使用Newtonsoft Json序列化和反序列化對象到JSON,它是一個提升手機開發(fā)的非常有價值的技能。我們還學習了如何處理IsolatedStorage,特別是用IsolatedStorageSettings來存儲名稱/值對。我們使用System.IO.File類來檢查文件系統(tǒng),并學習了如何處理流。我們還使用了Coding4Fun工具包中的InputPrompt等內(nèi)容。我們已經(jīng)基本完成了應(yīng)用程序,我們將進行最后的加工以使它更有趣。

    轉(zhuǎn)載于:https://www.cnblogs.com/zigzagPath/p/3481070.html

    總結(jié)

    以上是生活随笔為你收集整理的Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。