RTMP直播推流流程解析

先看问题?

  1. 推流推流,流从哪里来? ---->摄像头或者视频decode
  2. 假设来自摄像头,且把流封装成帧了,我怎么把帧组装成RTMP的格式—> RTMP的封装(RTMPPacket)
  3. 拿到了RTMPPacket怎么发送?----> 交给rtmp.c发送

摄像头信息封装成视频帧

//TODO 待补充

RTMPPacket的生成

SPS、PPS的封装
public void onSPSPPSInfo(byte[] sps, byte[] pps) {
   
                                if (rtmpPush != null) {
   
                                    rtmpPush.pushSPSPPS(sps, pps);
                                }
                            }
 /**
     * 将SPS PPS传递给native
     * @param sps
     * @param pps
     */
    public void pushSPSPPS(byte[] sps, byte[] pps) {
   
        if (sps != null && pps != null) {
   
            pushSPSPPS(sps, sps.length, pps, pps.length);
        }
    }

    private native void pushSPSPPS(byte[] sps, int sps_len, byte[] pps, int pps_len);

extern "C"
JNIEXPORT void JNICALL
Java_com_yxt_livepusher_network_rtmp_RtmpPush_pushSPSPPS(JNIEnv *env, jobject instance,
                                                          jbyteArray sps_, jint sps_len,
                                                          jbyteArray pps_, jint pps_len) {
   
    jbyte *sps = env->GetByteArrayElements(sps_, NULL);
    jbyte *pps = env->GetByteArrayElements(pps_, NULL);

    // TODO
    if (rtmpPush != NULL && !exit) {
   
        rtmpPush->pushSPSPPS(reinterpret_cast<char *>(sps), sps_len, reinterpret_cast<char *>(pps),
                             pps_len);
    }

    env->ReleaseByteArrayElements(sps_, sps, 0);
    env->ReleaseByteArrayElements(pps_, pps, 0);
}

void RtmpPush::pushSPSPPS(char *sps, int sps_len, char *pps, int pps_len) {
   

    int bodysize = sps_len + pps_len + 16;// TODO 为什么要加16?
    RTMPPacket *packet = static_cast<RTMPPacket *>(malloc(sizeof(RTMPPacket)));
    RTMPPacket_Alloc(packet, bodysize);
    RTMPPacket_Reset(packet);

    char *body = packet->m_body;

    int i = 0
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值