2017-01-27 34 views
2

自2016年5月以来,我在Play商店中安装了Android音乐应用程序。目前我要求用户指定一个包含所有音乐的文件夹。如何在Android应用程序中从音乐库中排除声音剪辑

我用下面的代码来过滤他们的文件夹中的音乐文件:

private boolean isAudioFile(String songTitleLowerCase) { 
    return songTitleLowerCase.endsWith(".mp3") || songTitleLowerCase.endsWith(".wma") || songTitleLowerCase.endsWith(".wav") || songTitleLowerCase.endsWith(".m4a") || songTitleLowerCase.endsWith("" + 
      ".flac"); 
    } 

我有额外的代码,通过所有子文件夹搜索也是如此。

该工程确定,但有一定的局限性:

  1. 大多数用户在遇到问题的定位,他们的 音乐的文件夹。我在应用中的一些提示,以供在那里手机保持自己的音乐文件夹共同 位置,但所有的 手机型号和Android的所有版本之间,他们有相当多的 可能性。

  2. 如果用户有两个或多个文件夹的音乐,比他们要么必须巩固自己的音乐,或者只需要我的应用他们的音乐收藏的一部分访问。我还没有实现多个音乐文件夹选择的代码。

我认为大多数应用程序会自动查找设备上的所有音乐文件,我想这样做。之前我实现了这个功能,问题是我最终收到了所有声音文件(即Google地图),以及播客和有声读物。

那么,如何排除声音剪辑,播客,和有声读物?我是否仅仅通过我选择包含在上面的代码中的扩展来做到这一点?我真的不确定哪些文件格式对音乐监听者来说很重要,以及哪些文件格式仅适用于声音和播客,或者是否存在使用方面的重叠。 I.E. .wav文件是用于音乐文件还是仅用于声音剪辑?

感谢您对我的问题的耐心和理解。我非常感谢您的反馈,因为一旦它可以自动准确地找到所有音乐,它将有助于我的应用程序更加便于用户使用。

+0

没有*音乐*文件格式和* audiobook *文件格式。只有*声音*文件格式。所以你不能通过扩展过滤掉有声读物和播客。 AFAIK,大多数音频播放器不会将它们滤除。 –

+0

如果有一些音乐应用程序正在过滤声音片段(例如Google地图的声音文件),那么他们的演示效果如何? – joshgoldeneagle

+0

谁知道?只有那些应用程序的开发者才能做Maibe一些人工智能或基于在线数据库和文件元数据(乐队名称,专辑,曲目名称,曲目长度等) –

回答

1

由于问题的性质,没有明确的答案:我可以使用一些具有一些背景音乐的高品质设备来录制典型歌曲大致相同时间段的语音,并且无法确定类型的音频文件(你确定我没有唱歌?)。如果您仅基于持续时间或大小过滤文件,请记住,您会让很多Dream Theater粉丝真的很生气。

因此,首先,扩展是不可靠的。使用诸如mime-util之类的东西来使用扩展名和/或幻数来提取格式(因为网站处于离线状态,库似乎不再被积极开发,请参阅this SO question了解使用说明)。我不确定MediaMetadataRetriever在这方面的记录是什么,但我想你可以尝试。你也可以得到类似Apache Tika的东西,但它看起来很重要,因为你的需求。

接下来,过滤掉正确的文件。任何与MIME audio/*是一个安全的赌注。您可能需要将特定的application/*类型列入白名单,但我知道的唯一一个是application/ogg,即使在这种情况下,audio/ogg也是首选。为了避免常见的非音乐格式,黑名单audio/audible,audio/vnd.audible.aax,audio/x-pn-audibleaudio(这将是.aa,.aax和类似的有声读物格式),audio/aac,audio/3gp。有关更多建议,请咨询Wikipedia

这里来的不太可靠的部分。你可以假设30岁以下的任何东西都不应该是音乐(即使对于金属核心来说这听起来太短了)。对于太长的文件,可以假设类似:只要确保你选择一个理智的值,如90分钟左右(不,15分钟不理智,我甚至不听梦剧院)。

还有更多的东西:你可能希望你心爱的用户足够为他/她的文件设置元数据。使用MediaMetadataRetriever检查是否存在诸如Album,AlbumArtist,Genre等值。同时检查比特率 - 任何80+符合音乐。

而且它们中最不可靠的:检查大小/持续时间比率。再次,MediaMetadataRetriever是你的朋友。这需要大量的测试,但我可以告诉你,从我的收藏中,当存储为质量4 ogg文件时,平均4-4.5分钟的歌曲略小于4MB,但在320kbps mp3中可以增长到15MB。一定要检查类型 - 无损格式如flac或wav要大得多,因此5分钟的flac歌曲需要大约40MB。然而,上限对你来说并不感兴趣,因为录音通常质量较低,所以,如果大小(以MB为单位)/持续时间(以分钟为单位)(0.7也可能工作),那肯定是不是音乐。

这就是我现在所能想到的。我在PC上收集了不同的歌曲格式和文件持续时间(但不包括有声读物或录音),所以我想如果这是您需要的,我可以为您提供一些更具体的数字。

注意:我假定您需要在一般情况下过滤掉非歌曲中的歌曲。如果您打算使用Android的媒体播放器播放它们,则无需打扰每一种过时的音频格式:check which types Android supports并根据该格式进行过滤。

P.S.如果你正在研究的例子肯定会打破你用来过滤的任何一种理智的方式,justlookintoproggenresambient works too)。

-1

的Android做所有的搜索,为您和专卖店结果访问的数据库使用MediaStore API

Here是一个非常基本的样本,可以帮助您开始。

+0

那么IS_MUSIC是用来排除声音片段等物品的吗?我肯定会使用MediaStore API,因为它可以帮助我排除声音剪辑,因为我应用程序的音乐库中包含的声音剪辑是我的问题的症结所在。String selection = MediaStore.Audio.Media.IS_MUSIC +“!= 0” – joshgoldeneagle

0

您无法确定音频文件是否符合您的期望。根据发布者/记录器使用的程序,音频书籍或录音可能是MP3,FLAC,OGG,WAV或任何其他声音格式。

WAV文件是(通常)未压缩的音频文件,可以包含所有内容。它可能是一个音乐文件(发烧友只有“收听”WAV文件,因为他们不喜欢压缩MP3的声音),但也可以是录音(例如我的录音机提供写输出到一个WAV文件)。

唯一的“记录只有”格式我所知道的是AMR(自适应多速率音频编解码器,语音编码优化的音频压缩格式)。正如Chetan Joshi已经指出的那样,您可以使用一些检查文件大小。但请注意,这些并不总是可靠的,因为(例如)WAV文件(=原始音频)通常非常大,即使时间较短。

0

你的逻辑更像是白名单的语音文件,并应实际相反,有越来越多的音频音乐文件扩展名的音频本书引导

所以不是试图找到一个有效的音乐扩展试图找到和语音导游书

那些只是:.aa.aax.m4b

private boolean isUnwantedAudioFile(String songTitleLowerCase) { 
    return songTitleLowerCase.endsWith(".aa") || songTitleLowerCase.endsWith(".aax") || songTitleLowerCase.endsWith(".m4b") ; 
    } 

可以通过该代理的所有其他文件都是有效的!

,你甚至可以考虑让使用colletions

here名单是所有可能的文件非常更新列表。