1.酷狗音乐
酷狗(KuGou)拥有超过数亿的共享文件资料,手机酷狗内置了自主研发的酷狗解码器,能够播放MP3、MP4、OGG、FLAC、WMA、MID、AMR、AAC、OGA、APE等音频格式,同时支持酷狗的KRC和传统LRC歌词显示。
2.网易云音乐
该产品2013年4月23日正式发布,截止2017年04月,产品已经包括iPhone、Android、Web、Windows、iPad、WP8、Mac、Win10UWP、Linux等九大平台客户端。
3.QQ音乐
QQ音乐的在线音乐包含了:推荐、排行、歌手、电台、搜索功能。在推荐页面还有相关专题和热门推荐歌曲供用户选择。网络时代,分享功能也显得尤为重要,QQ音乐支持分享给QQ好友及微博两项分享功能。
4.虾米音乐
虾米音乐Android版、iPhone版分别是虾米网为Android操作系统、iOS操作系统量身订做的免费音乐应用。提供无线音乐解决方案。
5.多米音乐:
支持多种音频格式,支持OGG和FLAC无损音乐解码,最优化的音频解码技术。保证网络速度的同时获得最高级别的音质享受,还支持下载更多版本的音乐文件。
安卓手机安装暴风影音播放器、JetAudio Basic、千千音乐、Windows Media Player可以听ape格式音乐。
1、暴风影音播放器
暴风影音是北京暴风科技有限公司推出的一款视频播放器,该播放器兼容大多数的视频和音频格式。功能特性: 支持播放mp3、m4a、ape等常见格式的音频文件。具有高品质音乐播放能力;拥有专辑图片和全屏歌词显示的功能。海量在线音乐资源试听和下载;在线音乐手动搜索和音乐频道。
2、 JetAudio Basic
JetAudio Basic 是一个功能十分全面的多媒体播放及录音工具,通过它可以完成音乐、视频播放,CD音乐录制,甚至还可以通过网络播出,支持几乎所有格式的音频及视频文件。支持音效调节,营造不同的环境效果。可以根据MP3文件的ID3标签自动调整均衡器中的歌曲流派类型,以达到最佳音乐效果。
3、千千音乐
千千音乐是中国音乐门户之一,拥有正版高品质音乐,权威音乐榜单,新歌速递,契合用户需求的主题电台,人性化的歌曲搜索。同样,支持播放mp3、m4a、ape等常见格式的音频文件。
4、Windows Media Player
安装相应插件后也能播放APE。这个软件也可以播放ape格式的音乐,但是需要安装插件,会占用一定的内存。
可以直接回答XBMC播放器可以播放DTS音乐。
XBMC播放器支持的视频格式:
◆MPEG-1◆MPEG-2◆MPEG-4◆wmv◆VC-1◆RealVideo◆QuickTime◆SMC◆VP3
◆IntelIndeo◆NUV◆VIVO◆ITU◆CYUV◆CVID◆ASUS◆FLI,FLC
支持的音频格式:
◆CDDA◆WAV/WAVE◆PCM◆AIFF◆MPEGI,II,,III◆OGG◆WMA◆rm,rmvb◆AC3
◆DTS◆AAC◆M4A,MP4◆FLAC◆WavPack◆MPC◆APE◆SHN◆ALAC◆MIDI
支持的图像格式:
◆BMP◆JPG/JPEG◆GIF◆PNG◆TIF/TIFF◆TGA◆PCX◆ICO◆CBR/CBZs
还可以尝试把DTS音乐使用软件把音轨转换成AC3格式。
扩展资料:
DTS音乐技术解析:
(1)DTS-HDMASTERAUDIO:无损的大师级完美音频针对采用7.1声道音频的蓝光影音设计,是一种最佳的高清音频解码技术,能够带来与录音母带逐位一致的音频。DTS-HDMasterAudio让消费者能够享受到最美妙的7.1声道环绕声。
(2)DTSCONNECT:让PC与家庭影院互连互通该技术可以
使笔记本电脑及PC与家庭娱乐系统进行高品质的数字音频互联互通,通过家庭影院系统,实现将任何立体声数字音频流转换成环绕声,并通过5.1系统进行播放。
(3)DTSSURROUNDSENSATIONULTRAPC:PC专用DTS环绕声
DTSSurroundSensationUltraPC使用先进的后处理技术,仅用两个扬声器或耳机就能产生奇妙的环绕声效果。这项技术能够让消费者无论是欣赏立体声节目还是环绕声节目,即便在最普通的喇叭或是耳机上也能听到最好的环绕声效果。
参考资料来源:百度百科—XBMC播放器
上一节中我们讲了怎么采集音频并播放,由于AudioRecord采集的是PCM数据,没有经过处理,所有播放的时候会有杂音,啸叫等现象出现。因此处理掉这些不需要的数据就是本节的内容,编码与解码。
Android官方提供给我们的用于编解码的类是 MediaCodec ,它是android 4.1(API 16)才引入的,所以只能工作于andorid4.1以上的手机,如果想兼容4.1以下版本的手机,只能使用第三方库,如大名鼎鼎的 ffmpeg ,B站的 ijkplayer 等。
(1)提供了一套访问 Android 底层多媒体模块的接口,主要是音视频的编解码接口
(2)在Android上,预设的多媒体框架是基于第三方PacketVideo公司的OpenCORE来实现,OpenCORE的优点是兼顾了跨平台的移植性,而且已经过多方验证,所以相对来说较为稳定;缺点是国语庞大复杂,需要耗费相当多的时间去维护。因此从Android 2.0开始,Google引进了较为简洁的StageFright。Android 底层多媒体模块采用的是 StageFright 框架,它是基于OpenMax标准实现的,任何 Android 底层编解码模块的实现,都必须遵循 OpenMax 标准。值得一提的是,OpenMAX是Khronos制定的API,Khronos也是OpenGL的制定者。Google 官方默认提供了一系列的软件编解码器:包括:OMX.google.h264.encoder,OMX.google.h264.encoder, OMX.google.aac.encoder, OMX.google.aac.decoder 等等,而硬件编解码功能,则需要由芯片厂商依照 OpenMax 框架标准来完成,所以,一般采用不同芯片型号的手机,硬件编解码的实现和性能是不同的
(3)Android 应用层统一由 MediaCodec API 来提供各种音视频编解码功能,由参数配置来决定采用何种编解码算法、是否采用硬件编解码加速等等
根据android官方文档的描述,MediaCodec的核心就是使用缓冲区队列来操作数据,使用流程如下:
//name既是媒体文件的类型,如audio/3gpp,详情参考MediaFormat的MIMETYPE常量
MediaCodec codec = MediaCodec.createByCodecName(name);
codec.configure(format, …);
MediaFormat outputFormat = codec.getOutputFormat(); // option B
codec.start();
for (;;) {
////获取可用的inputBuffer -1代表一直等待,0表示不等待 建议-1,避免丢帧
int inputBufferId = codec.dequeueInputBuffer(-1);
if (inputBufferId = 0) {
ByteBuffer inputBuffer = codec.getInputBuffer(…);
// fill inputBuffer with valid data
…
codec.queueInputBuffer(inputBufferId, …);
}
//执行上面的操作后就把待编解码的数据存入了输入缓冲区,然后下一步就是操作然后把编解码的数据存入输出缓冲区
int outputBufferId = codec.dequeueOutputBuffer(…);
if (outputBufferId = 0) {
ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId);
MediaFormat bufferFormat = codec.getOutputFormat(outputBufferId); // option A
// bufferFormat is identical to outputFormat
// outputBuffer is ready to be processed or rendered.
…
codec.releaseOutputBuffer(outputBufferId, …);
} else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
// Subsequent data will conform to new format.
// Can ignore if using getOutputFormat(outputBufferId)
outputFormat = codec.getOutputFormat(); // option B
}
}
codec.stop();
codec.release();
MediaCodec codec = MediaCodec.createByCodecName(name);
MediaFormat mOutputFormat; // member variable
codec.setCallback(new MediaCodec.Callback() {
@Override
void onInputBufferAvailable(MediaCodec mc, int inputBufferId) {
ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId);
// fill inputBuffer with valid data
…
codec.queueInputBuffer(inputBufferId, …);
}
@Override
void onOutputBufferAvailable(MediaCodec mc, int outputBufferId, …) {
ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId);
MediaFormat bufferFormat = codec.getOutputFormat(outputBufferId); // option A
// bufferFormat is equivalent to mOutputFormat
// outputBuffer is ready to be processed or rendered.
…
codec.releaseOutputBuffer(outputBufferId, …);
}
@Override
void onOutputFormatChanged(MediaCodec mc, MediaFormat format) {
// Subsequent data will conform to new format.
// Can ignore if using getOutputFormat(outputBufferId)
mOutputFormat = format; // option B
}
@Override
void onError(…) {
…
}
});
codec.configure(format, …);
mOutputFormat = codec.getOutputFormat(); // option B
codec.start();
// wait for processing to complete
codec.stop();
codec.release();
MediaCodec codec = MediaCodec.createByCodecName(name);
codec.configure(format, …);
codec.start();
//API的区别在这里
ByteBuffer[] inputBuffers = codec.getInputBuffers();
ByteBuffer[] outputBuffers = codec.getOutputBuffers();
for (;;) {
int inputBufferId = codec.dequeueInputBuffer(…);
if (inputBufferId = 0) {
// fill inputBuffers[inputBufferId] with valid data
…
codec.queueInputBuffer(inputBufferId, …);
}
int outputBufferId = codec.dequeueOutputBuffer(…);
if (outputBufferId = 0) {
// outputBuffers[outputBufferId] is ready to be processed or rendered.
…
codec.releaseOutputBuffer(outputBufferId, …);
} else if (outputBufferId == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
outputBuffers = codec.getOutputBuffers();
} else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
// Subsequent data will conform to new format.
MediaFormat format = codec.getOutputFormat();
}
}
codec.stop();
codec.release();