Android 平台上音视频系统的研究及播放器开发.pdf(5)

电脑杂谈  发布时间:2019-06-16 15:04:01  来源:网络整理

AudioFlinger中还定义了很多线程,如 ThreadBase、PlaybackThread 、RecordThread、MixerThread 、DuplicatingThread 等。 线程之间的继承关系,以及内部关键类之间的调用关系如图3.5 所示。 20Android 平台上音视频系统的研究及播放器开发图3.5 AudioFlinger 内部图 3.5 中的 ThreadBase 是继承自 Thread 的线程,是图中所有线程的基类,所 有的播放线程 PlaybackThread和录音线程 RecordThread都继承自这个类 。 ThreadBase 中有一个内部类 TrackBase,它是用于播放音轨的 Track 类的基类,当 应用程序创建一个播放音轨时,AudioFlinger 会创建一个对应的 Track 类实例。 PlaybackThread 的内部类Track 用于普通的播放,对应于应用层的 AudioTrack 。继 承自 Track 的内部类 OutputTrack 用于具有多个输出设备的音轨的播放,蓝牙播放 开启时使用这个类。RecordThread 的内部类RecordTrack 用于录制音轨,对应于应 用层的 AudioRecord 。

Track 和 RecordTrack 都继承自 TrackBase 类。MixerThread 和 DirectOutputThread 都继承自 PlaybackThread ,MixerThread 是 默认的播放线程,两者都在 AudioFlinger的 openOut 函数中创建。当 flags 为 AudioSystem::OUTPUT_FLAG_DIRECT 或者音频格式不是PCM_16_BIT 或者信道 不是 CHANNEL_OUT_STEREO 时,DirectOutputThread 线程对象被创建,否则 MixerThread 线程对象被创建。创建的线程和它的 ID 会保存在 mPlaybackThreads 中,mPlaybackThread 是一个 Vector ,AudioFlinger 创建的线程都会保存在里面。DuplicatingThread 继承自 MixerThread ,当音频要从两个设备中同时输出时, DuplicatingThread 会被创建。例如想要同时从手机的扬声器和蓝牙耳机中听到铃 声,需要在 AudioPolicyManagerBase 中调用 AudioFlinger 的 openDuplicateOutput 方法创建 DuplicatingThread 。

系统运行时,AudioFlinger 的mPlaybackThreads(存放线程的容器)里会存放 多个线程,每个线程里会创建多个 Track 。播放线程实际上是 MixerThread 的一个 实例。MixerThread 的threadLoop() 中,会把该线程中的各个 Track 进行混合,有时 还要进行 ReSample(重采样)的动作,转换为统一的采样率,然后通过音频系统 的硬件抽象层输出音频数据。第三章 音视频系统的研究与扩展212 .音频服务 AudioPolicyServiceAudioPolicyService 是音频系统的另一个服务,继承自 IAudioPolicyService 接 口,通过 IAudioPolicyService 基于 Android 的Binder 机制向本地库libmedia 提供服 务。AudioPolicyService 提供根据不同的音频策略设置不同的音频输入、输出设备 服务;通过 setDeviceConnectionState 和 getDeviceConnectionState 方法设置和获取 输入、输出设备的连接状态;通过 setPhoneState 和 setRingerMode 方法设置电话状 态和响铃模式;通过 setStreamVolumeIndex 和 getStreamVolumeIndex 方法提供设置 和获取音量的服务;通过 setParameters 和 getParameters 方法提供设置和获取音频 参数的服务。

作用:将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理,。如果在程序中需要通过基类指针(如使用该继承层次的某个类中所包含的指向基类对象的指针成员p)来调用f,则必须使用dynamic_cast将p转换为指向派生类的指针,才能调用f。行动:对象指向一个基类(或参考)cast一个指向派生类,dynamic_cast将基于一个基类指针确实是一个指针指向继承类做相应的处理,。

realplayer插件_realplayer播放器下载_下载realplayer播放器

音 频策略管理类实现了AudioPolicyService 中的大部分管理工作,包括音量管理、音 频策略管理、输入输出设备管理等。下面详细分析 AudioPolicyManagerBase 中音 量管理、音频策略管理和输入输出设备管理的实现。(1) 音量管理的实现AudioPolicyManagerBase 定义了 initStreamVolume、setStreamVolumeIndex 及 getStreamVolumeIndex 方法 ,分别用来初始化音量 、设置音量及获取音量 。 AudioSystem.h 中定义了如下 10 种音频流类型:VOICE_CALL (用于电话呼叫,有 5 个音量级别),SYSTEM (用于系统声音,有 7 个音量级别),RING (用于电话 铃声和信息提醒,有 7 个音量级别),MUSIC(用于音乐或视频播放,有 15 个音 量级别),ALARM(用于闹铃等警报声音,有 7 个音量级别),NOTIFICATION (用于通知音,有 7 个音量级别),BLUETOOTH_SCO(用于连接到蓝牙时的电 话呼叫,有 15 个音量级别),ENFORCED_AUDIBLE (是一种不能被用户调成静 音的声音,必须被路由到扬声器,有 7 个音量级别),DTMF(用于 DTMF 音, 有 15 个音量级别),TTS (用于 TTS,15 个音量级别)。

