GVKun编程网logo

android – mediacodec vs mediaplayer和mediarecorder(android中mediaplayer)

7

在本文中,我们将带你了解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 – mediacodec vs mediaplayer和mediarecorder(android中mediaplayer)

我对如何在 Android中播放和录制视频/音频感到有些困惑.我真的不明白在什么情况下应该使用这些类:

– 玩:MediaPlayer与MediaExtractor MediaCodec

– 记录:MediaRecorder与MediaCodec Mediamuxer

我何时必须使用其中一个?
对不起,如果这是一个重复的问题,我认为它应该是一个常见的问题,但我没有找到任何问题.

解决方法

如果高级接口(MediaPlayer,MediaRecorder)可以执行您想要的操作(从系统支持的格式播放视频到显示器,或将视频从摄像机录制到文件中),您应该只使用它们,它将要简单得多.

如果你想做一些更自定义的事情,当你注意到想要修改的链的一部分被隐藏在高级别类中时,你会想要继续下一级.例如.对于MediaExtractor;如果您只想从文件中提取数据包但不解码并立即显示/播放它们,您将需要使用MediaExtractor.如果您想接收来自系统本身不支持的其他来源的数据包,您将需要使用没有MediaExtractor的MediaCodec.同样,如果您想录制除摄像机之外的其他内容,或者将输出写入除MediaRecorder支持的文件之外的其他位置,您将需要直接使用MediaCodec而不是MediaRecorder.

另请注意,对于较新的API版本,高级类也会改进并变得更加灵活,允许您执行以前需要您手动使用较低级别类的操作.例如.在Android 5.0中,MediaRecorder能够从自定义Surface进行录制,允许您录制自己渲染的视频,而不仅仅是摄像机.以前可以通过使用较低级别的类来实现4.3.

Android AudioRecord和MediaRecorder

Android AudioRecord和MediaRecorder

我正在开发一个音频处理应用程序,我需要录制音频,然后处理它以获得该录制的功能.但是,我希望使用MediaPlayer播放可播放格式的音频.

我已经看到录制音频来处理它最好使用AudioRecord,因为我可以从那里获得原始音频.但是后来我无法以可播放的格式将数据写入文件(在android中是否有任何库可以执行此操作?).

我使用此方法记录原始数据,然后将其写入文件:
http://andrewbrobinson.com/2011/11/27/capturing-raw-audio-data-in-android/
但是当我尝试在设备上播放此文件时,它无法播放.

然后,如果我使用MediaRecorder,我不知道如何解码数据来提取功能.我一直在寻找MediaExtractor,但它接触MediaExtractor不解码帧.

那么..最好的方法是什么?我想这在任何音频处理应用程序中都很常见,但我无法找到管理它的方法.

感谢您的回复.

解决方法

如果您需要进行任何类型的处理,使用AudioRecord是正确的方法.要播放它,你有几个选择.如果您只是在应用程序中播放它,则可以使用AudioTrack而不是MediaPlayer播放原始PCM流.

如果您希望它可以与其他应用程序一起播放,您需要先将其转换为其他应用程序. WAV通常是最简单的,因为您只需添加header.您还可以找到用于转换为其他格式的库,例如JOGbis for OGG或JLayer for MP3等.

Android MediaCodec 设置 MediaFormat.KEY_PROFILE 问题

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超时

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 的区别和联系(一)

Android MediaPlayer 和 MediaCodec 的区别和联系(一)

目录:

  (1)概念解释 : 硬解、软解

  (2)Intel关于Android MediaCodec的相关说明

