当前位置: 首页 > news >正文

校园门户网站开发需求分析二级域名可以做网站

校园门户网站开发需求分析,二级域名可以做网站,淘宝客如何做淘宝客网站推广,娱乐手机网站开发rtp 在FFmpeg中,rtpenc是一个用于将音视频数据封装成RTP(Real-time Transport Protocol)数据包并发送到网络上的编码器。RTP是一种用于实时传输音视频数据的协议,常用于视频会议、流媒体等场景。 rtpenc可以将音视频数据封装成R…

rtp

在FFmpeg中,rtpenc是一个用于将音视频数据封装成RTP(Real-time Transport Protocol)数据包并发送到网络上的编码器。RTP是一种用于实时传输音视频数据的协议,常用于视频会议、流媒体等场景。

rtpenc可以将音视频数据封装成RTP数据包,并通过UDP协议发送到指定的IP地址和端口号。它支持多种音视频编码格式,如H.264、AAC等,并可以设置RTP头部信息、负载类型、时间戳等参数。

使用rtpenc,可以将FFmpeg中的音视频数据实时传输到网络上,实现实时音视频传输的功能。例如,可以将摄像头采集的视频数据通过rtpenc编码后发送到网络上,实现视频监控、视频会议等应用。

ff_rtp_muxer

rtp muxer的定义中,默认的codec格式也是AV_CODEC_ID_MPEG4和AV_CODEC_ID_PCM_MULAW,rtp_write_packet可以看到这个rtp packet的封包发送过程。

const AVOutputFormat ff_rtp_muxer = {.name              = "rtp",.long_name         = NULL_IF_CONFIG_SMALL("RTP output"),.priv_data_size    = sizeof(RTPMuxContext),.audio_codec       = AV_CODEC_ID_PCM_MULAW,.video_codec       = AV_CODEC_ID_MPEG4,.write_header      = rtp_write_header,.write_packet      = rtp_write_packet,.write_trailer     = rtp_write_trailer,.priv_class        = &rtp_muxer_class,.flags             = AVFMT_TS_NONSTRICT,
};

rtp_write_packet

rtp_write_packet中根据codec_id,调用对应的ff_rtp_send_xxx函数,比如H264对应的是ff_rtp_send_h264_hevc:

static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) {RTPMuxContext *s = s1->priv_data;AVStream *st = s1->streams[0];int rtcp_bytes;int size= pkt->size;switch(st->codecpar->codec_id) {case AV_CODEC_ID_AAC:if (s->flags & FF_RTP_FLAG_MP4A_LATM)ff_rtp_send_latm(s1, pkt->data, size);elseff_rtp_send_aac(s1, pkt->data, size);break;case AV_CODEC_ID_H264:ff_rtp_send_h264_hevc(s1, pkt->data, size);break;   
}

ff_rtp_send_h264_hevc

该函数的主要作用是将H.264/HEVC视频流分割成NAL单元,并将其打包成RTP数据包进行传输。

该函数首先将传入的视频流数据buf1拷贝到RTPMuxContext结构体中,并设置当前时间戳为s->cur_timestamp。然后,该函数通过调用ff_avc_find_startcodeff_avc_mp4_find_startcode函数找到NAL单元的起始位置,并将NAL单元的数据通过nal_send函数打包成RTP数据包进行传输。最后,该函数通过调用flush_buffered函数将缓存中的数据进行传输。

需要注意的是,该函数中的s->nal_length_size表示NAL单元长度的字节数,不为0,buffer就是avcc类型,如果为0,就是annex

格式,根据起始码0x000001或0x00000001来找到buffer的结束位置。

void ff_rtp_send_h264_hevc(AVFormatContext *s1, const uint8_t *buf1, int size)
{const uint8_t *r, *end = buf1 + size;RTPMuxContext *s = s1->priv_data;s->timestamp = s->cur_timestamp;s->buf_ptr   = s->buf;if (s->nal_length_size)r = ff_avc_mp4_find_startcode(buf1, end, s->nal_length_size) ? buf1 : end;elser = ff_avc_find_startcode(buf1, end);while (r < end) {const uint8_t *r1;if (s->nal_length_size) {r1 = ff_avc_mp4_find_startcode(r, end, s->nal_length_size);if (!r1)r1 = end;r += s->nal_length_size;} else {while (!*(r++));r1 = ff_avc_find_startcode(r, end);}nal_send(s1, r, r1 - r, r1 == end);r = r1;}flush_buffered(s1, 1);
}

然后nal_send将NAL单元发送到RTP流中。NAL单元是视频编码中的基本单元,它包含了视频编码中的一个帧或片段。

nal_send首先检查NAL单元的大小是否小于等于最大负载大小,如果是,则将NAL单元添加到缓冲区中。如果缓冲区中已经有了一些NAL单元,则将它们作为STAP-A/AP包发送。如果NAL单元的大小大于最大负载大小,则将其分割成多个分片,并将它们作为FU-A包发送。

nal_send还根据编解码器类型设置了一些标志位,以便在发送NAL单元时进行适当的处理。例如,对于H.264编解码器,如果使用了FF_RTP_FLAG_H264_MODE0标志,则将NAL单元分割成多个分片。

ff_rtp_send_data

ff_rtp_send_data是rtp用于将数据通过RTP协议发送出去的函数。具体来说,它会构建RTP头部,将数据写入输出流,并更新一些统计信息。

void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
{RTPMuxContext *s = s1->priv_data;av_log(s1, AV_LOG_TRACE, "rtp_send_data size=%d\n", len);/* build the RTP header */avio_w8(s1->pb, RTP_VERSION << 6);avio_w8(s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7));avio_wb16(s1->pb, s->seq);avio_wb32(s1->pb, s->timestamp);avio_wb32(s1->pb, s->ssrc);avio_write(s1->pb, buf1, len);avio_flush(s1->pb);s->seq = (s->seq + 1) & 0xffff;s->octet_count += len;s->packet_count++;
}

