WWW读取安卓外部音乐文件
需求分析
使用Everyplay(2121-1540版本)录屏,在升级SDK之后,遇到个问题,调用安卓原生的mediaplay进行播放音乐,在录屏时无法录制到声音,所以想到的解决办法是在Unity中播放音乐文件。
大概解释:
当在手机上选择一首歌(手机上的其它音乐文件)之后,直接在Unity中进行播放。这里需要注意的是这首音乐的格式,大小,存储位置是未知的。
测试环境
Windows 7 x64
Unity 5.3.6 f1 X64
华为 安卓4.2.2 (未ROOT)
三星NOTE3 安卓4.3(未ROOT)
播放其它目录的音频文件(可以是中文文件名,例:千里之外.mp3)
测试代码
以下代码中的音乐文件路径,在测试时,请换成自己的路径。
- "/storage/emulated/0/music/千里之外.mp3";
- "/storage/emulated/0/music/爱上你万岁.ogg";
- "/storage/emulated/0/music/梁静茹_宁夏.wav";
using System;
using UnityEngine;
using System.Collections;
using System.IO; /// <summary>
/// Detail : 使用WWW播放音频文件
/// Author : qingqing-zhao(569032731@qq.com)
/// CreateTime : #CreateTime#
/// </summary>
public class PlayAudioByWWW : MonoBehaviour
{
private AudioSource curAudioSource;
public AudioSource CurAudioSource
{
get
{
if (curAudioSource != null) return curAudioSource;
curAudioSource = gameObject.GetComponent<AudioSource>();
if (curAudioSource == null)
{
curAudioSource = gameObject.AddComponent<AudioSource>();
curAudioSource.playOnAwake = false;
curAudioSource.maxDistance = 1.1f;
}
return curAudioSource;
}
} public void OnGUI()
{
if (GUI.Button(new Rect(, , , ), "Stop"))
{
if (CurAudioSource != null) CurAudioSource.Stop();
}
if (GUI.Button(new Rect(, , , ), "Play-MP3"))
{
string audioPath = "/storage/emulated/0/music/千里之外.mp3"; PlayLocalFile(audioPath);
} if (GUI.Button(new Rect(, , , ), "Play-OGG"))
{
string audioPath = "/storage/emulated/0/music/爱上你万岁.ogg";
PlayLocalFile(audioPath);
} if (GUI.Button(new Rect(, , , ), "Play-wav"))
{
string audioPath = "/storage/emulated/0/music/梁静茹_宁夏.wav";
PlayLocalFile(audioPath);
}
} void PlayLocalFile(string audioPath)
{
var exists = File.Exists(audioPath);
Debug.LogFormat("{0},存在:{1}", audioPath, exists);
StartCoroutine(LoadAudio(audioPath, (audioClip) =>
{
CurAudioSource.clip = audioClip;
CurAudioSource.Play();
}));
} IEnumerator LoadAudio(string filePath, Action<AudioClip> loadFinish)
{
//安卓和PC上的文件路径
filePath = "file:///" + filePath;
Debug.LogFormat("local audioclip :{0}", filePath);
WWW www = new WWW(filePath);
yield return www; if (string.IsNullOrEmpty(www.error))
{
AudioClip audioClip = null;
//OGG文件会报:Streaming of 'ogg' on this platform is not supported
//if (filePath.EndsWith("ogg"))
//{
// audioClip = www.GetAudioClip(false, true, AudioType.OGGVORBIS);
//}
//else
{
audioClip = www.audioClip;
}
loadFinish(audioClip);
}
else
{
Debug.LogErrorFormat("www load file error:{0}", www.error);
}
}
}
代码文件:https://github.com/zhaoqingqing/blog_samplecode/blob/master/technical-research/PlayAudioByWWW.cs
我的总结
我们知道使用WWW加载Assetbundle时,是不可以有中文名和中文路径的,但上面使用的方法,为什么中文文件可以正常加载并播放?
上述仅仅是通过WWW加载文件,而加载的文件并非Unity的Assetbundle格式,所以写法上和加载Assetbundle不一样。
存在的问题
通过WWW加载ogg格式的音乐文件时,会报 “Streaming of 'ogg' on this platform is not supported “
至于这个Error的解决,目前我的解决办法是:在选择音乐时,如果是ogg格式文件弹出提示。
我尝试使用过 AudioClip audioClip = www.GetAudioClip(false, true, AudioType.OGGVORBIS); 还是得到一样的错误提示。
IOS平台
ios平台上使用此段代码,会报:unsupported URL
猜测是由于ios上对中文路径的敏感所致。
WWW读取安卓外部音乐文件的更多相关文章
- ios学习:AVAudioPlayer播放音乐文件及读取ipod库中的音乐文件
首先要导入AVFoundation框架及 #import <AVFoundation/AVFoundation.h>头文件 注意:要在真机上调试 下面是ipad上的调试效果 下面是代码,代 ...
- 使用pdf.js预览实现读取服务器外部文件
不知道大家使用百度网盘的文件预览功能,f12看过控制台没有. 发现百度网盘使用的预览文件功能全是基于开源pdf .js的 接下来正题,我们在使用pdf.js默认是读取发布容器内部的文件,读取外部的文件 ...
- JBoss 系列十四:JBoss7/WildFly如何加载外部的文件或properties文件
http://www.tuicool.com/articles/M7ZR3y 原文 http://blog.csdn.net/kylinsoong/article/details/12623997 主 ...
- 呼叫外部js文件并使用其内部方法
很久没有学习jQuery了,都快忘记了.今天学习一个小功能,使用jQuery的$.getScript()方法,是读取外部js文件,读取之后,并执行js文件内的一个方法. 首先我们创建这个js文件,如i ...
- android播放器如何获取音乐文件信息
转http://blog.csdn.net/hellofeiya/article/details/8464356, android自带的音乐播放器中,在获取音乐文件信息的时候是通过扫描得到相关信息的. ...
- qpython3 读取安卓lastpass Cookies
之前我的博客写了python读取windows chrome Cookies,沿着同样的思路,这次本来想尝试读取安卓chrome Cookies, 但是可能是chrome的sqlite3版本比较高读取 ...
- 如何用DELPHI编程修改外部EXE文件的版本信
右击里面有修改 点开直接修改就可以了吧. DELPHI 里程序的版本信息怎么是灰色的,无法更改 耐心读以下说明,应该能解决你的问题,如果不能解决,请Hi我~ 如何给自己的dll文件添加版本信息呢? 首 ...
- Android打开外部DB文件
DB文件要放在Assets文件夹下,封装一个工具类,如下: package com.XX.DB; import java.io.File; import java.io.FileOutputStrea ...
- 如何为ios酷我音乐盒下载导出的音乐文件(使用Java程序设计)
这个工具已经准备第二版,读者了解编程软件,可以直接使用,请阅读和使用这个场地 http://blog.csdn.net/jzj1993/article/details/44459983 本文所涉及内容 ...
随机推荐
- .NET Core的文件系统[3]:由PhysicalFileProvider构建的物理文件系统
ASP.NET Core应用中使用得最多的还是具体的物理文件,比如配置文件.View文件以及网页上的静态文件,物理文件系统的抽象通过PhysicalFileProvider这个FileProvider ...
- BIRCH聚类算法原理
在K-Means聚类算法原理中,我们讲到了K-Means和Mini Batch K-Means的聚类原理.这里我们再来看看另外一种常见的聚类算法BIRCH.BIRCH算法比较适合于数据量大,类别数K也 ...
- linux2.6 内存管理——概述
在紧接着相当长的篇幅中,都是围绕着Linux如何管理内存进行阐述,在内核中分配内存并不是一件非常容易的事情,因为在此过程中必须遵从内核特定的状态约束.linux内存管理建立在基本的分页机制基础上,在l ...
- 高仿QQ顶部控件之IOS SegmentView
经常会看到QQ上面有一个 消息和电话 的顶部面板,这个空间是IOS7的分段控制,android中没有这个控件,今天在威哥的微信公众号中成功gank到这个自定义控件的实现,下面跟着尝试一波. 首先是定义 ...
- 用CIL写程序:从“call vs callvirt”看方法调用
前文回顾:<用CIL写程序系列> 前言: 最近的时间都奉献给了加班,距离上一篇文章也有半个多月了.不过在上一篇文章<用CIL写程序:定义一个叫“慕容小匹夫”的类>中,匹夫和各位 ...
- dpkg:处理软件包dradis (--configure)时出错
dpkg:处理软件包dradis (--configure)时出错!解决方案:1.将info文件夹更名%mv /var/lib/dpkg/info /var/lib/dpkg/info_old2.新建 ...
- 用jmeter通过ssl验证访问https
找了一个支付宝的网站尝试.https://memberprod.alipay.com/account/reg/index.htm 我用的是chrome,点这个小锁 如果是IE也可以在网页上右键,属性, ...
- CentOS6.7搭建LNMP环境
1:查看环境: [root@localhost ~]# cat /etc/redhat-release 2:关掉防火墙 #重启后生效开启 [root@localhost ~]# chkconfig i ...
- Maven+Spring+Spring MVC+MyBatis+MySQL,搭建SSM框架环境【转】
项目建设完成之后的结构: 数据库的表结构如下: 环境建设:搭建Maven环境.Tomcat环境.需要MySql 数据库支持,使用的编程工具Eclipse (这些是前期准备): 开始创建工程: 1.创建 ...
- Scala 变长参数
如果Scala定义变长参数 def sum(i Int*), 那么调用sum时,可以直接输入sum(1,2,3,4,5) 但是不可以sum(1 to 5) 必须要将1 to 5 强制为seq sum( ...