Xamarin C# Android - 将.3gpp音频转换为字节并发送到parseObject
本文关键字:字节 并发 parseObject 转换 音频 Android 3gpp Xamarin | 更新日期: 2023-09-27 18:32:55
我对处理录制的声音很陌生。我可以成功地将音频录制成.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();
}
任何帮助将不胜感激。
编辑2:我已经取得了一些进展,但是,我正在努力将音频文件从云中取出。这是我的新代码: 异步任务发送到云(字符串文件名( {
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"包含两个子级:用户名(字符串(和文件(ParseFile 对象("file"有两个子项:音频的名称(由用户输入 -string(和以字节为单位的数据。
我需要将音频放入 mdeiaplayer 播放器对象中并播放。
从长远来看,我需要提取:(原谅我的伪SQL,但我不明白查询文档(:
从 (audioParseObject( 中选择(所有文件(,其中(用户名 = 当前用户.用户名(
然后将这些文件放入列表视图
用户从列表视图中选择一个文件,然后播放。
任何帮助或指示都会很棒。谢谢。
Parse 在他们的网站上有非常好的文档和示例 - 你读过它们吗?
首先,您将使用 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;
若要稍后检索该文件,请使用分析文件中的 Url 属性。
var file = testObject.Get<ParseFile>("audio");
byte[] data = await new HttpClient().GetByteArrayAsync(file.Url);