从零开发一款Android RTMP播放器(1),三级缓存和二级缓存的区别

从零开发一款Android RTMP播放器(1),三级缓存和二级缓存的区别oar packet queue 5 3 Frame 类型 typedef struct OARFrame int size 帧大小 PktType e type 帧类型 int64 t dts 解码时间戳 int64 t pts 显示时间戳 int format 格式 用于视频 int width 宽 用于视频

大家好,我是讯享网,很高兴认识大家。

} oar_packet_queue;

5.3 Frame类型

typedef struct OARFrame {

int size;//帧大小

PktType_e type;//帧类型

int64_t dts;//解码时间戳

int64_t pts;//显示时间戳

int format;//格式(用于视频)

int width;//宽(用于视频)

int height;//高(用于视频)

int64_t pkt_pos;

int sample_rate;//采样率(用于音频)

struct OARFrame *next;

uint8_t data[0];

}OARFrame;

5.4 Frame队列

typedef struct oar_frame_queue {

pthread_mutex_t *mutex;

pthread_cond_t *cond;

OARFrame *cachedFrames;

OARFrame *lastFrame;

int count;//帧数量


讯享网

unsigned int size;

} oar_frame_queue;

6. 解码线程


我们的rtmp流拉取、解码、渲染、音频输出都在C层实现。在C层,Android 21之后系统提供了AMediaCodec接口,我们直接find_library(media-ndk mediandk),并引入<media/NdkMediaCodec.h>头文件即可。对于Android 21之前版本,可以在C层调用Java层的MediaCodec。下面分别介绍两种实现:

6.1 Java层代理解码

Java层MediaCodec解码使用步骤:

  1. 创建解码器:codec = MediaCodec.createDecoderByType(codecName);
  2. 配置解码器格式:codec.configure(format, null, null, 0);
  3. 启动解码器:codec.start()
  4. 获取解码输入缓存ID:dequeueInputBuffer
  5. 获取解码输入缓存:getInputBuffer
  6. 获取解码输出缓存:dequeueOutputBufferIndex
  7. 释放输出缓存:releaseOutPutBuffer
  8. 停止解码器:codec.stop();

Jni层封装对应的调用接口即可。

6.2 C层解码器使用

C层接口介绍:

  1. 创建Format:AMediaFormat_new;
  2. 创建解码器:AMediaCodec_createDecoderByType;
  3. 配置解码参数:AMediaCodec_configure;
  4. 启动解码器:AMediaCodec_start;
小讯
上一篇 2025-03-19 18:23
下一篇 2025-03-04 08:29

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/58295.html