赞
踩
AudioClip创建
流媒体形式:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
public int position = 0;
public int samplerate = 44100;
public float frequency = 440;
void Start()
{
//参数依次是:clip名称、clip总时长(单位s)、声道数、采样率、是否流媒体、流媒体取数据回调、流媒体播放进度回调<无seek情况下只调用一至两次>
AudioClip myClip = AudioClip.Create(“MySinusoid”, samplerate * 200, 1, samplerate, true, OnAudioRead, OnAudioSetPosition);
AudioSource aud = GetComponent();
aud.clip = myClip;
aud.Play();
}
//喂音频数据到data中,最终保存到clip里面。注意:该回调里的数据不会立即播<延迟1s左右播放,缓冲区所致>放,即回调数据是提前缓冲的。 void OnAudioRead(float[] data) { int count = 0; while (count < data.Length) { data[count] = Mathf.Sign(Mathf.Sin(2 * Mathf.PI * frequency * position / samplerate)); position++; count++; } } void OnAudioSetPosition(int newPosition) { position = newPosition; }
}
非流媒体:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
void Start() {
//创建audioclip空壳,无数据
//参数依次是:clip名称、clip市场(单位s)、声道个数、采样率、是否D音频、是否流媒体<这里必须设为false>
AudioClip myClip = AudioClip.Create(“MySinusoid”, samplerate * 600, 1, samplerate, false, false);
//喂音频数据
//参数1:音频数据(float, -1~1)
//参数2:采样偏移量<跟时间无关,表示从第offset个采样数据开始插入新数据>
myClip.SetData (audioList[i], (int)offset);
}
}
注意:对于AudioClip来说,没有时间的概念,只有采样个数跟采样值,时间是通过采样率、声道数换算得到的。相应的喂数据也是按照第几个采样数据来喂,跟时间无关。
AudioSource、AudioClip和AudioMixer关系
AudioSource,声音源,输入AudioClip,解码数据,播放,可输出到AudioMixer。
AudioClip,音频片段。保存音频数据。
AudioMixer,混音器,用于固定频段的音效处理,以及多个音源同时播放时,调小某些音源。<待探索>
AudioListener,声音接收器,一个Scene只能有一个AudioListener,场景内所有音源的声音全部汇聚到Listener中,再输出到音频设备。
其中,AudioSource中可获取该声音源的输出频谱,AudioListener可获取整个场景内声音的频谱。
音频基础概念
DTS: 第n个音频采样数据DTS为n。
time_base:FFmpeg的概念,表示一个音频采样数据的时间跨度一般为1/samplerate。ffmpeg中time_base = {1, samplerate}。
<tiem = pts * av_q2d(st->time_base) av_q2d()表示将分数转为double类型数据>
采样率:一秒钟采样的个数。
声道:n声道每秒数据量为采样率*n个。
时间戳:音频所处的时刻。时间戳 = time_base * DTS。
nb_samples:ffmpeg中音频采样总个数
注意:要获取完整连续的音频output数据,采样周期要算好,若每次有1024个数据,则采样周期:1024/samplerate * 1000 (ms)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。