iOS直播-播放基于RTMP协议的视频

iOS直播技术开发完整指南 在iOS直播应用中,视频音频的采集是整个直播流程的起始点,对最终用户体验的影响至关重要。iOS设备由于其出色的硬件性能和优化的操作系统,为开发者提供了强大的采集工具和API。通过AVFoundation框架,开发者可以利用设备的摄像头和麦克风进行高质量的视频音频采集。视频音频编码是将视频或音频信号进行压缩的过程,以减少存储空间和传输带宽的需求。在iOS直播中,编码过程尤为重要,因为直播应用需要将音频和视频数据实时压缩,以确保流畅的直播体验。编码效率直接影响到直播的质量和成本。 阅读详情

流媒体协议介绍

1. 伪流媒体:

  • 渐进式下载 : 边下边存, 文件会保存
  • 使用http协议,也能够实现视频播放, 也能快进快退等, 体验上跟流媒体很像. 优酷, 土豆.这些网址就在使用这项技术.
  • 特点:实现简单, 成本也低

    2 流媒体:

    边下边播, 不会保存文件,特点:流过就没有了.常用的协议有两个,分别为HLS (HTTP Live Streaming) 和 RTMP (Real Time Messaging Protocol)

  • HLS (HTTP Live Streaming),Apple的动态码率自适应技术。主要用于Mac和iOS音视频服务。包括一个m3u(8)的索引文件(.M3u8),多个TS媒体分片文件(.ts)和key加密串文件。支持推流和播放. iOS自带的播放器就可以直接播放基于HLS协议的视频.

  • RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信.

  • RTMP实时消息传送协议协议概述编辑
    RTMP(Real Time Messaging Protocol)实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输 开发的开放协议。
    它有多种变种:
    1. RTMP工作在TCP之上,默认使用端口1935;
    2. RTMPE在RTMP的基础上增加了加密功能;
    3. RTMPT封装在HTTP请求之上,可穿透防火墙;
    4. RTMPS类似RTMPT,增加了TLS/SSL的安全功能;

3. iOS实现基于视频RTMP的视频直播

3.1 RTMP协议的视频播放

3.1.1 IJKPlayer简介
  • 我们使用Bilibili开源的IJKPlayer,来实现RTMP协议下的视频播放
  • ijkplayer 是bilibili对开源框架FFmpeg(一个基于C的软解码视频播放开源框架)的封装,它使用起来更加方便和简单。

3.1.2 下载并编译iOS版的ijkplayer

#下载 ijkplayer-ios
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios
#到` ijkplayer-ios`目录中
cd ijkplayer-ios
#切换到 `k0.5.1` 分支
git checkout -B latest k0.5.1
#运行iOS初始化脚本
./init-ios.sh
#进入到 iOS 文件夹
cd iOS
#清空编译
./compile-ffmpeg.sh clean
#编译全部,比较耗时,需要等待
./compile-ffmpeg.sh all
#使用Xcode打开ios文件夹下面的 IJKMediaPlayer 项目,分别在模拟器和真机上编译IJKMediaFramework.framework.

编译IJK.png


编译后一个用于模拟器一个用于真机


IJKMediaFramework编译结果.png


附: 如果你想把两个framework进行合并,可以使用lips -create 文件1 文件2 -o 要生成文件


需要合并的文件.png


注意:在测试阶段可以使用合并后的framework,当打包时候最好只使用真机的framework以减小安装包的大小

