【Multi Media】Android多媒体播放

本文详细介绍了多媒体解码器的工作流程,包括输入和输出两大部分。输入流程从源获取音频流,经过一系列处理,最终由解码器解码。输出流程则描述了解码后的数据如何被AudioTrack接收并传递给AudioFlinger。整个过程涉及了MediaCodec、BufferCallback等多个组件的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多媒体和编解码器(组件)之前交互流程分为两个,
对于组件端来说,一个是输入一个是输出,

以音频解码器流程为例:
输入流程:
mNuPlayer::Decoder::fetchInputData MediaCodec 从source中获取音频流A(从Source获取音频流)
AmNuPlayer::Decoder::onInputBufferFetched 将音频流送入指定index的buffer
MediaCodec::queueInputBuffer 发送MediaCodec::kWhatQueueInputBuffer消息
MediaCodec::onQueueInputBuffer
ACodecBufferChannel::queueInputBuffer 发送ACodec::kWhatInputBufferFilled信息
ACodec::BaseState::onInputBufferFilled
OMXNodeInstance::emptyBuffer
OMX_EmptyThisBuffer 送数据完成。

解码器解码完数据之后,回调
OMXNodeInstance::OnEmptyBufferDone,发送omx_message::EMPTY_BUFFER_DONE
ACodec::BaseState::onOMXEmptyBufferDone
ACodecBufferChannel::fillThisBuffer
BufferCallback::onInputBufferAvailable,发送MediaCodec::kWhatFillThisBuffer
MediaCodec::onInputBufferAvailable,发送MediaCodec::CB_INPUT_AVAILABLE
NuPlayer::Decoder::handleAnInputBuffer
NuPlayer::DecoderBase::onRequestInputBuffers
AmNuPlayer::Decoder::doRequestBuffers
回调到输入第一步填写数据到buffer,整个循环完成,对应流程图上方。

输出流程:
解码器解码完之后,回调
OMXNodeInstance::OnFillBufferDone,发送omx_message::FILL_BUFFER_DONE
ACodec::BaseState::onOMXFillBufferDone
ACodecBufferChannel::drainThisBuffer
BufferCallback::onOutputBufferAvailable,发送MediaCodec::kWhatDrainThisBuffer
MediaCodec::onOutputBufferAvailable,发送MediaCodec::CB_OUTPUT_AVAILABLE
NuPlayer::Decoder::handleAnOutputBuffer
以下步骤开始送到AudioTrack,write给AudioFlinger
NuPlayer::Renderer::queueBuffer,发送kWhatQueueBuffer
NuPlayer::Renderer::onQueueBuffer,发送kWhatDrainAudioQueue
NuPlayer::Renderer::onDrainAudioQueue

同时handleAnOutputBuffer发送AmNuPlayer::DecoderBase::kWhatRenderBuffer消息,
AmNuPlayer::Decoder::onRenderBuffer
MediaCodec::releaseOutputBuffer,发送MediaCodec::kWhatReleaseOutputBuffer消息
MediaCodec::onReleaseOutputBuffer
ACodecBufferChannel::renderOutputBuffer,发送ACodec::kWhatOutputBufferDrained
ACodec::BaseState::onOutputBufferDrained
OMXNodeInstance::fillBuffer
OMX_FillThisBuffer
已经将解码之后buffer的数据取走,通知解码器放置数据,整个输出流程走完,对应流程图下方

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值