AudioPolicyManagerBase.h 定义了一个用来控制音量的音频流描述类 StreamDescriptor。该类定义了如下四个 成员变量:mIndexMin(最小音量级)、mIndexMax(最大音量级)、mIndexCur (当前音量级)、mCanBeMuted(用于判断音频流能否设为静音的布尔值)。通 22Android 平台上音视频系统的研究及播放器开发 过 StreamDescriptor mStreams[AudioSystem::NUM_STREAM_TYPES]定义一个数 组,数组的下标是上面提到的音频流类型,每个数组元素都包含 StreamDescriptor 中定义的描述音频流的四个变量。在 initStreamVolume 方法中,用从AudioService 传入的每个音频流类型的最小音量级和最大音量级 ,分别给数组元素中的 mIndexMin 和 mIndexMax 赋值。在 setStreamVolumeIndex 中,用从应用层传下的 音频流当前音量级给数组元素中的 mIndexCur 赋值,然后把这个整数的音量级转 化为适合人耳的对数级别。

最后通过 AudioPolicyService 的 AudioCommandThread 线程将音量设置应用到 AudioFlinger 的相应的Track 中。(2) 音频策略管理的实现音频策略管理,即是根据音频流类型和相应的音频路由策略,把音频流输送 到不同的输出设备去播放或者从不同的输入设备获取音频流。上面已经提到, AudioSystem.h 文件中定义了 10 种音频流类型。AudioPolicyManagerBase.h 文件中 定义了四种音频路由策略 ,即 STRATEGY_MEDIA 、STRATEGY_PHONE 、 STRATEGY_SONIFICATION 和 STRATEGY_DTMF 。AudioSystem.h中定义了 DEVICE_OUT_SPEAKER 、DEVICE_OUT_WIRED_HEADSET 等 14 种音频输出 设备,DEVICE_IN_COMMUNICATION 等 10 种音频输入设备。音频策略管理类 定义了getStrategy(AudioSystem::stream_type stream)方法,用来根据不同的音频流 类型返回相应的路由策略。

如果音频流类型用于电话呼叫或连接到蓝牙时的电话 呼叫,返回 STRATEGY_PHONE 策略;如果音频流类型用于电话铃声、信息提 醒、警报及强制性声音,返回 STRATEGY_SONIFICATION 策略;如果音频流类 型用于 DTMF 音,返回 STRATEGY_ DTMF 策略;如果音频流类型用于系统声音、 TTS 音、音乐及视频等,返回 STRATEGY_MEDIA 策略。getDeviceForStrategy 方 法则是根据不同的音频路由策略返回不同的可用输出设备。(3) 输入输出设备管理的实现上面提到,AudioSystem.h 中的枚举类型 audio_devices 定义了 14 种输出设备 和 10 种输入设备,这些设备被定义为一个 32bit 整数的某一个位。同时这些设备 可以进行位或操作 , 比如可以设置 AudioSystem::DEVICE_OUT_SPEAKER| AudioSystem::DEVICE_OUT_WIRED_HEADSET 表示同时选择了扬声器和耳机。 然后调用 setOutputDevice方法来 实现 声音同时从耳机和扬声器输出 。

主要参数输出分辨率:全高清解码分辨率720p,1080i,1080p产品类别:网络高清播放机视频接口:支持hdmi,分量(ypbpr)的480p,720音频播放:支持mp3,wav,m4a,ogg,aac,lpcm视频播放:支持h.264,mkv,wmv9,mpeg1/2/4,h图片格式:jpg,bmp,gif存储介质:内置sata接口,支持3.5寸硬盘音频接口:支持光纤数字音频输出和rca模拟音频其他功能:支持p2p下载,可以边下载边播放6、清华同方灵悦智能电视报价:¥549。主要参数输出分辨率:可以设置输出为720p或1080p模式产品类别:高清播放机,网络播放机,智能电视盒视频接口:hdmi1.4,yprpb音频播放:音频格式支持:mp3,amr,wav,mid,视频播放:预装高清播放软件,支持mpeg1/2/4,d音频接口:左右音频,同轴音频,光纤音频其他特点:支持硬件1080p全高清解码,板载4gfl其他功能:兔子视频—聚合全网视频,随时更新的7、美如画mp200。突然想起来...我自己的htpc是hdmi+dvi双口,其中一组dvi转接为hdmi是可以输出音频的,忽略了显卡芯片自带hdmi audio硬件的情况,建议找个转接线尝试一下,我查看t500r的显卡是8400,应该没问题,也就是说是支持数字音频输出的,最好的情况是通过一个转接线即可变成真的hdmi,自带音频,连接电视后看看播放设备是否有识别到电视的hdmi音频设备,设为默认音频播放设备即可。

MediaPlayerService 在 frameworks/base/media/libmediaplayerservice 下 ,这个目录 下还有 MediaRecorderClient 和 MetadataRetrieverClient 两个类。它们分别继承自 BnMediaRecorderClient 和 BnMetadataRetrieverClient, 分别通过 IMediaRecorder 和 IMetadataRetriever 为本地库中的 MediaRecorder 和 MetadataRetriever 提供服务。 MediaRecorderClient 主要通过如下方法为音视频的录制提供服务:设置音视频数据 源、输出格式、音视频编码格式、输出文件、视频大小及音频参数,实现开始、 停止等录制控制功能。MetadataRetrieverClient 主要通过获取媒体文件的元数据提 供服务,如获取媒体文件的缩略图、专辑、艺术家、作者、日期及视频格式等。如图 3.4 媒体播放器本地框架图所示,MediaPlayerService 的内部类 Client 继 承自BnMediaPlayer ,通过 BnMediaPlayer 的父类 IMediaPlayer 为 mediaplayer 提供 服务 。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-106431-5.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 周定王
      周定王

      往往都会导致行业混乱不堪

    热点图片
    拼命载入中...