} 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解码使用步骤:
- 创建解码器:
codec = MediaCodec.createDecoderByType(codecName); - 配置解码器格式:
codec.configure(format, null, null, 0); - 启动解码器:
codec.start() - 获取解码输入缓存ID:
dequeueInputBuffer - 获取解码输入缓存:
getInputBuffer - 获取解码输出缓存:
dequeueOutputBufferIndex - 释放输出缓存:
releaseOutPutBuffer - 停止解码器:
codec.stop();
Jni层封装对应的调用接口即可。
6.2 C层解码器使用
C层接口介绍:
- 创建Format:
AMediaFormat_new; - 创建解码器:
AMediaCodec_createDecoderByType; - 配置解码参数:
AMediaCodec_configure; - 启动解码器:
AMediaCodec_start;

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