android音频会话,android音视频指南-使用媒体会话media session

媒体会话与它所管理的播放器共存。您应该在拥有媒体会话及其关联播放器的活动或服务的onCreate()方法中创建并初始化一个媒体会话。

注意:编写媒体应用程序的最佳实践是使用media-compat库。在本页中,术语“媒体会话”指的是MediaSessionCompat的实例,而“媒体控制器”指的是MediaControllerCompat的实例。

初始化媒体会话media session

新创建的媒体会话没有功能。您必须通过执行以下步骤来初始化会话:

设置标志,以便媒体会话可以接收来自媒体控制器和媒体按钮的回调。

创建并初始化一个PlaybackStateCompat实例,并将其分配给会话。播放状态会在整个会话期间发生变化,因此我们建议缓存PlaybackStateCompat.Builder以便重用。

创建MediaSessionCompat.CallBack实例并将其分配给会话(更多关于回调的内容见下文)。

您应该在拥有会话的活动或服务的onCreate()方法中创建和初始化一个媒体会话。

为了让媒体按钮在应用程序新初始化(或停止)时正常工作,其PlaybackState必须包含与媒体按钮发送的意图匹配的play操作。这就是为什么ACTION_PLAY在初始化期间被分配给会话状态。有关更多信息,请参见对媒体按钮的响应。

维护播放状态和元数据

有两个类表示媒体会话的状态。

PlaybackStateCompat类描述了播放器的当前操作状态。这包括:

传输状态(播放器是否在玩/暂停/缓冲,等等。看getState())

适用时的错误代码和可选错误消息。(参见下面的getErrorCode()和读取状态和错误)

播放器的位置

可以在当前状态下处理的有效控制器操作

MediaMetadataCompat类描述正在播放的材料:

艺术家、专辑和歌曲的名字

跟踪持续时间

相册艺术品显示在锁屏上。图像是一个最大大小为320x320dp的位图(如果较大,则按比例缩小)。

contenturi的一个实例,它指向一个更大版本的艺术品

播放器状态和元数据可以在媒体会话的生命周期中发生变化。每当状态或元数据发生更改时,您必须为每个类使用相应的生成器,即PlaybackStateCompat.Builder()或MediaMetadataCompat.Builder(),然后通过调用setPlaybackState()或setMetaData()将新实例传递给媒体会话。为了减少这些频繁操作的总内存消耗,最好一次性创建构建器,并在会话的整个生命周期中重用它们。

状态和错误

注意,PlaybackState是一个对象,它包含会话播放状态的单独值(getState()),必要时还包含一个关联的错误代码(getErrorCode())。错误可以是致命的,也可以是非致命的:

每当播放中断时,您应该生成一个致命错误:将传输状态设置为STATE_ERROR,并指定与setErrorMessage(int, CharSequence)相关联的错误。只要播放被错误阻塞,PlaybackState就应该继续报告STATE_ERROR和错误。

当您的应用程序不能处理请求,但可以继续运行时,就会出现非致命错误:传输保持“正常”状态(比如STATE_PLAYING),但PlaybackState保存了一个错误代码。例如,如果最后一首歌正在播放,用户请求跳转到下一首歌,播放可以继续,但是您应该使用错误代码ERROR_CODE_END_OF_QUEUE创建一个新的PlaybackState,然后调用setPlaybackState()。连接到会话的媒体控制器将接收回调onPlaybackStateChanged()并向用户解释发生了什么。非致命错误应该仅在发生时报告一次。下次会话更新时,PlaybackState不会再次设置相同的非致命错误(除非在响应新请求时发生错误)。

媒体会话锁定屏幕

从Android 4.0 (API level 14)开始,系统可以访问媒体会话的播放状态和元数据。这是锁定屏幕如何显示媒体控件和艺术品。这种行为会因Android版本的不同而有所不同。

专辑作品

在Android 4.0 (API level 14)及更高版本中,锁定屏幕的背景会显示出你的专辑封面——但前提是媒体会话元数据包含背景位图。

传输控制

