iOS 拉流实现

Demo 比较丑还没有完善,凑合着看吧,要是觉得代码也(我靠什么鬼,根本看不懂。写的是什么鸟东西),那么请点击左上角后退按钮,别忘了把门带上。谢谢

播放:IJKPlayer

集成方法:

  • CocoaPods
  • pod search IJKPlayer
  • pod install
    如若不会CocoaPods那么请自行谷歌或度娘,再不行请转到手动集成⬇️

如若想手动集成传送门在下方,祝你好运。⬇️
手动集成传送门传送门,点击这里

这是正在直播的结果只不过是电脑截图


以下是用IJKPlayer播放器进行播放的源码
相关头文件
#import "ViewController.h
#import 
#import

//播放器
@property(nonatomic,strong)IJKFFMoviePlayerController * moviePlayer;
//播放器配置
@property(nonatomic,strong)IJKFFOptions * options;
/** 视频地址/直播/点播URL都可 */
@property(nonatomic,copy) NSString *flv;

- (void)viewDidLoad {
  [super viewDidLoad];
  _flv= @"http://www.huadong.com28.cn:2018/file/course/video/477ac58bae684cc0bf367c3bfcd5ef51.mp4" ;

  [self plarFLV:_flv];
}

-(void)viewDidDisappear:(BOOL)animated{
  [super viewDidDisappear:animated];
  关闭ijk 播放器 否则将会造成不释放播放器
  [_moviePlayer shutdown];
}

#pragma mark - private method
//最好用真机测试以免卡顿
- (void)plarFLV:(NSString*)flv{
_moviePlayer = [[IJKFFMoviePlayerController alloc]initWithContentURLString:flv withOptions:self.options];
// 填充fill
_moviePlayer.scalingMode= IJKMPMovieScalingModeAspectFill;
//    设置播放倍速默认1.0
_moviePlayer.playbackRate = 1.0;
// 设置自动播放(必须设置为NO, 防止自动播放, 才能更好的控制直播的状态)
_moviePlayer.shouldAutoplay=NO;
// 默认不显示参数
_moviePlayer.shouldShowHudView = NO;
[self.view insertSubview:_moviePlayer.view atIndex:0];
[_moviePlayer prepareToPlay];
// 设置监听播放状态
__weak typeof(self)weakSelf = self;
[[NSNotificationCenter defaultCenter]addObserverForName:IJKMPMoviePlayerLoadStateDidChangeNotification object:_moviePlayer queue:[NSOperationQueue mainQueue]
                                             usingBlock:^(NSNotification * _Nonnull note) {
     if((weakSelf.moviePlayer.loadState & IJKMPMovieLoadStatePlaythroughOK) !=0) {
         if(!weakSelf.moviePlayer.isPlaying) {
             [weakSelf.moviePlayer play];
           }
       }else if(weakSelf.moviePlayer.loadState& IJKMPMovieLoadStateStalled)  {
           // 网速不佳, 自动暂停状态
           NSLog(@"网速不佳");
       }
  }];
}


#pragma mark - 播放器配置
-(IJKFFOptions *)options{
if (!_options) {
    _options = [IJKFFOptions optionsByDefault];
    
    [_options setPlayerOptionIntValue:29.97 forKey:@"r"]; // 帧速率(fps)可以改,确认非标准帧率会导致音画不同步,所以只能设定为15或者29.97)
    
    [_options setPlayerOptionIntValue:512 forKey:@"vol"]; // 设置音量大小,256为标准音量。(要设置成两倍音量时则输入512,依此类推)
    
    [_options setPlayerOptionIntValue:0 forKey:@"packet-buffering"];  //  关闭播放器缓冲 (如果频繁卡顿,可以保留缓冲区,不设置默认为1)
    
    [_options setPlayerOptionValue:@"1" forKey:@"an"]; //静音设置
    
    [_options setPlayerOptionIntValue:30 forKey:@"max-fps"]; // 最大fps
    
    [_options setPlayerOptionIntValue:0 forKey:@"framedrop"]; // 跳帧开关
    
    [_options setPlayerOptionIntValue:1 forKey:@"videotoolbox"]; // 开启硬编码 (默认是 0 :软解)
    
    [_options setPlayerOptionIntValue:960 forKey:@"videotoolbox-max-frame-width"]; // 指定最大宽度
    
    [_options setFormatOptionIntValue:0 forKey:@"auto_convert"]; // 自动转屏开关
    
    [_options setFormatOptionIntValue:1 forKey:@"reconnect"]; // 重连开启 BOOL
    
    [_options setFormatOptionIntValue:30 * 1000 * 1000 forKey:@"timeout"]; // 超时时间,timeout参数只对http设置有效,若果你用rtmp设置timeout,ijkplayer内部会忽略timeout参数。rtmp的timeout参数含义和http的不一样。
    
    [_options setFormatOptionValue:@"tcp" forKey:@"rtsp_transport"];// 如果使用rtsp协议,可以优先用tcp(默认udp)
    
  //用是须谨慎如若突然发现没有声音的情况,不是静音,不是音量,那就是这个鳖孙了    
   [_options setFormatOptionIntValue:1024 * 16 forKey:@"probesize"];//播放前的探测Size,默认是1M, 改小一点会出画面更快
    
    [_options setCodecOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@"skip_loop_filter"];//开启环路滤波(0比48清楚,但解码开销大,48基本没有开启环路滤波,清晰度低,解码开销小)
    
    [_options setCodecOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@"skip_frame"];
    
    // param for living
    [_options setPlayerOptionIntValue:3000 forKey:@"max_cached_duration"];   // 最大缓存大小是3秒,可以依据自己的需求修改
    [_options setPlayerOptionIntValue:1 forKey:@"infbuf"];  // 无限读
    [_options setPlayerOptionIntValue:0 forKey:@"packet-buffering"];  //  关闭播放器缓冲
    
    //param for playback
    [_options setPlayerOptionIntValue:0 forKey:@"max_cached_duration"];
    [_options setPlayerOptionIntValue:0 forKey:@"infbuf"];
    [_options setPlayerOptionIntValue:1 forKey:@"packet-buffering"];
}
return _options;
}

原文来自,麦子专栏原文地址:传送门
这篇文章也是参考网上自己整合以下,方便各路大神更直接的了解这两个第三方
再次声明本片文章不是自己原创,虽然有自己的一些建议,但是大部分还是来自网上,本文仅供参考,如要转载请名著出处

你可能感兴趣的:(iOS 拉流实现)