简介 在前面的两篇文章中:Android RTMP推流之MediaCodec硬编码一(H.264进行flv封装)介绍了如何MediaCodec进行H264硬编码,然后将编码后的数据封装到flv文件中。 Android平台下RTMPDump的使用介绍了如何将RTMPDump移植到Android平台下,并读取解析flv文件进行推流。 有了上面两篇文章的基础后,接下了就是整合,在Android平台下使用MediaCodec进行硬编码,然后使用RTMPDump进行推流。 先来张效果图: ? 我们还是使用Android RTMP推流之MediaCodec硬编码一(H.264进行flv封装)里的代码。 到这里Android层的调用就完成了,是不是很容易。 第三步 c++层方法实现 c++层推流逻辑的编写。我们将方法写到rtmp_handle.cpp。
很多开发者在做Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)时,总感觉接口不够用,以大牛直播SDK为例 (Github) 我们来总结下,我们常规需要支持的编码前音视频数据有哪些类型: * LANDSCAPE = 2; //横屏 home键在右边的情况 * LANDSCAPE_LEFT_HOME_KEY = 3; //横屏 home键在左边的情况 byte[] data, int width, int height, int y_stride, int v_stride, int u_stride, int rotation_degree); 3. 支持RGBA数据接入(支持裁剪后数据接入,主要用于同屏场景): /** * Set live video data(no encoded data). 支持RGB565数据接入(主要用于同屏场景): /** * Set live video data(no encoded data).
简介 前面讲到了在Android平台下使用FFmpeg进行RTMP推流(视频文件推流),里面主要是介绍如何解析视频文件并进行推流,今天要给大家介绍如何在Android平台下获取采集的图像,并进行编码推流 学习本章之前最好先看之前的文章,这里是一套连贯的教程 RTMP服务器搭建(crtmpserver和nginx) 音视频编码相关名词详解 基于FFmpeg进行RTMP推流(一) 基于FFmpeg进行RTMP 推流(二) Linux下FFmpeg编译以及Android平台下使用 Android平台下使用FFmpeg进行RTMP推流(视频文件推流) 打开摄像头并设置参数 具体代码查看CameraActivity.java (ofmt_ctx, pCodec)这个就和之前的推文件流一样了。 输出视频数据 ret = av_interleaved_write_frame(ofmt_ctx, &enc_pkt); 释放资源 在结束编码推流后我们也需要释放相关的资源 if (video_st
简介 前面已经讲到如何在Linux环境下编译FFmpeg以及在Android项目中使用,这一节就开始真正的使用FFmpeg。在Android平台下用FFmepg解析视频文件并进行RTMP推流。 新增推流函数 异常处理 设置回调方法 常见问题 源码 新增推流函数 首先我们将所有FFmpeg的操作抽取到一个类里面,然后增加推流方法。 推流(二)中使用的代码一致,我们直接拷贝过来即可。 源码见末尾 异常处理 在我们之前的推流代码中,并没有做异常处理。这样在正式的使用中肯定不太好的。所以我们加上try catch。统一进行资源释放。 源码见末尾 设置回调方法 为了方便我们查看推流的信息,我们新增一个回调类。
推流请求路径,文件存放路径 hls_path /usr/local/nginx/html/tv_file; #每个TS文件包含5秒的视频内容 测试: windows 终端 telnet 服务器地址 1935 遇到的问题: telnet不可用, 控制面板->程序和功能->启用和关闭Windows功能->勾选Telnet Client 7.推流测试 ,打开软件 在 来源 模块,点击+,媒体源,新建一个, 在本地文件添加一个视频文件上去, 勾选:循环、当源变为活跃状态时重新启动播放、在可用时使用硬件解码 在右下角 控件 模块,点击设置,点击推流 服务:自定义 服务器:rtmp://服务器地址:1935/tv_file 串流密钥:test(这处随便,也就是保存到服务器端的文件名) 开始推流: 然后在服务器段就可以看到 .ts .m3u8 文件 cd /usr/local/nginx/html/tv_file ls test-0.ts test-1.ts test-2.ts test.m3u8 8.拉流测试 下载安装
对应RTMP推流,业界有很多开源方案。如使用FFMPEG推流,librtmp(rtmp-dump),gstream推流。由于ffmpeg和gstreamer比较庞大,仅仅用来推流,有大炮打蚊子之嫌。 推流接口。 \n"); return 0; } 基本思路如下: 读文件----解析NAL单元---利用 SendData发送一个完成的NAL单元完成推流 编译main.cpp Wrapper_RtmpLib.cpp 运行可执行程序推流 . 3.如果是云主机,在云主机内不能推公网IP,而要推内网IP 192.168.1.226,客户端访问需要外网IP。 客户端播放效果如下:。
文章目录 一、 Java 层传入的 RTMP 推流地址处理 二、 RTMPDump 推流线程 三、 创建 RTMP 对象 四、 初始化 RTMP 对象 五、 设置 RTMP 推流地址 六、 启用 RTMP 独立线程推流 : RTMP 推流操作需要在一个独立的线程中完成 , 涉及到网络的操作都是耗时操作 , 在 Android 中都要在线程中执行 ; 2 . , 直接退出推流操作 ; 该地址就是 Java 层传给 JNI 的字符串 , 刚获取时是局部引用变量 , 将其拷贝到了堆内存中 , 才可以在推流线程中使用 ; // 3. ret) { __android_log_print(ANDROID_LOG_INFO, "RTMP", "设置 RTMP 推流服务器地址 %s 失败", pushPath); break ret) { __android_log_print(ANDROID_LOG_INFO, "RTMP", "设置 RTMP 推流服务器地址 %s 失败", pushPath);
文章目录 安卓直播推流专栏博客总结 一、 Android RTMP 直播推流简介 二、 Nginx、RTMP Module 编译环境源码准备 三、 pcre、OpenSSL、zlib 函数库安装 四、 编译安装 Nginx 五、 配置 RTMP 六、 修改 Nginx 和 RTMP Module 权限 七、 虚拟机网络配置 八、 启动 Nginx 服务器 一、 Android RTMP 直播推流简介 ---- Android 端直播推流原理 : ① 数据采集 : 使用 Camera 相机采集图像数据 , 使用 AudioRecord 采集声音 ; ② 数据编码 : 将图像和声音分别进行编码 , 视频使用 /bin 配置 : 将编译结果 , 安装到当前目录下的 bin 目录 ; ② --add-module=…/nginx-rtmp-module-1.2.1 配置 : 启用外部的 RTMP 直播推流模块 :~/rtmp/nginx-1.15.3# 3 .
教师端设备配置如果教师有移动PAD或其他Android设备,可以直接将音视频流推送到RTMP服务器,实现实时授课。 如果需要适应不同带宽或设备要求,可以使用FFmpeg等工具进行流的转码操作。2. 横竖屏适配在Android设备上,横竖屏切换时需要考虑屏幕宽高的变化,确保推拉流两端可以自动适配。 编码器需要重启以适应新的分辨率设置,拉流端也需要能够自动播放适应变化后的视频流。3. 补帧策略当屏幕静止不动时,为了避免播放端因帧间距过大而长时间收不到数据,可以采用补帧策略。 智慧教室方案选型本文以大牛直播SDK的Android的SmartServicePublisherV2的同屏demo为例,Android采集计时器,编码打包分别启动RTMP推送和轻量级RTSP服务,Windows 平台RTMP推送模块为例,我们主要实现了如下功能:音频编码:AAC/SPEEX;视频编码:H.264、H.265;推流协议:RTMP;[音视频]支持纯音频/纯视频/音视频推送;[摄像头]支持采集过程中,
服务器地址 rtmp = r'rtmp://txy.live-send.acg.tv/live-txy/' # 读取视频并获取属性 cap = cv2.VideoCapture(0) size = (int RTMP是什么? RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。 该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。 RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。 RTMP与HTTP一样,都属于TCP/IP四层模型的应用层。 树莓派是什么?
在前面一节基于FFmpeg进行RTMP推流(一)我们写了最简单的一版推流代码。但细心调试过的兄弟会发现当我们把文件换成mp4后,发现上面的代码在写入文件头时报错。也就是说上一版的代码是有bug的。 3.png 定位之后发现是在这里出错。 //写入头部信息 ret = avformat_write_header(octx, 0); 我们跟踪一下源代码: ? 说明我们推流的速度有问题。快了或慢了都会有问题。我们大概可以定位到,我们在计算延时的时候出现了错误。 ////////////////////////////////////////////////////////////////// // 准备推流 << endl; //推流每一帧数据 //int64_t pts [ pts*(num/den) 第几秒显示] //int64_t dts 解码时间 [P帧(相对于上一帧的变化
文章目录 一、 服务器搭建 二、 手机端推流 三、 电脑端观看直播 四、 RTMP 服务器端状态 一、 服务器搭建 ---- 首先按照 【Android RTMP】RTMP 直播推流 ( 阿里云服务器购买 | 远程服务器控制 | 搭建 RTMP 服务器 | 服务器配置 | 推流软件配置 | 直播软件配置 | 推流直播效果展示 ) 中的流程搭建服务器端 , 然后才能开始推流操作 ; 也可以按照 【Android RTMP】RTMP 直播推流服务器搭建 ( Ubuntu 18.04.4 虚拟机 ) 博客中的内容 , 在 VMWare 虚拟机中搭建 RTMP 直播推流服务器 ; 加粗样式配置说明 : ① HTTP ) ⑤ 将 RTMP 数据包发送到服务器端 : 【Android RTMP】RTMPDump 推流过程 ( 独立线程推流 | 创建推流器 | 初始化操作 | 设置推流地址 | 启用写出 | 连接 RTMP , 运行了 RTMP Module 应用 , 可以实现直播推流中功能 ; ② 推流端 : 直播推流端就是手机 , 手机端 Camera 采集 NV21 格式的图像数据 , 并使用 x264 将其编码为
前言 搭建基于rtmp协议的推流服务器。 download/nginx-1.12.2.tar.gz tar zxvf nginx-1.12.2.tar.gz rm nginx-1.12.2.tar.gz mv nginx-1.12.2 nginx 3、 备份文件 cp -r /etc/nginx /etc/nginx_bak mv /usr/sbin/nginx /usr/sbin/nginx_bak 下载rtmp模块 仓库地址:nginx-rtmp-module cd /usr/lib64/nginx/modules/ git clone https://github.com/arut/nginx-rtmp-module.git 添加依赖 cd /usr/local 推流请求路径,文件存放路径 hls_fragment 5s; #每个TS文件包含5秒的视频内容 } } } 启动nginx cd /usr/local/nginx
效果 Clion 中演示的效果 终端中运行也没有问题 思路 通过 fork 一个子进程来调用 ffmpeg 进行推流,视频帧通过 opencv 来获取,通过管道传输到子进程,实现推流 代码 需要注意的是 = "rtmp://localhost:1935/live/test"; std::stringstream command; command << "ffmpeg "; // infile the libx264 encoding preset to ultrafast << "-f flv " // force format to flv << rtmp_server_url ; cv::Mat frame; // 在子进程中调用 ffmpeg 进行推流 FILE *fp = nullptr; fp = popen(command.str().c_str( else { return EXIT_FAILURE; } } CMakeLists.txt: cmake_minimum_required(VERSION 3.20) project(rtmp_test
概况 转推流程序的过程:从一个观看地址拉流,然后推流到另一个推流地址。主要用于cdn之间转推,目前市面上大多数cdn厂商都愿意不支持动态转推,因此只能通过转推流程序进行转推。 中的代码是推流地址中没有加密串的情况下的握手过程代码,第二个链接handshake.h中的代码是推流地址中有加密串的情况下的握手过程代码。 抓包分析 以微赞和网宿为例 obs推流网宿握手成功的包点此下载 obs推流微赞握手成功的包点此下载 网宿推流没有走加密流程,S2和C1匹配,具体数据包截图如下: ? 微赞推流走加密流程,S2和C1不匹配,具体数据包截图如下: ? 到此,整个rtmp推流握手过程就比较清楚了。 至此,转推流成功,示例图如下: ? 结论 虽然Adobe公司自己出的rtmp协议不是iso标准的,但是你们这些公司好歹也尽量按照规定来啊,贼坑。
HLS Apple/ Android HTTP Apple/ Google 延时一个切片以上(一般10秒以上), Apple平台上HLS的效果比PC的RTMP还要好, 而且Apple所有设备都支持, Android :rtmp://rtmp.psvmc.cn/live/livestream HLS流地址为: http://rtmp.psvmc.cn/live/livestream.m3u8 HTTP回调 详细配置: /objs/srs -c conf/http.hooks.callback.conf 复制 测试推流 ffmpeg -re -stream_loop -1 -i /data/rtmptest.mp4 :rtmp://rtmp.psvmc.cn:1935/live/test 观看原始流:rtmp://rtmp.psvmc.cn:1935/live/test 命令转码流:rtmp://rtmp.psvmc.cn /log.txt & 复制 推流 ffmpeg -re -stream_loop -1 -i /data/rtmptest.mp4 -vcodec copy -acodec copy -f flv -
1、问题分析 我们以一个实际现网的case来引入该问题,3月9日,巴西地区的主播,流id:stream-2990700835946365032 在20:50-21:50这段时间整体的推流帧率非常低,丢帧非常严重 上述解决方案,在推流过程中,通过RTMP 302的方式获取到服务器慢速信息,根据客户端以及服务器端慢速信息,来进行断流重推,快速恢复直播,提高推流成功率。 对上述方案进行扩展,在开始推流时,利用302进行服务端的负载均衡。服务器端在刚收到客户端数据时,给客户端发送RTMP 302信息,来进行高负载302调度,提高推流的成功率。 3、结论 综上所述: 1、在推流过程中,给客户端发送RTMP 302控制消息,客户端使用服务器提供的重定向地址,进行断流重推,可以快速恢复推流异常,提升上行推流质量; 2、在推流开始时,服务器端可以综合后台机器负载以及带宽资源情况 3、兼容性好,能兼容新老客户端,是否检测RTMP 302 amf信息,完全由客户端控制。客户端可以根据自身情况,进行选择性使用。
HLS Apple/ Android HTTP Apple/ Google 延时一个切片以上(一般10秒以上), Apple平台上HLS的效果比PC的RTMP还要好, 而且Apple所有设备都支持, Android ://rtmp.psvmc.cn/live/livestream HLS流地址为: http://rtmp.psvmc.cn/live/livestream.m3u8 HTTP回调 详细配置:https /objs/srs -c conf/http.hooks.callback.conf 测试推流 ffmpeg -re -stream_loop -1 -i /data/rtmptest.mp4 -vcodec /objs/srs -c conf/ffmpeg.transcode.conf>log.txt & 推流 ffmpeg -re -stream_loop -1 -i /usr/local/srs2/doc /log.txt & 推流 ffmpeg -re -stream_loop -1 -i /data/rtmptest.mp4 -vcodec copy -acodec copy -f flv -y rtmp
本篇记录实现一个rtsp转rtmp直播流的程序!闲言少叙,接下来置入主题。 需求 有一个摄像头,比如海康的监控摄像头,可以通过rtsp流的方式访问其视频画面! 实现思路 我们的程序,称之为rtsp2rtmp,使用该程序实现拉取摄像头rtsp视频流,并将rtmp视频流转换为rtmp视频流,然后推送到直播服务器,直播服务器采用nginx+rtmp_module的方式实现 << std::endl; // 2.获得流信息 m_nRet = avformat_find_stream_info(m_pRtspAVFormatContext, 0); if (m_nRet codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { m_nAudioIndex = i; } } 打开输出流上下文 //3. << std::endl; //4. stream信息复制 AVCodecContext* rtmpOutCodec = avcodec_alloc_context3(outCodec);
如果我们使用了网络拉流和推流等等,要先初始化。 比如说一些MP3,AAC音频文件附带的专辑封面。 AVPacket AVPacket是存储压缩编码数据相关信息的结构体。 uint8_t *data:压缩编码的数据。 例如对于H.264来说。 ////////////////////////////////////////////////////////////////// // 准备推流 << endl; //推流每一帧数据 //int64_t pts [ pts*(num/den) 第几秒显示] //int64_t dts 解码时间 [P帧(相对于上一帧的变化 如果你是在无法解开这个问题,请看下节基于FFmpeg进行RTMP推流(二)