热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

支持h265解码的手机,android封装wap

H265封装成RTP流(二H265封装成RTP流主要参考的文档为《draft-ietf-payload-rtp-h265-07.pdf》,在这个文档里面的第四章里进行


H265封装在RTP流中(2) ) )。


H265封装在RTP流中主要引用的文档为《draft-ietf-payload-rtp-h265-07.pdf》,在本文档的第四章中进行了详细描述。 H265封装在RTP数据包中,主要有四种模式。


1、将单个NAL单元软件包转换为RTP


2、多个NAL单元组成一个RTP分组


3、一个NAL单元成为多个RTP分组


4、PACI包


根据H264的封装方法和ffmpeg的内容,我们只有第一种和第三种。 由于网络的MTU大小为1500字节,所以这里选择1400字节作为一个RTP分组。 一个NAL单元在1400字节以下时,使用一个NAL单元数据包作为RTP,1400字节以上时,使用一个NAL单元作为多个RTP


staticvoidnal _ send (avformatcontext * S1,const uint8_t *buf,int size,int last ) ) ) ) ) ) ) )


{


RTPMuxContext *s=s1-priv_data;


enumavcodecidcodec=S1-streams [0]-codec-codec _ id;


av_log(S1,AV_LOG_DEBUG,' Sending NAL %x of len %d M=%d\n ',buf[0]0x1F,size,last );


if(size=s-max_payload_size ) {


int buffered _ size=s-buf _ ptr-s-buf;


int header_size;


int skip_aggregate=0;


if(codec==av_codec_id_H264 ) {


header_size=1;


skip _ aggregate=s-flags ff _ RTP _ flag _ h264 _ mod E0;


}


else


{


header_size=2;


}


//flushbufferednalunitsifthecurrentunitdoesn ' tfit


缓冲_大小2大小-最大_ payload _ size (if ) {


flush _ buffered (S1,0 );


buffered_size=0;


}


//If we aren't using mode 0,and the NAL unit fits including the


//Framing(2bytesLength,plus 1/2 bytes for the STAP-A/AP过时的丸子er )、


//writetheunittothebufferasastap-a/AP packet,otherwise flush


//and send as single NAL。


不使用/*模式0。 此NAL单元适合包含帧(长2字节,AP包)或发送单个NAL包(/


if (buffered _ size2header _ sizesize=s-max _ payload _ size


! skip_aggregate ) {


if(buffered_size==0) (


if(codec==av_codec_id_H264 ) {


*s-buf_ptr =24;


} else {


*s-buf_ptr =48 1;


*s-buf_ptr =1;


}


}


av_WB16(s-buf_ptr,size );


s-buf_ptr =2;


memcpy(s-buf_ptr,buf,size );


s-buf_ptr =size;


s-buffered_nals;


} else {


flush _ buffered (S1,0 );


ff_RTP_send_data(S1,buf,size,last );


}


} else {


int flag_byte,header_size;


flush _ buffered (S1,0 );


if (codec==av _ codec _ id _ h264 (s-flags ff _ RTP _ flag _ h264 _ mod E0 ) ) {


av_log(S1,AV_LOG_ERROR,


' NAL size %d %d,try -slice-max-size %d\n ',size,


s-max_payload_size,s-max_payload_size;


返回;


}


av_log(S1,AV_LOG_DEBUG,' NAL size %d %d\n ',size,s-max_payload_size );


if(codec==av_codec_id_H264 ) {


uint8_t type=buf[0]0x1F;


uint8_t nri=buf[0]0x60;


s-buf[0]=28; /* FU Indicator; Type=28 --- FU-A */


s-buf[0] |=nri;


s-buf[1]=type;


s-buf[1] |=1 7;


buf =1;


size -=1;


flag_byte=1;


header_size=2;


} else {


uint8_tnal_type=(buf[0]1)0x3F;


/*


* createthehevcpayloadheaderandtransmitthebufferasfragmentationunits (fu ) )。


*


* 0 1


* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5


*------------------------------------------------------。


*|f|type|tid |


----------------


*


* F=0


* type=49 (fragmentation单元(fu ) )


* LayerId=0


* TID=1


*/


s-buf[0]=49 1;


s-buf[1]=1;


/*


* create the FU header


*


* 0 1 2 3 4 5 6 7


------------


* |S|E| FuType |


*------------------


*


* S=variable


* E=variable


* FuType=NAL unit type


*/


s-buf[2]=nal_type;


/* set the S bit:旧式丸子as start fragment */


s-buf[2] |=1 7;


/* pass the original NAL header */


buf =2;


size -=2;


flag_byte=2;


header_size=3;


}


while (size header _ sizes-max _ payload _ size ) {


memcpy(s-buf[header_size]、buf、s-max_payload_size - header_size );


f_RTP_send_data(S1,s-buf,s-max_payload_size,0 );


buf=s-max _ payload _ size-header _ size;


size-=s-max _ payload _ size-header _ size;


s-buf[flag_byte]=~(1) 7;


}


s-buf[flag_byte] |=1 6;


memcpy(s-buf[header_size]、buf、size );


ff_RTP_send_data(S1,s-buf,size header_size,last );


}


}


注意:到目前为止还没有定义H265的payload值。 从ffmpeg的源代码来分析的话只有96。 这表示需要使用96或其他值自定义H265的payload值。


更新:该方式通过了VLC2.2.1测试。


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文介绍了在Cpp中将字符串形式的数值转换为int或float等数值类型的方法,主要使用了strtol、strtod和strtoul函数。这些函数可以将以null结尾的字符串转换为long int、double或unsigned long类型的数值,且支持任意进制的字符串转换。相比之下,atoi函数只能转换十进制数值且没有错误返回。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
author-avatar
保佑想-回丽水的阿卉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有