在本文中,我们将带你了解android–mediacodecvsmediaplayer和mediarecorder在这篇文章中,我们将为您详细介绍android–mediacodecvsmediapl
在本文中,我们将带你了解android – mediacodec vs mediaplayer和mediarecorder在这篇文章中,我们将为您详细介绍android – mediacodec vs mediaplayer和mediarecorder的方方面面,并解答android中mediaplayer常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Android AudioRecord和MediaRecorder、Android MediaCodec 设置 MediaFormat.KEY_PROFILE 问题、Android Mediaplayer MediaController超时、Android MediaPlayer 和 MediaCodec 的区别和联系(一)。
本文目录一览:- android – mediacodec vs mediaplayer和mediarecorder(android中mediaplayer)
- Android AudioRecord和MediaRecorder
- Android MediaCodec 设置 MediaFormat.KEY_PROFILE 问题
- Android Mediaplayer MediaController超时
- Android MediaPlayer 和 MediaCodec 的区别和联系(一)
android – mediacodec vs mediaplayer和mediarecorder(android中mediaplayer)
– 玩:MediaPlayer与MediaExtractor MediaCodec
– 记录:MediaRecorder与MediaCodec Mediamuxer
我何时必须使用其中一个?
对不起,如果这是一个重复的问题,我认为它应该是一个常见的问题,但我没有找到任何问题.
解决方法
如果你想做一些更自定义的事情,当你注意到想要修改的链的一部分被隐藏在高级别类中时,你会想要继续下一级.例如.对于MediaExtractor;如果您只想从文件中提取数据包但不解码并立即显示/播放它们,您将需要使用MediaExtractor.如果您想接收来自系统本身不支持的其他来源的数据包,您将需要使用没有MediaExtractor的MediaCodec.同样,如果您想录制除摄像机之外的其他内容,或者将输出写入除MediaRecorder支持的文件之外的其他位置,您将需要直接使用MediaCodec而不是MediaRecorder.
另请注意,对于较新的API版本,高级类也会改进并变得更加灵活,允许您执行以前需要您手动使用较低级别类的操作.例如.在Android 5.0中,MediaRecorder能够从自定义Surface进行录制,允许您录制自己渲染的视频,而不仅仅是摄像机.以前可以通过使用较低级别的类来实现4.3.
Android AudioRecord和MediaRecorder
我已经看到录制音频来处理它最好使用AudioRecord,因为我可以从那里获得原始音频.但是后来我无法以可播放的格式将数据写入文件(在android中是否有任何库可以执行此操作?).
我使用此方法记录原始数据,然后将其写入文件:
http://andrewbrobinson.com/2011/11/27/capturing-raw-audio-data-in-android/
但是当我尝试在设备上播放此文件时,它无法播放.
然后,如果我使用MediaRecorder,我不知道如何解码数据来提取功能.我一直在寻找MediaExtractor,但它接触MediaExtractor不解码帧.
那么..最好的方法是什么?我想这在任何音频处理应用程序中都很常见,但我无法找到管理它的方法.
感谢您的回复.
解决方法
如果您希望它可以与其他应用程序一起播放,您需要先将其转换为其他应用程序. WAV通常是最简单的,因为您只需添加header.您还可以找到用于转换为其他格式的库,例如JOGbis for OGG或JLayer for MP3等.
Android MediaCodec 设置 MediaFormat.KEY_PROFILE 问题
我在设置 MediaCodec profile 的时候,一直没有成功,看了源码之后才发现问题之所在:
https://android.googlesource.com/platform/frameworks/av/+/437ced8a14944bf5450df50c5e7e7a6dfe20ea40/media/libstagefright/ACodec.cpp
设置了 profile 之后,你还要设置一个 Level 属性,但是目前最新的 SDK 里面并没有提供这个 Key。
即使你手动的设置 level ,比如像这样:
MediaCodec codec = createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
MediaFormat format = = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, 1920, 1080);
format.setInteger(MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileHigh);
format.setInteger("level", Level_xxx);
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
还是不行的,因为 Android 强制将 profile 设置为 Baseline 了。
// XXX
if (h264type.eProfile != OMX_VIDEO_AVCProfileBaseline) {
ALOGW("Use baseline profile instead of %d for AVC recording",
h264type.eProfile);
h264type.eProfile = OMX_VIDEO_AVCProfileBaseline;
}
总之,Android 在使用 MediaCodec 进行 encode 的时候,只能使用 Baseline 的 profile。
Google 之后,发现也有其他的朋友发现了类似的问题,
https://code.google.com/p/android/issues/detail?id=163580
看来这个问题确实存在,不过不清楚为什么 Android 要强制使用 Baseline 的 profile。
Android Mediaplayer MediaController超时
香港专业教育学院实现了流媒体的MP3 URL的mediaplayer和mediacontroller.但是,我在TMobile网络上的设备无法获得很好的3G信号,因此可以在EDGE上运行.我假设媒体播放器因流太慢或不完整而崩溃,是否可以设置超时?
解决方法:
MediaPlayer中没有超时方法,但是您可以自己实现-有多种方法可以执行.
我建议其中之一,我用了自己,对我有用-broadcastReceiver
代码如下所示:
public class ConnectivityCheckingReceiver extends WakefulbroadcastReceiver
{
private AlarmManager alarmManager;
private PendingIntent pendingIntent;
@Override
public void onReceive(Context context, Intent intent)
{
if (MusicService.mediaPlayer != null)
{
if (!MusicService.mediaPlayer.isPlaying())
Log.v("Music", "Music is NOT playing");
//stop service and notify user
else
Log.v("Music", "Music is playing");
}
else
{
Log.v("Music", "User stopped player");
}
}
public void setAlarm (Context context, int hour, int minute, int second)
{
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, ConnectivityCheckingReceiver.class);
pendingIntent = PendingIntent.getbroadcast(context, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
}
在活动/服务/片段中添加以下行:
ConnectivityCheckingReceiver conCheck = new ConnectivityCheckingReceiver();
conCheck.setAlarm(context, hour, min, second);
您将需要自己实现小时/分钟/秒检查逻辑,但是使用Joda Time之类的库就可以轻松实现.
并且不要忘记添加到清单中:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<receiver android:name=".receivers.ConnectivityCheckingReceiver" />
附言:我的解决方案不是完美的,但是我没有看到关于此问题的任何好答案,因此,如果找到一个,请分享.
Android MediaPlayer 和 MediaCodec 的区别和联系(一)
目录:
(1)概念解释 : 硬解、软解
(2)Intel关于Android MediaCodec的相关说明
正文:


有关详细代码,请参阅 Android 4.3源码中的 EncodeDecodeTest.java。资料来源: http://androidxref.com/4.3_r2.1/xref/cts/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java
我们今天的关于android – mediacodec vs mediaplayer和mediarecorder和android中mediaplayer的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android AudioRecord和MediaRecorder、Android MediaCodec 设置 MediaFormat.KEY_PROFILE 问题、Android Mediaplayer MediaController超时、Android MediaPlayer 和 MediaCodec 的区别和联系(一)的相关信息,请在本站查询。
本文标签: