博客
关于我
【三】Android MediaPlayer整体架构源码分析 -【设置数据源】【Part 2】
阅读量:670 次
发布时间:2019-03-15

本文共 1972 字,大约阅读时间需要 6 分钟。

setDataSource(int fd, int64_t offset, int64_t length) 是一个用于设置媒体文件数据源的重要方法,在 Android系统中这个方法在 MediaPlayerService 中起着关键作用。以下是对该方法的详细分析:

方法概述

该方法的主要目标是初始化媒体文件的数据源,通过文件描述符(fd)读取媒体内容并设置播放器的播放源。它通过多个步骤检查文件的有效性,处理文件状态,并通知客户端状态变化。

方法实现细节

  • 文件状态获取:方法首先使用 fstat 函数获取文件状态信息。统计文件的设备 ID、访问模式、用户 ID、组 ID 以及文件大小。这为后续检查提供了基础信息。

  • 文件存在性检查:如果 fstat 调用失败,会打印错误日志并返回 UNKNOWN_ERROR,表示文件读取失败。

  • 读取偏移量和长度检查:

    • 读取偏移量检查:如果 offset 大于等于文件大小,认为文件读取位置超出了文件范围,打印错误日志并返回错误状态。
    • 读取长度检查:计算 offset + length 是否超过文件大小。如果超过,将 length 调整为 sb.st_size - offset,确保不会读取超出文件范围的数据。
  • 创建玩家实例:通过 MediaPlayerFactory 创建对应类型的玩家对象。默认为 NU_PLAYER 类型。

  • 播放器初始化:获得玩家实例后,初始化玩家并设置回调,用于接收通知和事件。

  • 状态更新:通过回调通知客户端数据源设置完成的状态变化。

  • 具体实现步骤

  • 文件状态信息打印:

    ALOGV("st_dev  = %" PRIu64 "", static_cast
    (sb.st_dev));ALOGV("st_mode = %u", sb.st_mode);ALOGV("st_uid = %lu", static_cast
    (sb.st_uid));ALOGV("st_gid = %lu", static_cast
    (sb.st_gid));ALOGV("st_size = %" PRId64 "", sb.st_size);
  • 读取偏移量和长度验证:

    if (offset >= sb.st_size) {    ALOGE("offset error");    return UNKNOWN_ERROR;}if (offset + length > sb.st_size) {    length = sb.st_size - offset;    ALOGV("calculated length = %" PRId64 "\n", length);}
  • 玩家对象创建和初始化:

    player_type playerType = MediaPlayerFactory::getPlayerType(this, fd, offset, length);sp
    p = setDataSource_pre(playerType);if (p == NULL) { return NO_INIT;}// 初始化并配置播放器sp
    player = p.get();player->setUID(mUid);mStatus = setDataSource_post(p, p->setDataSource(fd, offset, length));
  • 回调设置和通知:

    mAudioOutput = new AudioOutput(mAudioSessionId, IPCThreadState::self()->getCallingUid(),mPid, mAudioAttributes, mAudioDeviceUpdatedListener);static_cast
    setAudioSink(mAudioOutput);
  • 重要点总结

    • 文件状态验证:确保 offset 和 length 符合文件大小,避免越界。
    • 播放器类型创建:通过工厂类 MediaPlayerFactory 创建适当类型的玩家对象,以优化性能。
    • 回调机制:通过回调通知客户端状态变化,确保客户端能及时响应数据源获取完成。
    • 死亡通知处理:设置死亡通知器,监控相关服务进程的状态,避免媒体播放中断。

    总结

    setDataSource 方法通过细致的文件状态检查、播放器对象创建和状态通知,确保媒体数据源获取过程的稳定性和一致性。这一过程的每一步都体现了对系统资源管理和状态同步的重视,为后续媒体播放流程的顺利执行奠定基础。

    转载地址:http://popmz.baihongyu.com/

    你可能感兴趣的文章
    Python“文件存在“制作目录时出错
    查看>>
    Python、IMAP 和 GMail.将消息标记为已查看
    查看>>
    python一个一个获取迭代器的元素
    查看>>
    python一维数组 提取_python – 如何从numpy中的1维数组中提取零维切片
    查看>>
    python三大库之--numpy(一)
    查看>>
    python三大库之--numpy(二)
    查看>>
    python上的字无效字符_标识中的无效字符
    查看>>
    python下用decode和encode 中文转码
    查看>>
    Python下调用Linux的Shell命令
    查看>>
    Python接口自动化测试实战系列
    查看>>
    python下载_安装_配置_以及第一行python程序---python工作笔记009
    查看>>
    Python不协调机器人消息.内容
    查看>>
    Python与C#之间内存共享互传信息
    查看>>
    python与c语言混合编程_你试过C语言和Python一起混合编程吗?两者相加不是已经无敌了!...
    查看>>
    python与excel
    查看>>
    Python与Excel的完美邂逅:深入浅出,手把手教你轻松玩转Excel数据操作
    查看>>
    python与flask_Python编程中flask的简介与简单使用
    查看>>
    python与图灵机器人交互(WXPY版本)
    查看>>
    python与运算符_python运算符
    查看>>
    python两个列表获取交集,并集,差集
    查看>>