正文: 

  一、硬解、软解
        (1)概念:
                a、硬件解码:硬件解码是图形芯片厂商提出的用GPU资源解码视频流的方案
                b、软件解码:相对于硬件解码,传统的软件解码是用CPU承担解码工作
        (2)优点:
                a、硬解:效率高、功耗低、热功耗低
                b、软解:具备普遍适应性
        (3)缺点:
                a、硬解:(a)缺乏有力的支持(包括滤镜、字幕)、局限性较大(例如打开硬件解码后PC的节能方面的功能
                                     失效cnq等)、设置较为复杂;
                             (b)需要硬件有硬件解码模块、相关的驱动配合、合适的播放软件以及对播放软件的正确设置,缺
                                      一不可。否则无法开启硬件解码功能。
                b、软解:主要靠算法解码,很耗费性能、耗电。
        (4)示例(基于Android平台):
                a、硬解:Android自带播放器——VideoView
                                        详述:
                                                VideoView基于MediaPlayer(也是硬件解码)实现,但 MediaPlayer 封装的比较死,对于视频
                                                编解码协议支持的较少。代表播放器:VideoView。
                                                而 MediaCodec 则具备很高的拓展性,支持的协议较多,我们可以根据流
                                                媒体的协议和设备硬件本身来自定义硬件解码。代表播放器:Google的 ExoPlayer。
                b、软解:FFmpeg
                                        详述:
                                                FFmpeg官网: https://ffmpeg.org/
                                                FFmpeg教程: 雷霄骅(leixiaohua1020)的专栏
                                                基于FFmpeg的代表播放器:Bilibili 的  ijkplayer
  二、Android* Hardware Codec — MediaCodec(译文)
          原文链接:https://software.intel.com/en-us/android/articles/android-hardware-codec-mediacodec
        
          Android有一个很棒的媒体库,为应用开发提供了无数的可能性。然而,直到最近,Android OS 还没有底层API用以直接编码和解码音频/视频,该底层API将几乎能使开发者创造任何东西。
          幸运的是,最新的 Jelly Bean 发布了 Android.media.MediaCodec API。该API使用与 OpenMAX*(媒体行业中的著名标准)相同的原理和架构设计,有效地从纯粹的高级媒体播放器转换到低级编码器/解码器。
        
          从 MediaPlayer 到 MediaCodec
          Android自API level 1以来已包含 MediaPlayer。MediaPlayer提供了一种简单的方式来播放音频和视频。但是,它受限于它只提供三种媒体格式:MP4、3GPP 和 MKV(从Android 4.0开始)。为了播放不支持的格式,许多开发人员使用了FFmpeg软件解码器。
          有一个x86二进制版本的FFmpeg可提供出色的性能。但是,包括 x86二进制文件 和 FFmpeg ARM* 二进制文件 都会产生一个很大的二进制镜像。
          截至Android 4.1发布,MediaCodec为此问题提供了合理的解决方案。由于MediaCodec是使用 Java API 编写的,因此它允许接口访问底层系统编解码器,无论是硬件编解码器,还是结合音频编解码器,都是高度优化的软件编解码器。使用MediaCodec能获得合理性能优化并节省电量。
    
          MediaCodec的函数调用流程
          函数调用流程非常简单,请参照下图。配置完成后,开发人员使用 dequeueInputBuffer 获取硬件缓冲区ID。将解码原始缓冲区复制到输入队列后,使用 queueInputBuffer 使硬件编解码器执行解码功能。开发人员使用 dequeueOutputBuffer 获取解码缓冲区,然后使用 releaseOutputBuffer 释放硬件缓冲区,该缓冲区提供一个选择:输出或者不输出到屏幕。
                                   
          有关详细代码,请参阅 Android 源码中的 DecoderTest.java:
          http://androidxref.com/4.4.2_r1/xref/cts/tests/tests/media/src/android/media/cts/DecoderTest.java
 
          此示例代码使用 MediaExtractor 作为媒体格式解析器。由于 Android 支持的媒体格式有限,大多数开发人员使用 AVFormat(FFmpeg的一个组件)作为媒体格式解析器。MediaCodec的配置与此功能不同。开发人员需要使用MediaFormat.createVideoFormat来创建视频格式(如果使用MediaExtractor,则使用 getTrackFormat 来获取格式)。一些解码器(例如:H.264)需要额外的配置信息。可以使用 MediaFormat 或者 刷新帧 添加此信息。例如: H.264刷新帧是IDR帧,在该帧的报头中包括附加配置信息。
          创建 H.264视频格式示例代码:
         videoformat = MediaFormat.createVideoFormat(“video/avc”, width,height);
      videoformat.setByteBuffer("csd-0", extra configure data);
        
          将 OpenGL*  与 MediaCodec 一起使用
          OpenGL被用来渲染 MediaCodec输出到屏幕。它在播放视频时添加一些视频特效也很有用。关键是 SurfaceTexture类。
          SurfaceTexture包含在 API Level 15(Android 4.0.3)中。开发人员可以使用它将图像流式传输到给定的OpenGL纹理。因此,如果使用 SurfaceTexture配置 MediaCodec,输出缓冲区将被渲染到一个OpenGL纹理,而不是设备屏幕。因此,需要视频后处理。
           开发人员需要添加 帧监听器(函数是setOnFrameAvailableListener)以获取图像更新消息,然后使用 updateTexImage 获取最新图像。OpenGL仅支持 RGB 颜色格式,但视频解码器的输出是 YUV 颜色格式,因此必须使用 GL_TEXTURE_EXTERNAL_OES 来支持 YUV 颜色格式。例如:要更改纹理类型,请使用函数 GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureId)。
          请参阅 https://github.com/MasDennis/Rajawali/wiki/Tutorial-25-Video-Material 以获取有关如何将 SurfaceTexture 用于 MediaPlayer 的详细信息。MediaCodec使用相同的过程,因此,如果使用 SurfaceTexture 配置 MediaCodec,将实现相同的结果。
 
         Support Pipeline on Android 4.3 
          新的 InputSurface 和 OutputSurface 包含在Android 4.3 中,在 InputSurface 和 OutputSurface 的帮助下,可以使用零拷贝完成代码转换管道,也就是说,所有解码视频内存都不会从GPU复制到CPU。编码器可以直接从管道获取内存处理程序。InputSurface 和 OutputSurface 将与当前的 OpenGL 环境绑定,而 OutputSurface 可以作为 SurfaceTexture 的一种“打包”。
          工作流程如下:
                     

          有关详细代码,请参阅 Android 4.3源码中的 EncodeDecodeTest.java。资料来源: http://androidxref.com/4.3_r2.1/xref/cts/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java
 
            在英特尔®架构(IA)平台上使用MediaCodec时获得低延迟
           在某些情况下,例如屏幕投影或云游戏,我们需要低延迟和高性能解码。使用硬件解码器,我们可以获得良好的性能,而用软件解码器的副作用即高延迟。
          如果编码器为 H.264 ,则 MediaCodec 可能具有几帧的延迟(对于IA平台,它是7帧,而其他主或高配置上是3-5帧)。如果帧速率为30 FPS,则 7 帧将具有 200 毫秒的延迟。什么原因造成硬件解码器延迟?原因可能是主要或高配置文件具有B帧,并且如果解码器在B帧引用后续缓冲器时没有缓冲器,则播放将被阻止一小段时间。英特尔已经考虑了硬件解码器的这种情况,并为主要或高配置文件提供了7个缓冲区,但由于基线没有B帧,因此将其减少到零缓冲区用于基线。其他供应商可以为所有配置文件使用4个缓冲。
          因此,在基于IA的Android平台上,解决方案是将编码器更改为基线配置文件。如果无法更改编码器配置文件,则可行的解决方法是更改解码器端的配置数据。通常,配置文件位于第五个字节,因此将基线配置文件更改为66将在IA平台上产生最低延迟。
 
           结论
           为IA平台编写Android媒体应用程序的开发人员应考虑使用本文所述的硬件解决方案,因为它在IA平台上表现最佳。 他们的客户将从强大的硬件中获得更多好处,反过来,这将为基于IA的Android设备构建一个h3多媒体软件生态系统。
 
  三、参考链接
                       https://blog.csdn.net/u010072711/article/details/52413766
                       https://baike.baidu.com/item/%E7%A1%AC%E4%BB%B6%E8%A7%A3%E7%A0%81
                       https://blog.csdn.net/biezhihua/article/details/53119327
                       https://software.intel.com/en-us/android/articles/android-hardware-codec-mediacodec
 

我们今天的关于android – mediacodec vs mediaplayer和mediarecorderandroid中mediaplayer的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android AudioRecord和MediaRecorder、Android MediaCodec 设置 MediaFormat.KEY_PROFILE 问题、Android Mediaplayer MediaController超时、Android MediaPlayer 和 MediaCodec 的区别和联系(一)的相关信息,请在本站查询。

本文标签: