今天在做項目時,遇到了如何將byte[]數組中的音頻流,綁定到MediaElement控制項中去,在MediaElement控制項中有一個方法
public void SetSource(IRandomAccessStream stream, string mimeType);該方法是將音頻以流的方式綁定到MediaElement控制項中去,實現音頻檔案的播放。
現在問題就出現在我們可以將byte[]數組中的音頻流轉換成MemoryStream類型的流,可是如何將MemoryStream類型的流轉換成IRandomAccessStream類型的流呢?
接下來我們一步一步實現:
1.首先先將byte[]轉換成MemoryStream類型的
MemoryStream stream = new MemoryStream(bit) //bit為byte[]類型的位元組數組
2.然後我們將MemoryStream類型轉換成IRandomAccessStream類型的
private async Task<IRandomAccessStream> Convert(MemoryStream stream)
{
var randomAccessStream = new InMemoryRandomAccessStream();
var outputStream = randomAccessStream.GetOutputStreamAt(0);
var dw = new DataWriter(outputStream);
var task = new Task(() => dw.WriteBytes(stream.ToArray()));
task.Start();
await task;
await dw.StoreAsync();
var success = await outputStream.FlushAsync();
return randomAccessStream;
}
3.最後將轉換成IRandomAccessStream類型的流綁定到音頻控制項中去,實現音頻檔案的播放。
MediaElement.SetSource(stream,"");
以上就是實現了如何將Byte[]位元組流向IRandomAccessStream流。
另外還有一些流之間的轉換:
1.Stream轉byte[]
public static byte[] ConvertStreamTobyte(Stream input)
{
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
2.Stream轉MemoryStream
public static MemoryStream ConvertStreamToMemoryStream(Stream stream)
{
MemoryStream memoryStream = new MemoryStream();
if (stream != null)
{
byte[] buffer = ReadFully(stream);
if (buffer != null)
{
var binaryWriter = new BinaryWriter(memoryStream);
binaryWriter.Write(buffer);
}
}
return memoryStream;
}
3. String 轉 IBuffer
private IBuffer Convert(string text)
{
using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
{
using (DataWriter dataWriter = new DataWriter())
{
dataWriter.WriteString(text);
return dataWriter.DetachBuffer();
}
}
}
更詳細的轉換可參見 http://www.cnblogs.com/jing870812/archive/2012/04/12/2444870.html