FFmpeg: 自实现ijkplayer播放器--06封装打开和关闭stream

本文详细介绍了使用FFmpeg自实现ijkplayer播放器中stream的打开和关闭流程。流程包括初始化SDL、帧队列、包队列、时钟和音量,以及创建读取和视频刷新线程。在关闭流程中,会请求关闭读取线程,关闭解复用器,释放所有相关资源,包括解码线程、解码器、音视频设备、包队列和帧队列。

流程图

请添加图片描述

stream open

  • 初始化SDL以允许⾳频输出;
  • 初始化帧Frame队列
  • 初始化包Packet队列
  • 初始化时钟Clock
  • 初始化音量
  • 创建解复用读取线程read_thread
  • 创建视频刷新线程video_refresh_thread
int FFPlayer::stream_open(const char *file_name)
### ### 准备工作 在 Android 项目中集成 **ijkplayer** 播放器,首先需要从 Bilibili 的 GitHub 仓库获取源码,并选择合适的模块进行集成。ijkplayer 是基于 FFmpeg 的轻量级播放器,支持多种视频格式,如 RTMP、HLS、MP4 等[^1]。 项目源码编译后会在 `android/ijkplayer/` 目录下生成多个模块,其中: - `ijkplayer-java` 是必选模块,提供了 native 接口,用于调用底层播放功能。 - `ijkplayer-example` 包含了播放器的基本 UI 封装示例代码,开发者可以直接参考或复用。 - `ijkplayer-exo` 是可选模块,用于结合 ExoPlayer 进行扩展[^3]。 --- ### ### 集成步骤 1. **导入模块** - 在 Android Studio 中,将 `ijkplayer-java` 模块作为依赖导入到项目中。该模块封装了对底层播放器的调用接口,如 `IjkMediaPlayer` 类,其用法与标准的 `MediaPlayer` 类似[^4]。 - 若需要现成的 UI 控件,可将 `ijkplayer-example` 下的 `widget` 包复制到项目中,用于快速搭建播放器界面[^3]。 2. **配置 native 库** - 根据目标设备的 CPU 架构(如 armeabi-v7a、arm64-v8a、x86 等),将对应的 `.so` 文件复制到项目的 `jniLibs` 目录中。通常只需支持 `armeabi-v7a` 即可覆盖大部分设备[^3]。 3. **初始化播放器** - 在 Activity 或 Fragment 中创建 `IjkMediaPlayer` 实例,并设置数据源播放参数。例如: ```java IjkMediaPlayer ijkPlayer = new IjkMediaPlayer(); ijkPlayer.setDataSource("rtmp://example.com/live/stream"); ijkPlayer.setDisplay(holder); // SurfaceHolder ijkPlayer.prepareAsync(); ijkPlayer.start(); ``` 4. **释放资源** - 播放结束后,需调用 `release()` 方法释放播放器资源,避免内存泄漏: ```java ijkPlayer.release(); ``` --- ### ### 自定义与扩展 - 开发者可根据需求对播放器进行二次开发,例如添加自定义 UI 控件、支持硬解码/软解码切换、集成弹幕功能等[^2]。 - 若需要更高级的功能(如网络状态监听、播放状态回调等),可在 `ijkplayer-example` 的基础上进行扩展,或自行封装播放器逻辑[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八月的雨季997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值