【mybatis学习项目源码】【同花顺鹰眼盯盘源码】【外卖配送管理系统源码】github 视频直播系统源码_github直播源下载

时间:2024-11-06 14:36:29 来源:网站源码怎么用 编辑:cms源码 下载

1.快速搭建去中心化视频分享平台peertube
2.7个精选开源免费的视频直播推流工具
3.音视频开源项目ZLMediaKit 的安装及使用介绍
4.求一套java开发PC端直播平台网站的源码
5.obsrtsp视频流转化为rtmp视频流?
6.H.266的现状(2024)

github 视频直播系统源码_github直播源下载

快速搭建去中心化视频分享平台peertube

       peertube是一款开源去中心化的视频分享平台,允许用户建立自己的直播直播载实例。相较于传统平台,系统peertube通过webtorrent技术,源码源下开启P2P功能,视频当多人观看同一视频时,直播直播载mybatis学习项目源码系统自动在用户设备上做种。系统此特性在大量用户观看同一视频时能显著减少服务器带宽压力,源码源下提升用户体验。视频

       本次教程适用于腾讯云轻量服务器4C4G8M实例,直播直播载使用步骤如下:

       源码:使用PeerTube源码。系统

       设备:腾讯云轻量服务器4C4G8M。源码源下

       最低需求:2C1G。视频注意配置对带宽和存储的直播直播载较高要求。

       云硬盘:挂载并格式化1TB存储。系统

       设置代理:使用腾讯云香港服务器搭建tinyproxy,设置GitHub代理。

       安装docker、docker-compose:确保docker服务启动。

       获取配置文件:修改.env文件。

       webserver启动:使用docker-compose启动。

       获取管理员账号密码:账号为PEERTUBE_ADMIN_EMAIL,密码在启动输出中。

       配置网站信息:在管理页面配置信息,支持markdown格式。

       转码:利用ffmpeg对视频进行切片,选择分辨率、线程数等参数。

       直播串流:安装4.x版本,开启后台设置。

       自定义修改:调整配置、自定义CSS和JS。

       联邦:关注其他peertube实例或频道,需被关注实例同意。

       上传界面允许修改视频信息,播放页面支持p2p分享同一视频同一分辨率的视频。视频下载可通过复制磁力链接,使用bt软件下载。iframe功能允许在其他网站上分享实例上的视频。注意:商业应用或UCG模式需使用海外服务器或解决相关法律及版权问题。

7个精选开源免费的直播推流工具

       1. OBS Studio (Github) - 这款免费且开源的软件是视频录制和直播的全能选手,拥有友好的用户界面和丰富的插件,特别适合网络主播和直播新手。

       2. Restreamer (Github) - 它的强大之处在于可以将内容同步到多个平台,无论是自建网站还是主流直播平台,Restreamer都能轻松应对。

       3. FFmpeg (Github) - 这个跨平台的库由Fabrice Bellard发起,Michael Niedermayer维护,不仅适用于编码和直播,还是开发者和非开发者手中的强大工具,支持GPU加速和多种系统。

       4. vMix - 作为现场制作的瑞士军刀,支持SRT、多格式直播录制和自定义字幕,适用于新闻、体育等复杂场景的需求。

       5. Wirecast - 专为直播制作设计,拥有多摄像机切换和高级视频制作功能,兼容多种流媒体格式,是专业直播的首选。

       6. MediaStream Recorder - 基于WebRTC的录屏工具,提供简便的音频视频录制解决方案。

       7. GStreamer - Linux平台的同花顺鹰眼盯盘源码多媒体处理基石,具有高度灵活性,可扩展性强,适用于各种多媒体应用。

       以上7个开源免费的直播推流工具各有特点,无论你是寻找简单易用的入门工具,还是寻求功能全面的专业平台,都能在其中找到满足你需求的选项。祝你在直播路上一帆风顺,创作出精彩纷呈的内容!

