【Xamarin】Android 6.0下使用MediaPlayer播放System.IO.Stream

在Android 6.0下新增了一个API:

MediaPlayer.SetDataSource(MediaDataSource dataSource);

之前都无法直接播放音频文件的Stream或者byte[]数据,有了这个API之后,就可以很方便的直接读取音频文件到Stream然后播放了,不过要先实现MediaDataSource这个类。
MediaDataSource类需要重写的虚成员有:

public abstract long Size { get; }
public abstract void Close();
public abstract int ReadAt(long position, byte[] buffer, int offset, int size);

很好,那就实现这个类吧,新建一个StreamMediaDataSource类继承它

    internal class StreamMediaDataSource : MediaDataSource
    {
        private byte[] _data;

        public StreamMediaDataSource(System.IO.Stream data)
        {
            using (var stream = new System.IO.MemoryStream())
            {
                data.CopyTo(stream);
                _data = stream.ToArray();
            }
        }

        public override long Size
            => _data.Length;

        public override void Close()
        {
            _data = null;
        }

        public override int ReadAt(long position, byte[] buffer, int offset, int size)
        {
            //请求位置出界
            if (position >= _data.Length)
            {
                return -1;
            }
            //请求位置+大小出界
            if (position + size > _data.Length)
            {
                size -= (Convert.ToInt32(position) + size) - _data.Length;
            }
            Array.Copy(_data, position, buffer, offset, size);
            return size;
        }
    }

解释一下
根据文档,ReadAt的参数的分别为:
Position:读取的位置
buffer:读取的数据
offset:读取数据的偏移量
size:读取数据的大小
最后返回的是这次读取的数据大小。
因为读取的数据为byte[],所以直接转换为byte[]来处理会比较方便。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据