metartc5_jz源码阅读-yang_push_h264_encodeVideo

2024-01-08 01:04

本文主要是介绍metartc5_jz源码阅读-yang_push_h264_encodeVideo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//编码rtp的视频buffer,发送给p2p对端。
int32_t yang_push_h264_encodeVideo(YangRtcSession *session, YangPushH264Rtp *rtp,YangRtpPacket *pkt) {int err = 0;//用videoRtpBuffer中的数据填充rtp->buf.yang_init_buffer(&rtp->buf, yang_get_rtpBuffer(rtp->videoRtpBuffer),	kRtpPacketSize);//用pkt->header中的数据填充rtp->bufif ((err = yang_encode_rtpHeader(&rtp->buf, &pkt->header)) != Yang_Ok) {return yang_error_wrap(err, "rtp header(%d) encode packet fail",pkt->payload_type);}//如果payloadType为raw,则从rtp->videoRawData中读取数据填充rtp->bufif (pkt->payload_type == YangRtspPacketPayloadTypeRaw) {err = yang_encode_h264_raw(&rtp->buf, &rtp->videoRawData);} else if (pkt->payload_type == YangRtspPacketPayloadTypeFUA2) {//如果payloadType为FUA2,则从rtp->videoFua2Data中读取数据填充rtp->buferr = yang_encode_h264_fua2(&rtp->buf, &rtp->videoFua2Data);} else if (pkt->payload_type == YangRtspPacketPayloadTypeSTAP) {//如果payloadType为STAP,则从rtp->stapData中读取数据填充rtp->buferr = yang_encode_h264_stap(&rtp->buf, &rtp->stapData);yang_reset_h2645_stap(&rtp->stapData);}if (err != Yang_Ok) {return yang_error_wrap(err, "rtp payload(%d) encode packet fail",pkt->payload_type);}//如果padding_length大于0时,则增加header的size.if (pkt->header.padding_length > 0) {uint8_t padding = pkt->header.padding_length;if (!yang_buffer_require(&rtp->buf, padding)) {return yang_error_wrap(ERROR_RTC_RTP_MUXER,"padding requires %d bytes", padding);}memset(rtp->buf.head, padding, padding);yang_buffer_skip(&rtp->buf, padding);}//设置video的sendStats,包括rtp包数量、字节数、发送时间戳等。session->context.stats.on_pub_videoRtp(&session->context.stats.sendStats,pkt,&rtp->buf);//调用yang_send_avpacket将rtp包发送给p2p对端。return yang_send_avpacket(session, pkt, &rtp->buf);
}

这篇关于metartc5_jz源码阅读-yang_push_h264_encodeVideo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/581824

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易

red5-server源码

red5-server源码:https://github.com/Red5/red5-server