我对处理录制的声音非常陌生。 我可以成功地将音频录制到.3gpp文件中,将其本地保存在我的移动设备上,然后播放。
我遇到的麻烦是我想将声音文件转换为二进制文件,以便将其粘贴到parseObject中,然后将文件上传到云端。然后,我希望能够从单独的设备访问该文件,并将其流式传输。
- UPDATE ---我不再使用二进制文件,我正在使用parseFile对象。我现在只需要将对象从云端拉下来。
这是我用来录制音频(工作)的代码:
string sName;
string path = "/storage/extSdCard/";
string newPath = "";
_start.Click += delegate {
_stop.Enabled = !_stop.Enabled;
_start.Enabled = !_start.Enabled;
sName = _edittext.Text;
if (sName.Equals(" "))
{
}
else
{
//user enters a name for ther audio file
newPath = path + sName + ".3gpp";
_recorder.SetAudioSource (AudioSource.Mic);
_recorder.SetOutputFormat (OutputFormat.ThreeGpp);
_recorder.SetAudioEncoder (AudioEncoder.AmrNb);
_recorder.SetOutputFile (newPath);
_recorder.Prepare ();
_recorder.Start ();
}
};
_stop.Click += delegate {
_stop.Enabled = !_stop.Enabled;
_recorder.Stop ();
// _recorder.Reset ();
_player.SetDataSource (newPath);
_player.Prepare ();
_player.Start ();
};
这是我用来将数据发送到云端的类 - 这是通过单击按钮执行的,并且工作,它当前将硬编码的字符串发送到我可以成功检索的对象中。 但是,我希望二进制字符串进入testObject [“audio”],所以我可以检索它。
async Task sendToCloud()
{
ParseClient.Initialize ("--I've put my keys here but I'm censoring them--", "--I've put my keys here but I'm censoring them--");
try
{
byte[] data =null;
ParseFile file = null;
using (StreamReader reader = new StreamReader(LoadPath))
{
data = System.Text.Encoding.UTF8.GetBytes(reader.ReadToEnd());
file = new ParseFile("theaudio.3gpp", data);
}
Console.WriteLine("Awaiting reader");
await file.SaveAsync ();
var auidoParseObject = new ParseObject("AudioWithData");
//Console.WriteLine(ParseUser.getUserName());
auidoParseObject["userName"] = "userName";
auidoParseObject["file"] = file;
await auidoParseObject.SaveAsync();
}
任何帮助都会受到极大的赞赏。
EDIT2: 我已经取得了一些进展,然而,我仍然在努力将音频文件从云中删除。 这是我的新代码: 异步任务sendToCloud(字符串文件名) {
ParseClient.Initialize ("censored", "censored");
var testObject = new ParseObject ("Audio");
string LoadPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData);
string savetheFile = sName + ".3gpp";
string tempUserName;
LoadPath += savetheFile;
Console.WriteLine ("loadPath: " + LoadPath);
try
{
byte[] data = File.ReadAllBytes(LoadPath);
ParseFile file = new ParseFile(savetheFile, data);
await file.SaveAsync();
var auidoParseObject = new ParseObject("AudioWithData");
//Console.WriteLine(ParseUser.getUserName());
if (ParseUser.CurrentUser != null)
{
tempUserName = ParseUser.CurrentUser.Username.ToString();
}
else{
tempUserName = "Anonymous";
}
//tempUserName = ParseUser.CurrentUser.Username.ToString();
Console.WriteLine("PARSE USERNAME: " + tempUserName);
auidoParseObject["userName"] = tempUserName;
auidoParseObject["userName"] = tempUserName;
auidoParseObject["file"] = file;
await auidoParseObject.SaveAsync();
}
catch (Exception e)
{
Console.WriteLine("Failed to await audio object! {0}" + e);
}
}
目前,我的对象具有以下结构: “auidoParseObject”包含两个子节点:username(字符串)和file(ParseFile对象) “file”有两个子节点:音频的名称(由用户-string输入)和以字节为单位的数据。
我需要将音频放入mdeiaplayer播放器对象中并播放。
从长远来看,我想提取: (原谅我的伪SQL,但我不理解查询文档):
从(audioParseObject)中选择(所有文件),其中(username = current user.username)
然后 将这些文件放入列表视图
用户从列表视图中选择一个文件并播放。
任何帮助或指针都会很棒。 感谢。
答案 0 :(得分:1)
Parse在他们的网站上有很好的docs示例 - 你读过它们吗?
首先,您将使用ParseFile(而不是ParseObject)来保存文件
byte[] data = File.ReadAllBytes(path_to_your_file);
ParseFile file = new ParseFile("your_file_name_and_ext", data);
await file.SaveAsync();
保存文件后,可以在ParseObject中添加对它的引用
testObject ["audio"] = file;
要稍后检索文件,请使用ParseFile中的Url属性。
var file = testObject.Get<ParseFile>("audio");
byte[] data = await new HttpClient().GetByteArrayAsync(file.Url);