音视频开源项目ZLMediaKit 的安装及使用介绍

       ZLMediaKit是一个功能强大的开源流媒体服务器,特别适合实时音视频传输和处理应用,如直播、视频会议和监控。它支持RTSP、RTMP、HLS和HTTP-FLV等协议,具有低延迟和高并发处理能力,且能动态转码,并跨平台运行。

       要开始使用,首先从GitHub地址github.com/xia-chu/ZLMe...下载源代码。编译安装步骤适用于Linux环境,运行时可通过其HTTP API进行管理。API接口包括控制流媒体播放、获取状态信息、统计信息,以及配置服务器参数等,如:

       启动/停止流媒体:通过发送HTTP请求来控制。

       查看状态和统计:获取服务器连接数、流状态和带宽使用情况等。

       配置参数:如设置网络端口、转码设置和录制选项。

       录制与截图:支持控制服务器的录制和截图功能。

       实时监控:通过HTTP API监控服务器运行和日志。

       此外,HTTP API还支持通过UDP或TCP进行推流,例如循环播放视频,对于点播,ZLMediaKit支持通过mp4文件实现,例如rtsp://.../record/test.mp4,通过HTTP访问文件进行点播。

       在Linux下,音频设备的管理也很关键,可以使用aplay、pactl等命令查看和配置音频设备。而服务的推拉流,包括设备向服务器推流和从服务器拉流,也是通过API和相应的命令来操作的。

       最后,当遇到端口占用问题时,可以使用lsof和netstat命令在Linux中查找占用情况,以便进行相应的操作。ZLMediaKit的详细文档和更多视频教程可以在mirrors/xia-chu/zlmediakit/GitCode中找到。

求一套java开发PC端直播平台网站的源码

       java开发PC端直播平台网站的源码涉及比较专业的领域,建议通过自己学习进行创建。学习java开发推荐千锋教育,该教育机构采用全程面授高品质、高体验培养模式,拥有国内一体化教学管理及学员服务,助力更多学员实现高薪梦想。

       学习java开发有一个长远的职业规划,未来潜力无限。外卖配送管理系统源码Java岗位需求量每年以%左右的速度增长着,其中尤以Java程序员、Java工程师、Java架构师、技术总监最为缺乏。全国每年Java工程师的缺口高达万+。掌握一门高含金量的技能,拥有一份不菲的高薪职业,是大多IT职场人士的正确打开方式。中级工程师月入高达-K,高级工程师则有机会突破K;成为架构师和CTO更是年薪百万。

       想要了解更多有关java的相关信息,推荐咨询千锋教育。千锋企合作部整合大量企业客户资源,紧抓当下企业需求,将技术和项目完美结合千锋课程体系,力求培养更多优质人才服务企业,不断提升学员竞争力,链接企业用人标准的培训课程及实战项目,让企业招聘用人的技术要求与千锋学员的技术充分对接。近年来不断引进阿里钉钉小程序技术、红帽认证、腾讯云、亚马逊等,通过与企业的深度融合实现千锋教研和就业服务的迭代升级,专业性值得信赖。

obsrtsp视频流转化为rtmp视频流?

       要将obsrtsp视频流转化为rtmp视频流,首先需确认操作平台。对于Windows系统用户,直接利用官方工具可能有限制或不便。可考虑使用第三方工具作为替代方案,一款推荐的工具是github.com/daniulive/StreamCopier。

       StreamCopier是一款功能强大的视频流转换工具,支持将rtsp视频流转换为rtmp格式。使用StreamCopier时,只需按照以下步骤操作:

       1. 首先,确保在计算机上安装了StreamCopier。通常情况下,可以通过GitHub下载源代码并使用命令行或IDE进行编译,或寻找已编译的二进制文件。

       2. 打开StreamCopier,通过命令行界面输入rtsp视频流的URL和rtmp服务器的URL。请确保rtmp服务器的URL格式正确,并且提供足够的带宽以支持视频流的传输。

       3. 根据提示配置视频流的参数,例如音频和视频的编码格式、分辨率、帧率等。这些设置应根据实际需求进行调整,以确保转换后的视频流质量和兼容性。

       4. 点击开始按钮,StreamCopier将自动开始转换视频流。转换过程中,可能需要一段时间,具体取决于视频流的大小和网络状况。转换完成后,即可通过rtmp服务器进行直播或分发。

       总之,将obsrtsp视频流转化为rtmp视频流,通过使用StreamCopier等工具,Windows系统用户能够轻松实现视频流格式的转换。请根据实际需求选择合适的个人软件下载网页源码工具和参数设置,以确保转换过程顺利并达到期望的视频质量。

H.的现状()

       自年发布H.视频编码标准以来,经过三年多的发展,标准的应用情况已逐渐明朗。根据Bitmovin在年的调研结果,%的开发者在直播场景中采用H.。在开源软件方面,Fraunhofer HHI的VVenC编码器和VVdec解码器影响显著,最新版本分别为1.9和2.1.3,项目源码在GitHub开源。此外,有三个其他开源项目,虽影响力有限,但有助于H.标准的推广。值得注意的是,代码更新情况不一,部分项目已有一年未更新。

       在硬件解码器领域,电视顶盒等设备开始支持H.格式,但关于硬件编码器的消息尚未公开。目前,市场上已有收费的H.码流分析工具,但开源选择较少。在软件解码器方面,腾讯的Odec、阿里的Ali decoder、快手的KDec及字节的BVC Decoder等已被提及。尤其FFmpeg在年1月更新,增加了对VVC软件解码器的支持。

       综上所述,H.视频编码标准在直播、开源软件及硬件解码器领域展现出一定的应用潜力。未来,随着技术的持续发展和标准的进一步推广,其在更多场景下的应用有望得到更广泛的实现。

GitHub 官方开源的字体集「GitHub 热点速览」

       本周 GitHub 热点涵盖了多个领域,其中最引人注目的是 GitHub 官方开源的等宽字体集「monaspace」,它由五种可变轴字体组成,彼此兼容,提供给开发者友好且丰富的字体选项。此外,「draw-a-ui」项目利用 tldraw 和 gpt-4-vision api 将线框绘制转换为 HTML 页面,实现图形化界面的自动化生成,展示了 AI 在设计领域的应用潜力。

       在 LaTeX 提取方面,「LaTeX-OCR」项目尤为突出,通过输入中的 LaTeX 公式,自动提取并渲染成 LaTeX 格式,极大便利了公式编辑与知识共享。像素动画编辑器「aseprite」以其丰富的绘画工具和专业功能,吸引众多像素艺术家关注,成为设计领域的一大亮点。

       「inshellisense」作为微软开源的命令行自动补齐工具,其强大的功能和广泛的兼容性,让终端操作更为高效,尤其在支持大量命令行工具与多种操作系统方面表现出色。此外,「obs-studio」版本更新,新增安全模式与功能优化,为直播与录制视频场景提供了更多可能性。窗口管理器「yabai」则以其直观的命令行界面和强大的窗口管理功能,获得 macOS 用户的登录界面源码免费下载青睐。

       本周还出现了「Delta」这款无需越狱的 iOS 游戏模拟器,为经典游戏爱好者提供了新选择。而「auto-animate」项目则致力于为 Web 应用添加平滑过渡效果,简化了动画实现过程,增强了用户体验。

       通过 GitHub Trending 和 HelloGitHub 热项的分享,我们可以看到开源社区的创新与活力。无论是实用工具、AI 应用、游戏模拟,还是动画与设计工具,本周的 GitHub 热点都为开发者与用户提供了丰富的资源与灵感。欢迎各位积极参与,分享自己的发现与评价,共同推动开源社区的发展。

通过Frida创建API进行爬取内容——记一次爬取某视频App直播源的过程

       马上要过年了,过年了肯定是需要有电视作为背景音乐的,但是否有稳定的直播源呢?这时突然看到了“某视频App”里的电视功能,虽然也可以一键投屏到电视上,但突然想,是否可以抓包获取它的直播源?毕竟它在不登录的情况下,也是可以观看几十个频道的直播(虽然大部分只有P的清晰度)。因为自己也是第一次尝试去解包App,很多内容都是现查现学的,所以便做此记录,一是分享二是备忘。

       尝试抓包,工具:Charles、ApiPost7、Android手机、IPhone。首先要做的,肯定是抓包,看看他们之间都做了哪些勾当,我选用的是Charles。毫不意外,在抓包的时候就遇到了各种问题。在使用Android手机抓包的过程中,最开始遇到的是安装证书后,依旧SSL连接失败的问题。查了各种资料,发现Android7以上的系统,App可能不再信任用户自己添加的凭证,所以需要root手机后将凭证移到系统目录下。保存Charles证书到本地,使用openssl查询文件hash名,将证书文件重命名为:dde9.0,使用MT管理器或者adb工具,复制到手机 /system/etc/security/cacerts目录下。正常情况下,这时候在 加密与凭据 → 信任的凭据,“系统”标签下就能看到刚刚添加进去的证书了。如果你的Charles很长时间没用了,一定要看一下证书的过期时间,如果证书已经过期了,那最好重置一下证书。这时候会发现安装了证书后,打开网页或使用其他App都可以正常抓包,但打开某视频App,依旧是没有网络。之后又查资料,有可能某视频App使用了SSL Pinning技术,就是开发者只信任自己的证书。又在手机上安装了LSPosed以及JustTrustMe模块并启用后问题依旧。使用IPhone抓包,IPhone上安装证书的方式与Android不同,将证书文件下载到手机内后,在设置的“***与设备管理”中,先安装描述文件。然后再去 通用 → 关于本机 → 证书信任设置 中,启用证书。相对来说,iPhone的安装便简单了很多,并且打开某视频App后一切正常,Charles中也出现了各种请求。但这时会发现,Charles拦截的请求中,几乎全部都是乱码,但所幸有一条 的请求是可以被正常解码的,而这条请求也正包含了我们需要的直播源信息。多尝试几次,并分析一下请求的参数,从直觉上来看,最重要的就是cKey这个值。

       再使用ApiPost,反复测试大概猜出了defn、cnlid、livepid等几个参数代表的意义,也得知了platform、sdtfrom、appVer、encryptVer、cmd、cnlid、cKey等几个值为必填,所幸的是必填项里,也只有cKey是动态的,所以接下来我们就要看看怎么获取这个cKey值。

       使用Frida Hook获取cKey。如果是在网页端,那直接用开发者工具进行断点调试就可以了。但是如果是App端该如何呢?不论如何从逻辑上来讲,总归的思路是需要反编译App。查了些资料,反编译Android App比iOS App要方便些,所以便从Android入手。使用jadx反编译App,映入眼帘的都是a、b、c、d、e、f、g啥的。虽然不懂,但很明显已经是被混淆过的,可能这个已经是App的标配了吧,还好jadx有反混淆功能。反混淆之后,至少一切稍微可读性高了些。找到cKey相关的方法,既然请求的关键字是cKey,那么代码中总归是有和cKey相关的字眼吧?尝试全局搜索一下。能找到很多,甚至可以找到名为 com.tencent.qqlive.tvkplayer.vinfo.ckey 的包,但说实话到目前为止还没什么思路。再尝试搜索下抓包到的域名“liveinfo.ysp.cctv.cn”,这次相对目标就明确了一些,进去看一看。虽然不太懂Java,但看包名(com.tencent.qqlive.tvkplayer.tools.config)以及这段的大概意思应该是建立了一个索引,其他地方只要引用“zb_cgi_host”便代表着要对这条url搞点什么事。再继续搜索“zb_cgi_host”,这就有意思了,确实搜索到了有地方在使用“zb_cgi_host”,看大概得意思就是判断是使用主地址还是备用地址,随手向下一翻,就看到了一个HashMap,简单理解这个就是Python里的字典,类似于键值对。下面建立了一个cKey的键值对,跟着这个赋值,我们进去 Ce.ma() 看看。这里的代码没有进行混淆,意思也很明显了,我们跟进去再看看。来到 com.tencent.qqlive.tvkplayer.vinfo.ckey.CKeyFacade 这个类下面。这大段的代码,对于毫无经验的我来说,看着确实有些吃力,但其实可以借助chatGPT的力量来进行分析,直接让GPT告诉你答案就行。所以跟着GPT的指引,我们去看一下GenCKey函数。这里说明了这是一个原生方法,简单理解就是这个方法是包含在App引用的so库中,也确实在资源文件里找到了libckeygenerator.so文件,用IDA反编译后,确实也能找到一个GenCKey的方法。那么是否可以调用libckeygenerator.so文件里的GenCKey方法呢?从理论上来说应该是可以的,但这里面会涉及到处理器架构不同、so依赖等问题。我也尝试过在树莓派上调用、在手机里调用以及用 AndroidNativeEmu库来调用,均遇到了不同的问题……奈何水平及知识储备不足,只能放弃这个方法。使用Frida Hook getCKey方法,后续又在查资料的时候,了解到了Frida这个神器,它可以hook App在运行中使用的方法,并进行修改。那么我们是否可以用它做点什么呢?答案当然是肯定的,Frida功能很强大,作为初学者我也只能针对这个案例去逐步了解Frida。Frida的原理很简单,其实就是会在手机上运行一个server,然后可以在电脑上使用frida与之进行沟通。沟通的方式有两种,一种就是直接命令行用命令把JavaScript脚本发送到手机上,另外一种方式就是用Python脚本将JavaScript脚本发送到手机上。(目前我只了解这两种方式)。所以我们分别需要“服务端”与“客户端”。服务端在Frida的Github页面上直接下载对应的frida-server就行。在下载之前,可以使用adb命令查一下手机的cpu架构。将下载的文件解压出来,得到可执行文件,并复制到手机里运行。为了方便,我将下载的可执行文件重命名为frida-server。如果没有报错那么frida server就已经启动了。客户端可以使用Python的pip工具来安装,安装 frida 和 frida-tools。如果服务端和客户端都准备完毕了,那么就可以用一个简单的命令来使用frida。其中 frida-ps 是frida的工具之一, -U 指的是使用USB连接的设备。通过该命令,就可以看到手机中当前正在运行的进程。一切都准备好了,我们结合前面反编译的结果,来准备一个hook脚本。根据之前的分析结果,我们猜测cKey是由 com.tencent.qqlive.tvkplayer.vinfo.ckey.CKeyFacade 类下面的 getCKey 方法生成的,这个方法接受9个参数,并返回1个字符串,这个返回的字符串很可能就是我们需要的cKey。那么这9个参数分别是什么呢?有两种方式,一种方式使通过jadx一点点去分析,另外一种方式就是通过Frida Hook getCKey方法,来直接看下这9个参数都是什么。根据以上,我们准备一个脚本,并命名为test.js。脚本中 getCkey 中的 overload() 里的参数如果不知道怎么填,可以先不填。然后Frida会报错,报错信息中会包括几种可能的参数,选择对应的复制进去即可。然后我们可以将脚本注入程序中,试一下。其中“某视频”为进程名,可以通过 frida-ps -U 来查看进程(不知道为什么有的时候进程是包名,有的时候是中文的App名……)。如果没什么报错,那就说明Frida已经注入成功了,接着在手机上刷新下页面,或者切换直播流试试。紧接着,我们就可以看到控制台中有log输出了,得到了我们想要的东西,并且这输出的内容很可能就是我们需要的cKey。同时我们也可以多试几次以及根据反编译的结果分别得出这输入的9个参数分别是什么。

       到此为止,我们已经通过Frida Hook了getCKey方法,获得了其输入以及输出。其实jadx可以直接生成frida脚本,找到最开始找到的那个名为 ma() 的那个方法,鼠标右键,复制为frida片段。要注意的是,ma() 这个是jadx反混淆后的方法名,实际上App运行的时候这个方法名为 a() ,jadx在注释中也会注明原方法名,并且在自动生成的 frida片段 中也都进行了替换。但实际上运行这个脚本会发现,没有什么输出。其实是因为这个方法的输出是一个hashMap,我们需要把代码片段再加工一下,使控制台可以输出hashMap里的内容。如此,我们便可以获得所有的请求参数,然后进行分析了。那么,是否能获取到服务器响应的内容呢?回到jadx,来继续碰碰运气。试想一下,从逻辑上讲,直播源的请求与解析应该属于同一个模块,我们现在找到了请求的代码,那么解析的代码应该就在请求的代码附近。还是 com.tencent.qqlive.tvkplayer.vinfo.pc.Cd 这个类,我们找到这个类的文件位置。然后在同文件夹下翻一翻,很幸运地,我们翻到了 Ce 这个类,在这个类里,我们又看到了类似于json解析的日志输出。那么,我们有理由相信 com.tencent.qqlive.tvkplayer.vinfo.pc.Ce.ma 方法的作用就是解析响应json字符串的。根据以上的内容,我们替换成反混淆前的方法名,整理成脚本变为:到此为止,我们已经通过使用Frida Hook了请求和响应,现在我们就可以很方便地进行分析了。通过同样的方法,我们也可以获得请求直播源地址时所有参数的含义了。

       上面的所有案例中,Frida都是通过被动调用的方式来执行的,那么它可以主动调用对应的方法吗?这样就可以直接使用Frida创建一个api来获取cKey,然后使用Python来进行更多操作。Frida官方也提供了这样一个案例:简单说,就是通过frida提供的 rpc.exports ,来导出方法,以方便python可以随时调用。Python脚本远程调用Frida在实际应用的环境中,手机一直用USB连着电脑似乎也不太靠谱,而Frida也提供了远程调用的方式。让frida-server监听0.0.0.0那么之前注入脚本的命令也变成了在python中调用的方式,也变成了甚至也可以在虚拟机或者树莓派等设备中安装安卓系统作为专门的api服务器非实体Android系统若在树莓派中的Android系统,主要有两种选择。其他方案也可以参考大佬分享的安卓容器化部署方案:不管使用哪种方式,都需要自动启动应用以及frida,可以使用 Script Manager 来实现。

       最后可以将上述所有的整理成脚本即可根据自己的需求去获取各个直播流的地址了。WaterRequests.py config.py getCkey.js m3u8.j2 main.py

       最早在测试的时候,发现每个直播流的地址有效期大概是4小时左右,但后面开始批量获取直播流地址的时候每个直播流地址的有效期时间变得很短,大概十几分钟就失效了,猜测有可能和请求参数里的guid短时间内发送大量请求有关,但这些现在已经不重要了,更重要的是通过这次实践了解到的App爬虫思路。在我以往的应用中,一般只是爬取网页端的内容,所以下意识会认为如果要爬取App里的内容,需要分析大量的网络请求,甚至要破解各种加密算法。但通过这次实践,了解到了Frida神器,便完全可以换一种思路来爬取App中的内容,让App自己来成为核心算法的API服务器,借助这些api再去爬取App的内容,这样便可以省去很大一部分精力。另外,众所周知,某视频App本质上是由鹅厂的团队来开发的,所以在反编译过程中看到了大量的鹅厂使用的算法和框架。之所以Charles抓包的时候请求和响应都是乱码,也是因为其使用是jce协议,也就是使用的腾讯tars框架。在 com.tencent.videolite.android.datamodel.cctvjce 能看到大量的请求和响应的结构体,所有的请求数据都会经过这些结构体进行序列化成二进制流与服务器沟通,响应数据也同样经过结构体的反序列化后呈现在App中。

