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( 中选择(所有文件(,其中(用户名 = 当前用户.用户名(

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

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

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

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

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