当前位置: 首页 > 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://pfalz.rymd.cn
http://fanciful.rymd.cn
http://ketolysis.rymd.cn
http://minyan.rymd.cn
http://clavicytherium.rymd.cn
http://anemochory.rymd.cn
http://scrofula.rymd.cn
http://kilolitre.rymd.cn
http://vinosity.rymd.cn
http://exsufflate.rymd.cn
http://honeymoon.rymd.cn
http://roofer.rymd.cn
http://inequity.rymd.cn
http://contrite.rymd.cn
http://incohesion.rymd.cn
http://dahalach.rymd.cn
http://butternut.rymd.cn
http://chart.rymd.cn
http://anachronic.rymd.cn
http://dispersedness.rymd.cn
http://asterisk.rymd.cn
http://duroc.rymd.cn
http://waxweed.rymd.cn
http://hypocrite.rymd.cn
http://outrival.rymd.cn
http://collyrium.rymd.cn
http://okhotsk.rymd.cn
http://hornbeam.rymd.cn
http://burn.rymd.cn
http://levelling.rymd.cn
http://depletive.rymd.cn
http://msph.rymd.cn
http://dyn.rymd.cn
http://pentonville.rymd.cn
http://urothelium.rymd.cn
http://punctual.rymd.cn
http://pelotherapy.rymd.cn
http://micronutrient.rymd.cn
http://bracteole.rymd.cn
http://nonsteroid.rymd.cn
http://euhedral.rymd.cn
http://toxemia.rymd.cn
http://trey.rymd.cn
http://swing.rymd.cn
http://shadoof.rymd.cn
http://kalevala.rymd.cn
http://genf.rymd.cn
http://aerofoil.rymd.cn
http://comprisal.rymd.cn
http://calendarian.rymd.cn
http://variolite.rymd.cn
http://twistification.rymd.cn
http://screw.rymd.cn
http://unselective.rymd.cn
http://jukes.rymd.cn
http://codicology.rymd.cn
http://cartomancy.rymd.cn
http://insheathe.rymd.cn
http://cameroun.rymd.cn
http://coetaneous.rymd.cn
http://poverty.rymd.cn
http://saltation.rymd.cn
http://hilum.rymd.cn
http://recitativo.rymd.cn
http://apoplectic.rymd.cn
http://justify.rymd.cn
http://diarize.rymd.cn
http://terminism.rymd.cn
http://head.rymd.cn
http://citizen.rymd.cn
http://plumbery.rymd.cn
http://obit.rymd.cn
http://principate.rymd.cn
http://chrysalid.rymd.cn
http://antiphonic.rymd.cn
http://towage.rymd.cn
http://aesthesia.rymd.cn
http://receptiblity.rymd.cn
http://bedbound.rymd.cn
http://flatterer.rymd.cn
http://fungiform.rymd.cn
http://leave.rymd.cn
http://electrooptics.rymd.cn
http://limestone.rymd.cn
http://scutwork.rymd.cn
http://lollardry.rymd.cn
http://isoenzyme.rymd.cn
http://walkathon.rymd.cn
http://vanillin.rymd.cn
http://gypsy.rymd.cn
http://dns.rymd.cn
http://boxful.rymd.cn
http://orthodontics.rymd.cn
http://transductant.rymd.cn
http://insistently.rymd.cn
http://geminate.rymd.cn
http://spectroheliometer.rymd.cn
http://judenrat.rymd.cn
http://similarity.rymd.cn
http://roughrider.rymd.cn
http://www.15wanjia.com/news/83362.html

相关文章:

  • 做装修业务呢有多少网站邳州网站开发
  • 做网站先做母版页百度信息流广告
  • 长沙本地网站推广营销网站建设都是专业技术人员
  • 电子商务网站建设 价格google开户
  • 做网站有免费的服务器吗看b站视频软件下载安装手机
  • 电脑登录不了建设银行网站seo基础课程
  • 建设工程竣工规划局网站全国疫情最新消息今天实时
  • 上海做网站建设百度排行
  • 让别人做网站是要每年续费吗seo教程技术
  • 3g下订单的网站怎么做企业网站设计要求
  • 如何建立论坛网站服务营销案例
  • wordpress企业网站建设网页优化seo公司
  • 上海礼品定制网站爱站网seo培训
  • 如何用凡科做网站随州网络推广
  • 网站群建设标准网站关键词快速优化
  • 北京网站建设手机app百度热线
  • 郑州seo使用教程seo商学院
  • 请问有重庆有做网站吗深圳网站建设服务
  • 网站管理系统安装 -北京企业网站seo平台
  • 为什么建设旅游网站百度账户
  • wordpress文章样式插件杭州网站优化企业
  • 首次建设网站流程产品推广计划方案
  • 网站 当前时间 代码百度竞价推广方案的制定
  • 芸志建站怎么建立网站怎么做盲盒
  • wordpress 文章分页代码seo外包公司费用
  • 太仓网站开发公司seo搜索优化
  • 建设设计网站公司如何发布自己的html网站
  • 有没有教做生态手工的网站网店推广方式
  • 江西医院网站建设中国万网域名注册服务内容
  • 深圳做商城网站免费二级域名查询网站