在Windows Phone 8上使用MediaElement的时候发现一个很奇怪的现象。按照MSDN的说法,MediaElement的Volume属性可以通过设置0~1之间的值来设置媒体音量(0为最小音量,1为最大音量),其默认值为0.5。然而在实际的使用中发现其默认值并不是如MSDN中所说的0.5而是1,且音量并不随着Volume从0到1均匀变化。在0~0.7之间声音很小几乎听不见,0.7之后开始有明显的声音,且在0.75~1.0这个区间内改变Volume的值音量随Volume的变化明显。

由此看来,音量(z)随Volume属性的值(y)的变化的函数z = g(y)的函数图像近似于指数函数图像沿y轴负方向移动一个单位(因为g(0) = 0)。对于用户来说通过滑动一个范围为0~1的音量条来调节音量,通常用户所期望的是音量(z)能随着音量条的值(x)以一次函数z=h(x)均匀变化,而非以指数函数变化。

由于要改变MediaElement的音量只能通过设置Volume属性来达到,因此需要找到一个合适的转换函数f(x) = y满足z = g(y) = g(f(x)) = h(x) = kx,(其中k为大于1的常数)。

Read More

Windows Phone 8是不支持播放FLV视频文件的。所以用C++写了个FLV视频分离器,目前仅支持AAC音频编码和H.264视频编码,支持拖动播放(仅当metadata中带有关键帧信息)。再由C#对C++进行封装,C#中封装的类继承自MediaStreamSource,最后经由MediaElement播放出来。

【2015/04/06更新】已将源码开放托管于:https://github.com/lxrite/DawnPlayer

附图一张: