Xamarin C#Android - 将.3gpp音频转换为字节&发送到parseObject

时间:2014-12-02 21:35:52

标签: c# android parsing audio xamarin

我对处理录制的声音非常陌生。 我可以成功地将音频录制到.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)

然后 将这些文件放入列表视图

用户从列表视图中选择一个文件并播放。

任何帮助或指针都会很棒。 感谢。

1 个答案:

答案 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);