Unity3D PC平台本身是支持直接用www读取本地ogg,wav的,但是并不能读取byte[],字节数组格式,这对用习惯了bass,fmod的人来说有点不方便。

搜了一圈发现了一个C#的音频库叫NAudio,开源并且免费。

https://archive.codeplex.com/?p=naudio

https://github.com/naudio/NAudio

简单粗暴的搞一份二进制release,然后nuget一下ogg扩展

  1. Install-Package NAudio.Vorbis  

使用方面参考了下面3个地址

https://blog.csdn.net/qq992817263/article/details/54647741

https://gamedev.stackexchange.com/questions/114885/how-do-i-play-mp3-files-in-unity-standalone

https://stackoverflow.com/questions/24624939/using-vorbis-and-naudio-to-play-ogg-files

简单来说新建一个NAudioPlayer.cs文件,内容如下

  1. using UnityEngine;
  2. using System.IO;
  3. using System;
  4. using NAudio;
  5. using NAudio.Wave;
  6.  
  7. public static class NAudioPlayer
  8. {
  9. static NVorbis.VorbisReader vorbis;
  10. public static AudioClip FromOggData(byte[] data)
  11. {
  12. // Load the data into a stream
  13. MemoryStream oggstream = new MemoryStream(data);
  14.  
  15. vorbis = new NVorbis.VorbisReader(oggstream, false);
  16.  
  17. int samplecount = (int)(vorbis.SampleRate * vorbis.TotalTime.TotalSeconds);
  18.  
  19. // AudioClip audioClip = AudioClip.Create("clip", samplecount, vorbis.Channels, vorbis.SampleRate, false, true, OnAudioRead, OnAudioSetPosition);
  20. AudioClip audioClip = AudioClip.Create("ogg clip", samplecount, vorbis.Channels, vorbis.SampleRate, false, OnAudioRead);
  21. // Return the clip
  22. return audioClip;
  23. }
  24. static void OnAudioRead(float[] data)
  25. {
  26. var f = new float[data.Length];
  27. vorbis.ReadSamples(f, , data.Length);
  28. ; i < data.Length; i++)
  29. {
  30. data[i] = f[i];
  31. }
  32. }
  33. static void OnAudioSetPosition(int newPosition)
  34. {
  35. vorbis.DecodedTime = new TimeSpan(newPosition); //Only used to rewind the stream, we won't be seeking
  36. }
  37. public static AudioClip FromWavData(byte[] data)
  38. {
  39. WAV wav = new WAV(data);
  40. AudioClip audioClip = AudioClip.Create(, wav.Frequency, false);
  41. audioClip.SetData(wav.LeftChannel, );
  42. return audioClip;
  43. }
  44. public static AudioClip FromMp3Data(byte[] data)
  45. {
  46. // Load the data into a stream
  47. MemoryStream mp3stream = new MemoryStream(data);
  48. // Convert the data in the stream to WAV format
  49. Mp3FileReader mp3audio = new Mp3FileReader(mp3stream);
  50. WaveStream waveStream = WaveFormatConversionStream.CreatePcmStream(mp3audio);
  51. // Convert to WAV data
  52. WAV wav = new WAV(AudioMemStream(waveStream).ToArray());
  53. Debug.Log(wav);
  54. AudioClip audioClip = AudioClip.Create(, wav.Frequency, false);
  55. audioClip.SetData(wav.LeftChannel, );
  56. // Return the clip
  57. return audioClip;
  58. }
  59.  
  60. private static MemoryStream AudioMemStream(WaveStream waveStream)
  61. {
  62. MemoryStream outputStream = new MemoryStream();
  63. using (WaveFileWriter waveFileWriter = new WaveFileWriter(outputStream, waveStream.WaveFormat))
  64. {
  65. byte[] bytes = new byte[waveStream.Length];
  66. waveStream.Position = ;
  67. waveStream.Read(bytes, , Convert.ToInt32(waveStream.Length));
  68. waveFileWriter.Write(bytes, , bytes.Length);
  69. waveFileWriter.Flush();
  70. }
  71. return outputStream;
  72. }
  73. }
  74.  
  75. /* From http://answers.unity3d.com/questions/737002/wav-byte-to-audioclip.html */
  76. public class WAV
  77. {
  78.  
  79. // convert two bytes to one float in the range -1 to 1
  80. static float bytesToFloat(byte firstByte, byte secondByte)
  81. {
  82. // convert two bytes to one short (little endian)
  83. ) | firstByte);
  84. // convert to range from -1 to (just below) 1
  85. return s / 32768.0F;
  86. }
  87.  
  88. )
  89. {
  90. ;
  91. ; i < ; i++)
  92. {
  93. value |= (();
  94. }
  95. return value;
  96. }
  97. // properties
  98. public float[] LeftChannel { get; internal set; }
  99. public float[] RightChannel { get; internal set; }
  100. public int ChannelCount { get; internal set; }
  101. public int SampleCount { get; internal set; }
  102. public int Frequency { get; internal set; }
  103.  
  104. public WAV(byte[] wav)
  105. {
  106.  
  107. // Determine if mono or stereo
  108. ChannelCount = wav[]; // Forget byte 23 as 99.999% of WAVs are 1 or 2 channels
  109.  
  110. // Get the frequency
  111. Frequency = bytesToInt(wav, );
  112.  
  113. // Get past all the other sub chunks to get to the data subchunk:
  114. ; // First Subchunk ID from 12 to 16
  115.  
  116. // Keep iterating until we find the data chunk (i.e. 64 61 74 61 ...... (i.e. 100 97 116 97 in decimal))
  117. && wav[pos + ] == && wav[pos + ] == && wav[pos + ] == ))
  118. {
  119. pos += ;
  120. ] * + wav[pos + ] * + wav[pos + ] * ;
  121. pos += + chunkSize;
  122. }
  123. pos += ;
  124.  
  125. // Pos is now positioned to start of actual sound data.
  126. SampleCount = (wav.Length - pos) / ; // 2 bytes per sample (16 bit sound mono)
  127. ) SampleCount /= ; // 4 bytes per sample (16 bit stereo)
  128.  
  129. // Allocate memory (right will be null if only mono sound)
  130. LeftChannel = new float[SampleCount];
  131. ) RightChannel = new float[SampleCount];
  132. else RightChannel = null;
  133.  
  134. // Write to double array/s:
  135. ;
  136. : );
  137. // while (pos < wav.Length)
  138. while ((i < SampleCount) && (pos < maxInput))
  139. {
  140. LeftChannel[i] = bytesToFloat(wav[pos], wav[pos + ]);
  141. pos += ;
  142. )
  143. {
  144. RightChannel[i] = bytesToFloat(wav[pos], wav[pos + ]);
  145. pos += ;
  146. }
  147. i++;
  148. }
  149. }
  150.  
  151. public override string ToString()
  152. {
  153. return string.Format("[WAV: LeftChannel={0}, RightChannel={1}, ChannelCount={2}, SampleCount={3}, Frequency={4}]", LeftChannel,
  154. RightChannel, ChannelCount, SampleCount, Frequency);
  155. }
  156. }

