博客
关于我
【三】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 FileDialog获取文件夹路径不是文件
    查看>>
    python filter过滤器的使用_python基础知识分享:zip()、filter函数和reduce如何使用?...
    查看>>
    python flask 请求code 400, message Bad request version
    查看>>
    Python UTC 日期时间对象的 ISO 格式不包括 Z(祖鲁语或零偏移)
    查看>>
    python valueerror object2_python遇到错误记录
    查看>>
    Python virtualenv
    查看>>
    python vue3实现大文件分段续传(断点续传)--带暂停和继续功能
    查看>>
    Python WebDriver如何打印整个页面源(html)
    查看>>
    Python WebSocket自动化测试:构建高效接口测试框架
    查看>>
    Python Web开发
    查看>>
    Python 优化提速的 8 个小技巧
    查看>>
    Python 余弦相似度与皮尔逊相关系数 计算
    查看>>
    python 使用execjs 报编码错误解决办法,UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xac in position 145: il
    查看>>
    python 使用filetype校验文件
    查看>>
    Python 使用flush函数将缓冲区数据立即写磁盘
    查看>>
    python 使用in判断不准确,in不好使
    查看>>
    Python 使用pandas 进行查询和统计详解
    查看>>
    Redis 配置文件redis.conf详细解释
    查看>>
    python网络爬虫(2)——scrapy框架的基础使用
    查看>>
    python 倒计时 9,8,7,。。。。。。0
    查看>>