【问题标题】:Storing audio file in a database将音频文件存储在数据库中
【发布时间】:2018-02-27 10:24:37
【问题描述】:

我正在开发一个应用程序。我需要使用至少 400 个音频文件,这些文件可以为某些文本播放。我的问题是哪种方式是最好的优化方式?

一种解决方案是将所有音频文件放在资源文件夹中并从那里引用。随着应用程序大小的增加,这永远不会是一个可行的解决方案。有没有什么办法可以将音频文件转换成某种格式转储到SQLite数据库中灵活检索?如果是这样,我有什么选择?

【问题讨论】:

    标签: android audio android-sqlite


    【解决方案1】:

    将文件作为 BLOB 存储在 SQLite 数据库中与将它们存储为文件相比,不会为您节省任何空间。如果这些文件不打算与任何动态数据相关联,我会将它们放在资产文件夹中,这样它们就会被编译到 APK 中,如果它们在数据库中,检索它们可能会更快一点。

    【讨论】:

    • 嗨,里卡多,感谢您的回复。如果我将文件存储到资产文件夹中,那么我的应用程序大小会增加,这是可行的解决方案吗?请对此发表评论。或者有什么方法可以以低消耗格式存储音频文件??
    • 如果您将文件存储在数据库中,您的应用程序大小也会增加,我不明白您如何在不增加大小的情况下包含更多字节...您可以尝试压缩它们但是您不会获得太多收益,因为音乐文件已经被高度压缩...
    • @Vinayak-Bevinakatti,如果您担心 APK 的大小,您可以在应用第一次运行时从服务器下载这些文件。
    【解决方案2】:

    试试下面的代码......它为我存储......

        @Override
        public void onClick(View arg0) {
    
               SQLiteDatabase myDb;       
               String MySQL;
               byte[] byteImage1 = null; 
               byte[] byteImage2 = null;
               MySQL="create table emp1(_id INTEGER primary key autoincrement, sample TEXT not null, picture BLOB);";
               myDb = openOrCreateDatabase("Blob List", Context.MODE_PRIVATE, null);
               myDb.execSQL(MySQL);
               String s=myDb.getPath();
               textView.append("\r\n" + s+"\r\n");       
               myDb.execSQL("delete from emp1");
               ContentValues newValues = new ContentValues();
               newValues.put("sample", "HI Hello");
    
    
            try
            {
            FileInputStream instream = new FileInputStream("/sdcard/AudioRecorder/AudioRecorder.wav"); 
            BufferedInputStream bif = new BufferedInputStream(instream); 
            byteImage1 = new byte[bif.available()]; 
            bif.read(byteImage1); 
            textView.append("\r\n" + byteImage1.length+"\r\n"); 
            newValues.put("picture", byteImage1); 
    
            long ret = myDb.insert("emp1", null, newValues); 
            if(ret<0) textView.append("\r\n!!! Error add blob filed!!!\r\n");
            } catch (IOException e) 
            {
                textView.append("\r\n!!! Error: " + e+"!!!\r\n");   
            }
    
    
            Cursor cur = myDb.query("emp1",null, null, null, null, null, null);
            cur.moveToFirst();
            while (cur.isAfterLast() == false)
            {
                textView.append("\r\n" + cur.getString(1)+"\r\n");
                cur.moveToNext();
            }
        ///////Read data from blob field////////////////////
            cur.moveToFirst();
            byteImage2=cur.getBlob(cur.getColumnIndex("picture")); 
            bmImage.setImageBitmap(BitmapFactory.decodeByteArray(byteImage2, 0, byteImage2.length));
            textView.append("\r\n" + byteImage2.length+"\r\n"); 
    
            cur.close();
    
            myDb.close();
    
    
        }
    });
    

    【讨论】:

      【解决方案3】:

      如果我错了,任何人都可以纠正我,但 SQLite 的总行大小限制为

      【讨论】:

      【解决方案4】:

      在数据库中存储声音文件的主要原因可能是产品线方法。只需修改数据库而不接触代码,您就可以开发许多类似的应用程序。

      我不评论应用程序的大小,因为有关于它的 cmets,我不看它。

      是的。您可以将小型声音文件作为 blob 字段存储在 sqlite 数据库中。它运作良好。首先将您的数据存储在数据库中,然后检索它并将其放入临时文件中。这样您就可以将声音文件存储在数据库中。

      检查一下:

      soundDataFile = File.createTempFile( "sound", "sound" );
      FileOutputStream fos = new FileOutputStream( soundDataFile );
      fos.write( soundData );
      fos.close();
      
      mediaPlayer.reset();
      mediaPlayer.setDataSource( soundDataFile.getAbsolutePath() );
      mediaPlayer.prepare();
      mediaPlayer.start();
      

      【讨论】:

        【解决方案5】:

        将文件存储在 sql lite db 中的动机是什么?与将文件路径存储在数据库中以及文件系统上的实际文件相比,我没有看到太多好处......

        【讨论】:

        • 嗨,本,感谢您的回复。如果我将文件存储到资产文件夹中,我的应用程序大小会增加,这是可行的解决方案吗?请对此发表评论。或者有什么方法可以以低消耗格式存储音频文件。
        猜你喜欢
        • 1970-01-01
        • 2015-09-25
        • 2016-07-16
        • 2022-06-15
        • 2010-11-06
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 2020-11-26
        相关资源
        最近更新 更多