再挂个AudioSource,简单粗暴读取文件,解码变为byte[]填充进AudioClip,播放即可

  1. void PlayOGG()
  2. {
  3. string path = Application.dataPath + "/../Audio/Music/a.ogg";
  4. byte[] data = File.ReadAllBytes(path);
  5. audioSource.clip = NAudioPlayer.FromOggData(data);
  6. audioSource.Play();
  7. }
  8. void PlayMP3()
  9. {
  10. string path = Application.dataPath + "/../Audio/Music/a.mp3";
  11. byte[] data = File.ReadAllBytes(path);
  12. audioSource.clip = NAudioPlayer.FromMp3Data(data);
  13. audioSource.Play();
  14. }
  15. void PlayWAV()
  16. {
  17. string path = Application.dataPath + "/../Audio/Music/a.wav";
  18. byte[] data = File.ReadAllBytes(path);
  19. audioSource.clip = NAudioPlayer.FromWavData(data);
  20. audioSource.Play();
  21. }

PC平台在Unity3D中播放硬盘ogg,mp3,wav文件的更多相关文章

  1. Unity3D中播放视频的方法

    播放视频其实和贴图非常相像,因为播放视频用到的 MovieTexture 属于贴图 Texture 的子类.Unity3D 支持的视频格式有很多,但是还是建议使用 ogv 格式的视频,使用其他格式依然 ...

  2. (转)在Unity3D中控制动画播放

    用Unity3D也算是好久了,但是每次做项目总还是能学到新的东西.这次做一个TPS的项目就遇到了这样一个问题,如何同时在上下半身播放不同的动画?解决方法其实是很简单,但由于对于动画资源的了解不足导致问 ...

  3. Unity3D中的shader基础知识

    1.Unity中配备了强大的阴影和材料的语言工具称为ShaderLab,以程式语言来看,它类似于CgFX和Direct3D的效果框架语法,它描述了材质所必须要的一切咨询,而不仅仅局限于平面顶点/像素着 ...

  4. vue中解决chrome浏览器自动播放音频 和MP3语音打包到线上

    一.vue中解决chrome浏览器自动播放音频 需求 有新订单的时候,页面自动语音提示和弹出提示框: 问题 chrome浏览器在18年4月起,就在桌面浏览器全面禁止了音视频的自动播放功能.严格地来说, ...

  5. asp.net 网页中播放 flash 和flv

    需求:在网页中播放powerpoint保存的pps文件和mp4文件 经过查阅:发现网页上直接播放pps文件比较麻烦(office web apps server),所以通过工具,将pps文件转换为sw ...

  6. 如何播放 WAV 文件?

    from http://www.vckbase.com/index.php/wv/434 平时,你在多媒体软件的设计中是怎样处理声音文件的呢?使用Windows 提供的API函数 sndPlaySou ...

  7. [Unity3D][Vuforia][IOS]vuforia在unity3d中添加自己的动态模型,识别自己的图片,添加GUI,播放视频

    使用环境 unity3D 5 pro vuforia 4 ios 8.1(6.1) xcode 6.1(6.2) 1.新建unity3d工程,添加vuforia 4.0的工程包 Hierarchy中 ...

  8. Unity3D系列教程--使用免费工具在Unity3D中开发2D游戏 第一节

    声明:   本博客文章翻译类别的均为个人翻译,版权全部.出处: http://blog.csdn.net/ml3947,个人博客:http://www.wjfxgame.com. 译者说明:这是一个系 ...

  9. Unity3d中使用assetbundle

    1.导出assetbundle: ①单个资源导出成assetbundle: ②多个资源导出成一个assetbundle: 2.读取assetbundle: ①加载到内存: ②解压为具体资源. 1.导出 ...