RTMP推流方案总结

       RTMP协议简介,其全称为Real Time Messaging Protocol,是由Adobe Systems公司为Flash播放器与服务器之间音频、视频和数据传输开发的私有协议。RTMP协议像一个容器,用于装载AMF格式的数据或FLV中的视/音频数据,一个连接可通过不同的通道传输多路网络流,通道中的包遵循固定大小的传输规则。更多协议细节请参考《rtmp specification 1.0》。

       RTMP服务器的选择有多种开源方案,如Nginx的rtmp插件,用于实时流推送,具体实现可参考另一篇博客。SRS(Simple RTMP Server)是一款国人开发的优秀开源流媒体服务器软件,使用C++开发,适用于直播、录播、视频客服等场景,提供丰富的接入方案和流变换功能,GitHub源码链接为:github.com/ossrs/srs。

       crtmpserver是一款由C++语言编写的开源RTMP流媒体服务器,功能相对简单,与Flash Player的兼容性较差,但代码结构良好,适用于学习RTMP协议和服务器端编程。GitHub源码链接为:github.com/shiretu/crtm...。

       livego是基于Go语言的RTMP直播服务器,Go语言为服务器性能而生,开发效率高于C/C++。GitHub源码链接为:github.com/gwuhaolin/liv...

       基于Go的livego服务器解决了语言级别上的并发问题。node-rtsp-rtmp-server是使用Node.js实现的RTMP服务器,GitHub源码链接为:github.com/iizukanao/nod...

       测试时,推荐使用大牛直播提供的推流工具,也可以使用FFmpeg进行推流。

       RTMP推流器的选择同样多样,librtmp软件包含一个基本的客户端:rtmpdump,以及提供RTMP协议支持的库。FFmpeg也能实现RTMP推流,内部集成了librtmp,官方给出了muxing.c源代码示例。srs-librtmp是srs提供的一个RTMP库,可以推送H数据,但在Windows环境下存在兼容性问题。

       音视频开发相关教程与资料可免费订阅QQ群:,领取学习资源。

copyright © 2016 powered by 皮皮网   sitemap