Xamarin C# Android - 将 .3gpp 音频转换为字节并发送到 parseObject
Posted
技术标签:
【中文标题】Xamarin C# Android - 将 .3gpp 音频转换为字节并发送到 parseObject【英文标题】:Xamarin C# Android - converting .3gpp audio to bytes & sending to parseObject 【发布时间】:2014-12-02 21:35:51 【问题描述】:我对处理录制的声音很陌生。 我可以成功地将音频录制到 .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: 我已经取得了一些进展,但是我仍在努力从云端下载音频文件。 这是我的新代码: 异步任务 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" 包含两个孩子:用户名(字符串)和文件(ParseFile 对象) “文件”有两个孩子:音频的名称(由用户字符串输入),以及以字节为单位的数据。
我需要将音频放入 mdeiaplayer 播放器对象中并播放。
从长远来看,我想提取: (原谅我的伪SQL,但查询文档看不懂):
Select (all files) from (audioParseObject) where (the username = current user.username)
然后 将这些文件放入列表视图中
用户从列表视图中选择一个文件并播放。
任何帮助或指示都会很棒。 谢谢。
【问题讨论】:
【参考方案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);
【讨论】:
Jason,非常感谢,在发表这篇文章之前,我已经阅读了所有关于 ParseObjects 的文档,在发表这篇文章后不久,我看到了 ParseFile 文档。我现在遇到的问题是我无法将文件拉到另一边。我会修改你的代码示例,向你展示它是如何工作的,如果你能帮助检索文件,那就太好了! 不要对二进制数据使用 System.Text.Encoding.UTF8.GetBytes。 嗨,Jason,非常感谢您的建议,我已将其进一步移动,现在我可以在 parse 的数据存储中查找声音并通过我的计算机成功播放。然而,我正在努力通过手机点击我设置的按钮来播放它......我已经在上面的 EDIT2 下更新了新代码。谢谢。 我在您的编辑中没有看到任何关于下载文件的内容 - 您是否尝试过我上次建议中的代码?如果是这样,你有什么具体问题?由于您最初的问题是关于将二进制文件保存到 Parse,因此最好关闭此问题并创建一个新问题来处理检索和播放文件。 我在这里发了一个新帖子:***.com/questions/27316475/…以上是关于Xamarin C# Android - 将 .3gpp 音频转换为字节并发送到 parseObject的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin C# Android - 将 .3gpp 音频转换为字节并发送到 parseObject
xamarin android如何将Java.Lang.Object类型转成C#类型
如何将单独的参数传递给 Xamarin Android C# 中的 ListView.ItemClick 调用