随机推荐

  1. 查询 SQL_Server 所有表的记录数: for xml path

    --我加了 top 10 用的时候可以去掉 declare @select_alltableCount varchar(max)='';with T as (select top 10 'SELECT ...

  2. oninput、onchange与onpropertychange事件的区别, 与input输入框实时检测

    这几天项目着急,同时也学到好多以前没有接触过的知识.oninput.onchange与onpropertychange事件的区别, 与input输入框实时检测 onchange事件只在键盘或者鼠标操作 ...

  3. gradle-4.1-all.zip离线包下载 极速 android studio2.3 3.0编译必备

    http://download.csdn.net/download/yongheng289/10039982 gradle-4.1-all.zip离线包下载 极速 android studio2.3 ...

  4. 浅谈Cookie与Session技术

      一.什么是状态管理 将客户端与服务器之间多次交互当做一个整体来看,并且将多次交互所涉及的数据(状态)保存下来. 会话:当用户打开浏览器,访问多个WEB资源,然后关闭浏览器的过程,称之为一个会话,选 ...

  5. Oracle不能并行直接添加主键的方法:先建唯一索引后建主键

    环境:Oracle 11.2.0.3 需求:生产一张表由于前期设计不当,没有主键.现需要添加主键,数据量很大,想并行建立. 1.直接添加,提示ora-3001:未实施的功能;只能单线程建立主键 SQL ...

  6. Redis 主从集群搭建及哨兵模式配置

    最近搭建了redis集群及哨兵模式,为方便以后查看特此记录下来: 1.Redis安装 2.主从架构 2.1 Redis主从架构图 2.2Redis主从结构搭建 Redis集群不用安装多个Redis,只 ...

  7. setDaemon 守护线程

    setDaemon(True): 将线程声明为守护线程,必须在start() 方法调用之前设置, 如果不设置为守护线程程序会被无限挂起.这个方法基本和join是相反的. 当我们 在程序运行中,执行一个 ...

  8. 操作系统切换CPU的方式

    操作系统切换CPU的方式 1 IO等待切换. 2 时间轮询切换,也就是如果没有IO等待的情况下,就会有时间轮询切换,不让CPU一直处理一个任务   CPU的处理速度是纳秒级别的,所有我们可以同时听歌, ...

  9. tp5框架中jquery+ajax分页

    jaxa分页,点击按钮直接替换数据, //php代码$page=Request::instance()->param("page"); $page = empty($page ...

  10. docker安装portainer

    安装好docker之后,可以使用portainer对容器进到管理 docker安装portainer命令 #这一步可以省略,直接运行可以下一条docker pull portainer #因为dock ...