Сохранение закаченого Audio

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Сохранение закаченого Audio

Сообщение Rinal 15 апр 2013, 18:10

Всем доброго времени суток! У меня есть следующий вопрос: я закачиваю музыку с сервера во время игры (с помощью WWW), как мне сохранить эти клипы, что бы их потом повторно не качать? Одна из идей - перегонять в бинарные файлы, а потом восстанавливать, но может есть более красивый метод? Буду очень благодарен за любые советы...
Rinal
UNIт
 
Сообщения: 91
Зарегистрирован: 25 апр 2012, 15:29

Re: Сохранение закаченого Audio

Сообщение DbIMok 15 апр 2013, 19:21

например, закачиваем assetbundle (делаются только в PRO) они попадают в кэш (до 50 МБ). в следующий раз "скачиваем" из кэша, играем. но сомневаюсь, что это "красивее", чем сохранить WWW.bytes, если только это не веб билд.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Сохранение закаченого Audio

Сообщение Rinal 15 апр 2013, 22:01

А как вам такой вариант:
Синтаксис:
Используется csharp
    private void Save()
    {
        AudioClip loadedClip = http://www.GetAudioClip();
        AudioClip clipFromDisc = null;
        int lengthSamples = loadedClip.samples;
        int channels = loadedClip.channels;
        int frequency = loadedClip.frequency;
        float[] samples = new float[loadedClip.samples * loadedClip.channels];
        loadedClip.GetData(samples, 0);
       
        clipFromDisc = AudioClip.Create("ClipFromDisc", lengthSamples, channels, frequency, false, false);
        clipFromDisc.SetData(samples, 0);
    }
 


Потом сохраняем в текстовый файл переменные:
Синтаксис:
Используется csharp
        int lengthSamples = loadedClip.samples;
        int channels = loadedClip.channels;
        int frequency = loadedClip.frequency;
        float[] samples = new float[loadedClip.samples * loadedClip.channels];
 


А при новом старте игры, воспроизводим закаченный клип так:
Синтаксис:
Используется csharp
        clipFromDisc = AudioClip.Create("ClipFromDisc", lengthSamples, channels, frequency, false, false);
        clipFromDisc.SetData(samples, 0);
 
Rinal
UNIт
 
Сообщения: 91
Зарегистрирован: 25 апр 2012, 15:29

Re: Сохранение закаченого Audio

Сообщение DbIMok 15 апр 2013, 22:48

да как-то никак. если уж сохранять таким способом, то почему не в wav. но если мы скачиваем сжатый, почему не сохранить его в неизменном виде?
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Сохранение закаченого Audio

Сообщение Rinal 15 апр 2013, 23:01

DbIMok писал(а):да как-то никак. если уж сохранять таким способом, то почему не в wav. но если мы скачиваем сжатый, почему не сохранить его в неизменном виде?


Ну было бы здорово, только как? :-? Подскажите? Только так что бы сразу на диск? А если нет, то как скачать из кеша?.
Rinal
UNIт
 
Сообщения: 91
Зарегистрирован: 25 апр 2012, 15:29

Re: Сохранение закаченого Audio

Сообщение Rinal 15 апр 2013, 23:10

Сорри, ссылку не заметил. Я так понимаю, нужно сохранять через EditorUtility.ExtractOggFile(). А как его загрузить? Что-то не могу найти =(((
Rinal
UNIт
 
Сообщения: 91
Зарегистрирован: 25 апр 2012, 15:29

Re: Сохранение закаченого Audio

Сообщение DbIMok 16 апр 2013, 01:02

Синтаксис:
Используется csharp
using UnityEngine;
using System.IO;
using System.Collections;

public class Test : MonoBehaviour {

        private string url = @"http://www.vorbis.com/music/Epoq-Lepidoptera.ogg";

        IEnumerator Start () {
                string name = Application.persistentDataPath + "/" + Path.GetFileName(url);
                bool needSave = false;
                WWW w;
                if (File.Exists(name)) {
                        w = new WWW(@"file:///" + name);
                } else {
                        needSave = true;
                        w = new WWW(url);
                }
                while (string.IsNullOrEmpty(w.error) && !w.GetAudioClip(false, true).isReadyToPlay) yield return null;
                if (string.IsNullOrEmpty(w.error)) {
                        AudioSource aSrc = GetComponent<AudioSource>();
                        if (aSrc == null) aSrc = gameObject.AddComponent<AudioSource>();
                        aSrc.clip = w.GetAudioClip(false, true);
                        aSrc.Play();
                        if (needSave) {
                                while (!w.isDone) yield return null;
                                File.WriteAllBytes(name, w.bytes);
                                Debug.Log("Saved");
                        }
                } else {
                        Debug.LogError(w.error, gameObject);
                }
        }
}

код только для примера. в реальных приложениях так никто не пишет.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Сохранение закаченого Audio

Сообщение Rinal 16 апр 2013, 10:03

Спасибо огромное! Суть я понял, главное что Вы мне подсказали где сохранять Application.persistentDataPath, вот с этим я долго мчался... Еще раз спасибо! :ymhug: :ymhug: :ymhug:
Rinal
UNIт
 
Сообщения: 91
Зарегистрирован: 25 апр 2012, 15:29


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18