在Android 4.0 (API级别14)到Android 4.4 (API级别19)中,当媒体会话处于活动状态,且媒体会话元数据包含背景位图时,锁屏屏幕会自动显示传输控件。

在Android 5.0 (API level 21)或更高版本中,系统不提供锁定屏幕上的传输控制。相反,您应该使用MediaStyle通知来显示传输控件。

添加自定义操作

您可以使用addCustomAction()添加自定义操作。例如,添加一个控件来实现一个点赞的动作:

stateBuilder.addCustomAction(new PlaybackStateCompat.CustomAction.Builder(

CUSTOM_ACTION_THUMBS_UP, mResources.getString(R.string.thumbs_up), thumbsUpIcon)

.setExtras(customActionExtras)

.build());

复制代码@Override

public void onCustomAction(@NonNull String action, Bundle extras) {

if (CUSTOM_ACTION_THUMBS_UP.equals(action)) {

...

}

}

复制代码

媒体会话回调

主媒体会话回调方法是onPlay()、onPause()和onStop()。这是您添加控制播放器的代码的地方。

由于在运行时实例化并设置会话回调(在onCreate()中),应用程序可以定义使用不同播放器的替代回调,并根据设备和/或系统级别选择适当的回调/播放器组合。你可以在不改变应用程序其余部分的情况下改变播放器。例如,你可以在Android 4.1 (API level 16)或更高版本上使用ExoPlayer,在早期的系统上使用MediaPlayer。

除了控制播放器和管理媒体会话状态转换外,回调还启用和禁用应用程序的特性,并控制它与其他应用程序和设备硬件交互的方式。(参见控制音频输出)。

媒体会话回调方法的实现取决于应用程序的结构。请参阅分别描述如何在音频应用程序和视频应用程序中使用回调的页面,描述每种应用程序的回调应该如何实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Camera2 API提供了一种方便的方式来捕获视频和图像,但它不支持直接捕获音频数据。要在使用Camera2 API捕获视频同时捕获音频,您需要使用MediaRecorder类。 以下是使用MediaRecorder类进行音视频录制的一些示例代码: ```java private void startRecording() { if (mMediaRecorder == null) { mMediaRecorder = new MediaRecorder(); } else { mMediaRecorder.reset(); } try { mCameraDevice.createCaptureSession(Arrays.asList(mPreviewSurface, mMediaRecorder.getSurface()), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { try { mCameraCaptureSession = session; // 设置MediaRecorder参数 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mMediaRecorder.setVideoEncodingBitRate(10000000); mMediaRecorder.setVideoFrameRate(30); mMediaRecorder.setVideoSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()); // 开始录制 mMediaRecorder.prepare(); mMediaRecorder.start(); } catch (Exception e) { e.printStackTrace(); } } @Override public void onConfigureFailed(CameraCaptureSession session) { Toast.makeText(MainActivity.this, "Failed to configure camera session", Toast.LENGTH_SHORT).show(); } }, null); } catch (CameraAccessException e) { e.printStackTrace(); } } ``` 在上面的代码中,我们首先创建一个CameraCaptureSession对象,将预览和MediaRecorder的Surface都添加到该会话中。然后,我们设置MediaRecorder的参数,并通过调用prepare()和start()方法开始录制。 需要注意的是,为了使音视频同步,您需要将MediaRecorder的setVideoSource()方法设置为SURFACE,而不是CAMERA。这将使MediaRecorder从预览Surface接收视频数据,并与从麦克风接收的音频数据进行同步。 此外,您还需要实现一些其他方法,例如停止录制和释放MediaRecorder: ```java private void stopRecording() { try { mMediaRecorder.stop(); } catch (Exception e) { e.printStackTrace(); } releaseMediaRecorder(); releaseCamera(); } private void releaseMediaRecorder() { if (mMediaRecorder != null) { mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; } } private void releaseCamera() { if (mCameraDevice != null) { mCameraDevice.close(); mCameraDevice = null; } } ``` 上面的代码片段可以使您能够通过Camera2 API捕获音视频

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值