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(100, 200, 150, 90), "Stop"))
        {
            if (CurAudioSource != null) CurAudioSource.Stop();
        }
        if (GUI.Button(new Rect(300, 200, 150, 90), "Play-MP3"))
        {
            string audioPath = "/storage/emulated/0/music/千里之外.mp3";

            PlayLocalFile(audioPath);
        }

        if (GUI.Button(new Rect(100, 300, 150, 90), "Play-OGG"))
        {
            string audioPath = "/storage/emulated/0/music/爱上你万岁.ogg";
            PlayLocalFile(audioPath);
        }

        if (GUI.Button(new Rect(300, 300, 150, 90), "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上对中文路径的敏感所致。


本文转自赵青青博客园博客,原文链接:http://www.cnblogs.com/zhaoqingqing/p/6064841.html,如需转载请自行联系原作者

相关文章
|
3月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
5月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
401 1
|
7月前
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
|
3月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
196 0
|
5月前
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
196 1
|
5月前
|
存储 监控 数据库
Android经典实战之OkDownload的文件分段下载及合成原理
本文介绍了 OkDownload,一个高效的 Android 下载引擎,支持多线程下载、断点续传等功能。文章详细描述了文件分段下载及合成原理,包括任务创建、断点续传、并行下载等步骤,并展示了如何通过多种机制保证下载的稳定性和完整性。
168 0
|
7月前
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。
|
7月前
|
存储 Android开发 Kotlin
开发安卓app OKhttp下载后使用MediaPlayer播放
在Android Jetpack Compose应用程序中,要使用OkHttp下载远程音频文件并在本地播放,你需要完成以下几个步骤: 1. **添加依赖**:确保`build.gradle`文件包含OkHttp和Jetpack Compose的相关依赖。 2. **下载逻辑**:创建一个`suspend`函数,使用OkHttp发起网络请求下载音频文件到本地。 3. **播放逻辑**:利用`MediaPlayer`管理音频播放状态。 4. **Compose UI**:构建用户界面,包含下载和播放音频的按钮。
|
8月前
|
Android开发
【苹果安卓通用】xlsx 和 vCard 文件转换器,txt转vCard文件格式,CSV转 vCard格式,如何批量号码导入手机通讯录,一篇文章说全
本文介绍了如何快速将批量号码导入手机通讯录,适用于企业客户管理、营销团队、活动组织、团队协作和新员工入职等场景。步骤包括:1) 下载软件,提供腾讯云盘和百度网盘链接;2) 打开软件,复制粘贴号码并进行加载预览和制作文件;3) 将制作好的文件通过QQ或微信发送至手机,然后按苹果、安卓或鸿蒙系统的指示导入。整个过程简便快捷,可在1分钟内完成。
175 6
|
8月前
|
Java Android开发 C++
Android源代码定制:MK文件执行顺序|属性覆盖
Android源代码定制:MK文件执行顺序|属性覆盖
477 2
Android源代码定制:MK文件执行顺序|属性覆盖