博客
关于我
【三】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);
  • 重要点总结

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

    总结

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

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

    你可能感兴趣的文章
    Objective-C实现http下载文件 (附完整源码)
    查看>>
    Objective-C实现Http协议下载文件(附完整源码)
    查看>>
    Objective-C实现ID3贪心算法(附完整源码)
    查看>>
    Objective-C实现IIR 滤波器算法(附完整源码)
    查看>>
    Objective-C实现IIR数字滤波器(附完整源码)
    查看>>
    Objective-C实现insertion sort插入排序算法(附完整源码)
    查看>>
    Objective-C实现integer partition整数分区算法(附完整源码)
    查看>>
    Objective-C实现integerPartition整数划分算法(附完整源码)
    查看>>
    Objective-C实现interpolation search插值搜索算法(附完整源码)
    查看>>
    Objective-C实现Interpolation search插值查找算法(附完整源码)
    查看>>
    Objective-C实现intersection交集算法(附完整源码)
    查看>>
    Objective-C实现intro sort内省排序算法(附完整源码)
    查看>>
    Objective-C实现inverse matrix逆矩阵算法(附完整源码)
    查看>>
    Objective-C实现inversions倒置算法(附完整源码)
    查看>>
    Objective-C实现isalpha函数功能(附完整源码)
    查看>>
    Objective-C实现islower函数功能(附完整源码)
    查看>>
    Objective-C实现isPowerOfTwo算法(附完整源码)
    查看>>
    Objective-C实现isupper函数功能(附完整源码)
    查看>>
    Objective-C实现ItemCF算法(附完整源码)
    查看>>
    Objective-C实现ItemCF算法(附完整源码)
    查看>>