函数的参数包括一个AVFormatContext结构体指针s1,一个指向数据缓冲区的指针buf1,数据长度len,以及一个标志位m。其中,s1包含了输出流的相关信息,buf1是要发送的数据,len是数据长度,m表示是否是最后一个数据包。

函数首先从s1中获取RTPMuxContext结构体指针s,该结构体包含了一些RTP相关的信息。然后,函数会使用avio_w8、avio_wb16、avio_wb32等函数将RTP头写入输出流中。其中,RTP头部的格式如下:

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X|  CC   |M|     PT      |       sequence number         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           timestamp                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           synchronization source (SSRC) identifier            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            contributing source (CSRC) identifiers             |
|                             ....                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

其中,V表示协议版本号,P表示是否有填充,X表示是否有扩展头部,CC表示CSRC计数器,M表示是否是最后一个数据包,PT表示负载类型,sequence number表示序列号,timestamp表示时间戳,SSRC表示同步源标识符,CSRC表示贡献源标识符。

接下来,函数会使用avio_write函数将数据写入输出流中,并使用avio_flush函数将输出流中的数据刷新。最后,函数会更新s中的一些统计信息,包括序列号、字节计数和数据包计数。

rtp_mpegts

rtp_mpegts是ffmpeg中支持的唯一一个rtp muxer,通过rtp_mpegts发送音视频数据,可以解决rtp支持一路流的问题,默认支持的audio codec是AAC,video codec是H264。

比如可以这样发送:

ffmpeg -re -stream_loop -1 -i h264.mp4 -i aac.mp4 -f rtp_mpegts rtp://10.0.1.1:5008

h264.mp4 - 只包含h264编码的视频文件

aac.mp4 - 只包含aac编码的音频文件

如果使用rtp发送,则会输出ERROR:“Only one stream supported in the RTP muxer”。

ffmpeg -re -stream_loop -1 -i h264.mp4 -i aac.mp4 -f rtp rtp://10.0.1.1:5008

ff_rtp_mpegts_muxer

const AVOutputFormat ff_rtp_mpegts_muxer = {.name              = "rtp_mpegts",.long_name         = NULL_IF_CONFIG_SMALL("RTP/mpegts output format"),.priv_data_size    = sizeof(MuxChain),.audio_codec       = AV_CODEC_ID_AAC,.video_codec       = AV_CODEC_ID_MPEG4,.write_header      = rtp_mpegts_write_header,.write_packet      = rtp_mpegts_write_packet,.write_trailer     = rtp_mpegts_write_close,.priv_class        = &rtp_mpegts_class,
};

write_header函数中,指定codec id为AV_CODEC_ID_MPEG2TS,这个会在rtp enc中处理,调用rtp_send_mpegts_raw,发送mpegts数据。

    st->time_base.num   = 1;st->time_base.den   = 90000;st->codecpar->codec_id = AV_CODEC_ID_MPEG2TS;rtp_ctx->pb = s->pb;

所以,rtp muxer直接对音视频数据封包成rtp payload进行发送,而rtp_mpegts则对音视频数据先进行mpegts封装,然后再封装为rtp payload发送。

http://www.hyszgw.com/news/36419.html

相关文章:

  • 丰台怎样做网站软件ui设计怎么做网站
  • 域名注册后 免费自建网站手机关联网站
  • 几大门户网站云购网站做的起来吗
  • 公司介绍网站模板wordpress如何建目录
  • 做外贸网站咨询做网站需要多少钱 百度
  • 网站后台建设内容做食品生产的网站
  • 网站成立时间查询西安优秀的集团门户网站建设费用
  • 扁平化设计网站sem推广竞价
  • 成都 企业网站建设公司wordpress上卖什么用
  • 卡片式网站在本地安装wordpress
  • 单页网站 挣钱阿里云备案网站建设方案书范文
  • 网站建设制作设计seo优化南宁在线详情页制作
  • 厦门外贸企业网站建设营业推广的概念
  • 首钢建设集团山东公司网站昆明网站建设流程
  • 英文商城网站网站 转成 微信小程序
  • 网站建设开发语公司宣传片拍摄脚本
  • 你的网站尚未进行备案河北省住房城乡建设局网站首页
  • 外贸网站模板下载搭建网站要用到的工具
  • 网站开发人员晋升体系全国最火的加盟项目
  • 驻马店做网站公司自己做网站自己买服务器
  • 建设风景区网站的目的住房建设厅网站
  • 企业网站空间备案吗好看的html页面
  • 广州白云学校网站建设云主机 几个网站
  • 石家庄logo设计公司宁波seo外包联系方式
  • 学校网站建设情况汇报个人简介html网页设计
  • 西安网站开发高端网站开发创建网站基本流程
  • wap网站自动怎么买网站
  • s什么网站可以接单做设计赚钱潍坊网站建设方案推广
  • 个人网站成功案例免费公司网站建设
  • 做海报用什么网站镇江个人网站制作