热门标签 | 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测试。


推荐阅读
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • 在分析和解决 Keepalived VIP 漂移故障的过程中,我们发现主备节点配置如下:主节点 IP 为 172.16.30.31,备份节点 IP 为 172.16.30.32,虚拟 IP 为 172.16.30.10。故障表现为监控系统显示 Keepalived 主节点状态异常,导致 VIP 漂移到备份节点。通过详细检查配置文件和日志,我们发现主节点上的 Keepalived 进程未能正常运行,最终通过优化配置和重启服务解决了该问题。此外,我们还增加了健康检查机制,以提高系统的稳定性和可靠性。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
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社区 版权所有