3.1.3 IJKMediaFramework.framework的基本使用
- (void)viewDidLoad {
    [super viewDidLoad];
//1. 根据当前环境设置日志信息
//1.1如果是Debug状态的
#ifdef DEBUG
//  设置报告日志
    [IJKFFMoviePlayerController setLogReport:YES];
//  设置日志的级别为Debug
    [IJKFFMoviePlayerController setLogLevel:k_IJK_LOG_DEBUG];
//1.2否则(如果不是debug状态的)
#else
//  设置不报告日志
    [IJKFFMoviePlayerController setLogReport:NO];
//  设置日志级别为信息
    [IJKFFMoviePlayerController setLogLevel:k_IJK_LOG_INFO];
#endif

// 2. 检查版本是否匹配
    [IJKFFMoviePlayerController checkIfFFmpegVersionMatch:YES];
// 3.  创建IJKFFMoviePlayerController
// 3.1 默认选项配置
    IJKFFOptions *options = [IJKFFOptions optionsByDefault];
// 3.2 创建播放控制器
    IJKFFMoviePlayerController *ffMoviePlayerController = [[IJKFFMoviePlayerController alloc] initWithContentURLString:@"rtmp://192.168.41.35:1935/gzhm/room" withOptions: options];
//4. 屏幕适配
// 4.1 设置播放视频视图的frame与控制器的View的bounds一致 
    self.player.view.frame = self.view.bounds;
// 4.2 设置适配横竖屏(设置四边固定,长宽灵活)
    self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
//  4.3 设置播放视图的缩放模式
    self.player.scalingMode = IJKMPMovieScalingModeAspectFit;
//  4.4 设置自动播放
    self.player.shouldAutoplay = YES;
//  4.5 自动更新子视图的大小
    self.view.autoresizesSubviews = YES;
//  4.6 添加播放视图到控制器的View
    [self.view addSubview:self.player.view];
}

#pragma mark - 视图即将显示
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
//  当试图即将展示的时候开始播放
    [self.player prepareToPlay];
}
#pragma mark - 视图已经消失
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
//  关闭播放
    [self.player shutdown];
}
3.1.4 暂停与播放
- (IBAction)play:(id)sender {
//  播放
    [self.player play];
}
- (IBAction)pause:(id)sender {
// 暂停
    [self.player pause];
}

效果图.png
3.1.5 添加播放状态的监听

IJKFFMoviePlayerController 支持的通知有很多,常见的有:

IJKMPMoviePlayerLoadStateDidChangeNotification(加载状态改变通知)
IJKMPMoviePlayerPlaybackDidFinishNotification(播放结束通知)
IJKMPMoviePlayerPlaybackStateDidChangeNotification(播放状态改变通知)

步骤:

  • 在viewWillAppear添加监听

    //  1. 添加播放状态改变的通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackStateDidChange:) name:IJKMPMoviePlayerPlaybackStateDidChangeNotification object:self.player];
  • 实现监听方法

- (void) playbackStateDidChange:(NSNotification *) notification {

//    NSLog(@"%@",notification);
//    IJKMPMoviePlaybackStateStopped,        停止
//    IJKMPMoviePlaybackStatePlaying,        正在播放
//    IJKMPMoviePlaybackStatePaused,         暂停
//    IJKMPMoviePlaybackStateInterrupted,    打断
//    IJKMPMoviePlaybackStateSeekingForward, 快进
//    IJKMPMoviePlaybackStateSeekingBackward 快退


    switch (self.player.playbackState) {
        case IJKMPMoviePlaybackStateStopped:
            NSLog(@"停止");
            break;
        case IJKMPMoviePlaybackStatePlaying:
            NSLog(@"正在播放");
            break;
        case IJKMPMoviePlaybackStatePaused:
            NSLog(@"暂停");
            break;
        case IJKMPMoviePlaybackStateInterrupted:
            NSLog(@"打断");
            break;
        case IJKMPMoviePlaybackStateSeekingForward:
            NSLog(@"快进");
            break;
        case IJKMPMoviePlaybackStateSeekingBackward:
            NSLog(@"快退");
            break;
        default:
            break;
    }   
}
  • 在viewDidDisappear移除监听
      [[NSNotificationCenter defaultCenter] removeObserver:self name:IJKMPMoviePlayerPlaybackStateDidChangeNotification object:self.player];
From:http://www.jianshu.com/p/a7d9ed02cf40




