点击这里转到我的Github查看本项目源代码
https://github.com/Needer28/naivePlayer
前言
在媒体播放器之前认真了解了老师对我们的要求,其中视频播放的实现其实并不难,对于C#来讲不过是一个控件的问题
之前也用C#实现郭类似的共能,但是只是将资源文件放在Assets文件夹下,并没有实现资源文件自由选取,且实现.mp3和.mp4文件的自由选取,这是此次作业的重点吧
无论什么时候,官方文档永远是最好的选择
Chapter 1--实现的功能
- 允许用户选择.mp3或.mp4文件
- 相应播放文件
- 拖动实现快进或返回
- 适应屏幕宽度
- 音量调整
- 纵横比调整
虽然直接把控件拖拽过去就有这些功能,除了文件选择!
虽然什么都看不到,也听不到,但是它就是超能陆战队主题曲immortals MP4文件(超能陆战队)播放示例
这个可以看到,是超能陆战队,没错我就是用自己制作的播放器把超能陆战队看完的
Chapter 2--技术细节
其实说实话,制作这个媒体播放器我是真的没有遇到什么困难,但是有一些点还是需要我们注意下或者需要我们可能参考到的
技术问题:FileOpenPicker的使用
起初我以为在XAML的控件当中会有这么一个文件选取器,但是我还是高估了XAML所能实现的功能,于是文件选取器就先被我放在一边没有,先是在XAML Controls Gallery当中查看了 MediaElement的使用,并通过它找到微软官方的极其详细方便的文档。
MediaElement Class官方文档点这里
在浏览官方文档的时候,我突然就发现了这么一个method——SetSourse,然后冥冥之中就是感觉这就是我要的,然后就顺理成章地把这么一个文件选取的功能实现
MediaElement.SetSource(IRandomAccessStream, String) Method官方文档点这里
所以呢,又是顺理成章地,我突然发现SetSourse中有这么一个例子
XAML
<MediaElement x:Name="mediaControl" Height="400" />
C#
async private void SetLocalMedia()
{
var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
openPicker.FileTypeFilter.Add(".mp4");//这两句实现了文件过滤
openPicker.FileTypeFilter.Add(".mp3");
var file = await openPicker.PickSingleFileAsync();
// mediaControl is a MediaElement defined in XAML
if (null != file)
{
var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
mediaControl.SetSource(stream, file.ContentType);//这个应该叫数据绑定?
mediaControl.Play();
}
}
没错,就是这么简单,微软官方的文档简直良心
Chapter 2--我的实现
其实呢,我的实现基本上基于以上微软官方文档给的示例,无非是拖拽了一个MediaElement控件,加了一个Button,并通过其click方法调用文件选取器部分代码
我的XAML代码
<Page
x:Class="naivePlayer.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:naivePlayer"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<MediaElement Name="mediaPlayer" AutoPlay="False" AreTransportControlsEnabled="True" HorizontalAlignment="Left" Height="913" Margin="0,37,0,0" VerticalAlignment="Top" Width="1430"/>
<Button Content="文件选取" Name="filePicker" Click="filePicker_Click" HorizontalAlignment="Right" VerticalAlignment="Top"/>
</Grid>
</Page>
XAML代码中添加了一个MediaElement用来播放媒体文件,一个Button用调用文件选取其部分代码
我的C#代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
namespace naivePlayer
{
/// <summary>
/// 可用于自身或导航至 Frame 内部的空白页。
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
async private void SetLocalMedia()
{
var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
openPicker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;//使用图片缩略图创建丰富的视觉显示
openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Add(".mp4");//确定选取文件的后缀名
openPicker.FileTypeFilter.Add(".mp3");
var file = await openPicker.PickSingleFileAsync(); //选取单个文件
// mediaPlayer is a MediaElement defined in XAML
if (null != file)
{
var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
mediaPlayer.SetSource(stream, file.ContentType);
mediaPlayer.Play();
}
}
private void filePicker_Click(object sender, RoutedEventArgs e) //此处通过点击事件调用了
// SetLocalMedia()来显示文件选取器
{
SetLocalMedia();
}
}
}
C#代码中按照微软官方文档的样子写了一个SetLocalMedia()方法用来实现一个文件选取器,实现了一个filePicker_Click(object sender, RoutedEventArgs e)方法用来通过点击事件调用SetLocalMedia()方法
Chapter 3--未来的展望
其实本次实现的播放器只是把老师要求的功能实现了,还有很多不能尽如人意的地方,比如,当我打开一个MP3文件时,只能看到一个进度条在不断的动,连我打开的是那首歌都看不到,这是不能令我满意的,针对这个缺陷,日后可以考虑加一个TextBlock显示打开的文件名
总之,需要改进的地方还有很多,不令人满意的地方也还有很多,我想对于用户来说,只有功能绝对不够,要怎么让我们的软件更方便、更易于使用才是我们开发者需要追寻的目标
后语
需要学的还有很多,有很多功能我们只会做也不够,怎么做好才是我们真正需要考虑的问题
欢迎大家关注我的微信公众号“NEU学堂”
学堂君欢迎你的到来
~~虽然小编经常托更,而且一托就是好几个月,但这并不妨碍它是一个极好的公众号~~
网友评论