可视化第四课 - 实现简易播放器 Part 2
本次新添的功能有:
- 在线播放,直接播放网络上的音频。
- 缓存网络上的音频文件并播放。
- 做了一些必要的优化。
总览:
在线播放:
这里模仿之前的代码写成:
//C# --位于OpenFile() mediaPlayerElement.Source = MediaSource.CreateFromStorageFile(file); mediaPlayer = mediaPlayerElement.MediaPlayer; mediaPlayer.Play();
仿写:
//C# --我的代码 mediaPlayerElement.Source = MediaSource.CreateFromUri(new Uri(URL.Text)); mediaPlayer = mediaPlayerElement.MediaPlayer; mediaPlayer.Play();
运行后可用。
缓存视频:
首先要解决的问题是获取用户音乐库的路径,查阅文档 创建、写入和读取文件 及 KnownFolders Class 得知:
//C# Windows.Storage.StorageFolder storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder; Windows.Storage.StorageFile sampleFile = await storageFolder.CreateFileAsync("sample.txt", Windows.Storage.CreationCollisionOption.ReplaceExisting)
//C# StorageFolder storageFolder = KnownFolders.PicturesLibrary; StorageFile file = await storageFolder.CreateFileAsync("sample.png", CreationCollisionOption.ReplaceExisting);
这样便解决了获取文件路径及创建文件的问题:
//C# --我的代码 var filePath = KnownFolders.MusicLibrary; string fileName = "temp_" + DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss"); //··· fileName += ".mp3"; filePath = KnownFolders.MusicLibrary; //··· StorageFile fileFullPath = await filePath.CreateFileAsync(fileName);
又通过阅读文档 音乐、图片和视频库中的文件和文件夹 学习如何使用流方法向媒体库添加文件,有代码:
StorageFolder testFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\test"); StorageFile sourceFile = await testFolder.GetFileAsync("TestImage.jpg"); StorageFile destinationFile = await KnownFolders.CameraRoll.CreateFileAsync("MyTestImage.jpg"); using (var sourceStream = (await sourceFile.OpenReadAsync()).GetInputStreamAt(0)) { using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0)) { await RandomAccessStream.CopyAndCloseAsync(sourceStream, destinationStream); } }
我的代码如下:
//C# --我的代码 StorageFile fileFullPath = await filePath.CreateFileAsync(fileName); using (var fileStream = await fileFullPath.OpenAsync(FileAccessMode.ReadWrite)) { await fileStream.WriteAsync(buffer); await fileStream.FlushAsync(); //关闭流 }
其中有个小问题一直没发现,耽误不少时间,如果将
string fileName = "temp_" + DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss");
改为
string fileName = "temp_" + DateTime.Now.ToString("yyyy/MM/dd");
会抛异常System.IO.FileNotFoundException,原因是不能出现“/”符号。
除了这两个核心功能的实现外,还进行了一些优化。不过是一些布局与排版,具体在 我的GitHub 中查阅。