ijk动态库,支持rtsp、MP4格式 支持rtsp/mp4的ijkplayer动态编译库 立即下载

相关推荐

超实用!用ChimeraX对AlphaFold 结果可视化(中): 蛋白结构美化篇

而一般需要的背景颜色是无色(白色),有三种方法可以更改背景颜色,这里我们介绍两种方法,第三种在下一小节中讲解。如果想选中蛋白链中的某一结构区域或者某些位点,可以用Ctrl+Shift+鼠标左键,或在软件窗口中点击。在这个窗口中可以对蛋白的主链、侧链、表面等颜色进行修改,只用在。,即可在右下角看到我们蛋白的序列信息,在这里面直接用鼠标选择要选择的结构域。就会有更多的颜色供我们选择,如果有特定的色号还可以在这个界面继续选择。后面的颜色(②),就可以选择想要的任何背景颜色(③)。就可以选择软件推荐的常用颜色。

m0_63153079的博客 5483

iOS平台如何实现毫秒级延迟的RTMP|RTSP播放器

iOS平台播放,由于设备和系统比较单一,所以优先考虑硬解码,除了基础播放外,我们还实现了实时快照、实时录像、实时回调YUV数据、实时音量调节等,实际体验下来,iOS平台RTMP和RTSP,可以轻松毫秒级,感兴趣的开发者,可以和我单独交流。

大牛直播SDK 2125

思科—OSPF多区域配置实验

实验目的:配置OSPF多区域,使得不同网段的PC互相ping通。 网络拓扑如下: R0的配置 Router>en Router#conf t Router(config)#int g0/1 Router(config-if)#ip add 192.168.1.1 255.255.255.0 Router(config-if)#no shut Router(config-if)#exit Router(config)#int g0/0 Router(config-if)#ip add 192.168.

m0_46237205的博客 1万+

iOS平台RTSP|RTMP直播播放器技术接入说明

iOS平台RTSP、RTMP直播播放模块,延迟低、资源占有少,性能优异。由于设备和系统比较单一,优先考虑硬解码,除了基础播放外,我们还实现了实时快照、实时录像、实时回调YUV数据、实时音量调节等,实际体验下来,iOS平台RTMP和RTSP,可以轻松毫秒级。

大牛直播SDK 3320

HUMAnN数据库国内备份下载源(转自刘永鑫博士github)

百度云链接 R语言常用包合集 Windows 10版4.0.x:链接:https://pan.baidu.com/s/1JFwLP2SonK1howD5MNgNYg 提取码:l08k Windows 10版3.6.x:链接:https://pan.baidu.com/s/1h-qR2lmlaMgR4M7VbgtAFg 提取码:s5fi 下载后解压至当前目录,可获得3.6/4.0目录,剪切并替换文档 - R - win-library - 3.6/4.0 目录即可 扩增子数据库 宏基因组数据库 HUM.

zlabx的博客 3242

Smart200 PLC实现Bool信号接通延时、关闭延时作用

解决Smart200 PLC时间继电器和脉冲扫描P或N不能重复使用的问题,用于Bool信号延时接通和延时关闭的作用,可调整时间基数

gk_121的博客 4318

[iOS]iOS下实现RTMP直播

本文记录了最近在研究的基于iOS的RTMP推送的基本流程和实现方式

张三的博客,As a Developer 6605

MindIE与vLLM-Ascend性能对决:Qwen3在昇腾910B上的推理效率实测

本文深度对比了昇腾910B平台上两大推理框架MindIE与vLLM-Ascend的性能表现。通过实测Qwen3系列模型,详细分析了二者在单卡、多卡场景下的推理效率、扩展性及生产环境适用性,为AI算力基础设施选型提供关键参考。

weixin_29214335的博客 1184

[绍棠] iOS直播-播放基于RTMP协议的视频

