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

C# + SQL + Xamarin Android:

xamarin android如何将Java.Lang.Object类型转成C#类型

如何将单独的参数传递给 Xamarin Android C# 中的 ListView.ItemClick 调用

C# Xamarin For Android自动升级项目实战

Android将Xamarin For VS升级为4.0.1.145版