流媒体协议介绍 1. 伪流媒体: 渐进式下载 : 边下边存, 文件会保存 使用http协议,也能够实现视频播放, 也能快进快退等, 体验上跟流媒体很像. 优酷, 土豆.这些网址就在使用这项技术. 特点:实现简单, 成本也低 2 流媒体: 边下边播, 不会保存文件,特点:流过就没有了.常用的协议有两个,分别为HLS (HTTP Live Streaming) 和 R

绍棠的博客 653

SAP OBYC自动过账全解析:从BSX到WRX的会计科目配置指南

本文深入解析SAP OBYC自动过账功能,从BSX到WRX的会计科目配置全流程,涵盖评估分组代码、事务码和评估类等核心概念。通过实战案例展示如何实现库存变动到财务过账的自动化流转,提升企业财务数据的准确性和效率。

weixin_29239279的博客 418

uniapp微信小程序 - 详解map地图markers图标不显示问题,自定义图标真机调试不显示变成默认marker标记点图标(解决微信小程序map组件markers自定义图标失效,兼容安卓苹果手机)

uniapp微信小程序 map地图markers图标不显示,markers图标真机调试不显示,uniapp map地图显示图标markers问题,自定义图标不显示,添加marker后不显示,uniapp 微信小程序 map marker图标不显示如何解决,uniapp小程序地图的marker图标不显示问题,微信小程序map组件markers自定义图标真机显示问题,uni-app, 微信小程序, map组件, markers图标不显示, 真机调试, 微信小程序map组件,地图加载后marker标记点ios设备

🏆 前端领域优质创作者 2912

H5 视频直播那些事

分享内容简介: 目前视频直播,尤其是移动端的视频直播已经火到不行了,基本上各大互联网公司都有了自己的直播产品,所以对于直播的一些基本知识和主要技术点也要有所了解,本次分享就向大家介绍一下其中的奥秘。内容大体框架:怎样利用H5来播放直播视频 怎样录制直播视频 怎样实时上传直播视频 直播中的用户交互 分享人介绍:吕鸣 目前在腾讯SNG担任手Q的web前端开发工作 博客:http://www.niha

Harry_一棵树的博客 1828

【YOLOs-CPP-图像分类部署】04-项目优化(加速部署)

本文详细介绍了将YOLO图像分类C++部署项目从CMake迁移到Visual Studio控制台应用的全过程。针对低配CPU性能瓶颈问题,作者通过替换多线程HPP代码为官方实现,并采用448x448固定输入尺寸优化推理速度。项目配置包含OpenCV和ONNX Runtime环境设置,实现了图像批量处理、分类结果显示及结果日志输出功能。关键步骤包括依赖库配置、DLL部署和代码调试,最终在Windows平台成功实现高效CPU推理。该方案显著提升了低配硬件的兼容性,为图像分类任务提供了稳定的部署解决方案。

深耕CV 354

如何使用视频流媒体服务器支持HTML5直播?

视频直播这么火,再不学就out了!为了紧跟潮流,本文我也将向大家介绍一下视频直播中的基本流程和主要的技术点,包括但仅不限于前端技术。 H5 到底能不能做视频直播? 当然可以了,H5火了这么久,涵盖了各个方面的技术,我们的流媒体服务器就可以支持H5的直播。 简单的推流服务器搭建,由于我们上传的视频流都是基于rtmp协议的,所以服务器也必须要支持 rtmp才行,大概需要以下几个步骤: ...

AI与流媒体视频技术 2231

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

iOS - 直播流程,视频推流,视频拉流,简介,SMTP、RTMP、HLS、 PLPlayerKit

收藏笔记 1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示1、数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据涉及技术或协议:摄像机:CCD、CMOS拾音器:声电转换装置(咪头)、音频放大电路2、数据编码:使用相关硬件或软件对音视频原始数据进行编码处理(数字化)及加工(如音视频混合、打包封装等),得到可用的音视频数据涉及技术或协...

weixin_30678821的博客 1742

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

[RTMP协议]常用直播流地址

RTMP、RTSP、HTTP这三个协议都属于互联网 TCP/IP 五层体系结构中应用层的协议。理论上这三种都可以用来做视频直播或点播。但通常来说,直播一般用 RTMP、RTSP。而点播用 HTTP。 播放软件推荐:VLC 要播放视频直播流,或者测试一个直播视频地址是否可以使用。这里推荐 VLC 媒体播放器。功能强大且跨平台。支持 Windows、Mac OS、Linux、Android、iOS。 ...

超越 14万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

探索高效视频播放:iOS RTMP 视频播放器

探索高效视频播放:iOS RTMP 视频播放器 项目介绍 rtmp-video-player-for-ios 是一个专为 iOS 平台设计的 RTMP 视频播放器项目。RTMP(Real-Time Messaging Protocol)是一种广泛用于流媒体传输的协议,尤其适用于实时视频直播。该项目旨在为开发者提供一个高效、稳定的 RTMP 视频播放解决方案,适用于各种 iOS 应用场景。 项目技术...

gitblog_00185的博客 487

小视频系统源码H5 直播起航

一、视频流协议HLS与RTMP HTTP Live Streaming 加粗样式HTTP Live Streaming(简称 HLS)是一个基于 HTTP 的视频流协议,由 Apple 公司实现,Mac OS 上的 QuickTime、Safari 以及 iOS 上的 Safari 都能很好的支持 HLS,高版本 Android 也增加了对 HLS 的支持。一些常见的客户端如:MPlayerX、VLC 也都支持 HLS 协议。 HLS 协议基于 HTTP,而一个提供 HLS 的服务器需要做两件事: 编码

云豹网络科技 6639

iOS 简单的视频直播功能开发(实时视音频流录制编码+RTMP传输+实时拉流解码播放)

推流端:自己开发难度很大,视频直播就被卡死了,音频根本没来得及弄,最终使用了github上开源的框架。                原生开发基本流程:AVFoundation获取视频流,得到未编码的CMSampleBuffer,需要编码成Mpeg-4格式。编码分软编码和硬编码,考虑到iOS8之后VideoToolBox开放使用,选用VideoToolBox进行编码。坑爹的是针对它连

pilgrim1385的专栏 1万+

音视频推流与拉流及播放视频实现

视频推流拉流概念,我认为这个哥们的图挺不错 推流 推流,指的是把采集阶段封包好的内容传输到服务器的过程。 主流的推送协议和优缺点 RTMP RTMP是Real Time Messaging Protocol(实时消息传输协议)的缩写,是Adobe公司为Flash/AIR平台和服务器之间音、视频及数据传输开发的实时消息传送协议。RTMP协议基于TCP,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。 RTMP协议中,视频必须是H264编码,音频必须是AAC或MP3编码,

m0_60259116的博客 1626

iOS:基于RTMP的视频推流

iOS基于RTMP的视频推流 一、基本介绍 iOS直播一出世,立马火热的不行,各种直播平台如雨后春笋,正因为如此,也同样带动了直播的技术快速发展,在IT界精通直播技术的猴子可是很值钱的。直播技术涉及的知识面很广,最主要的大概就是这几个:软硬解码.h264、美颜处理、推流RTMP、拉流播放、视频录制、发送弹幕、即时通讯. 二、常用技术 软硬解码.h264:使用iOS...

dienangpiao2051的博客 396

跨平台的视频采集、直播SDK SmarterStreaming

SmarterStreaming 跨平台的视频采集、直播SDK(支持Windows/android/iOS,支持私有协议和RTMP推流),也许是国内最靠谱的视频直播推流、播放SDK之一,助您轻松实现类似于花椒、映客、斗鱼手机直播推送与播放。 Windows端实时采集(支...

weixin_33866037的博客 767
上一篇: Android开发实践:Java层与JNI层的数组传递
下一篇: Unity3D研究院之设置自动旋转屏幕默认旋转方向
WaveDHW
博客等级 码龄20年 455粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值