ios-视频程序员手机移动程序开发

iOS 拉流实现

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

播放:IJKPlayer

集成方法:

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

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

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


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

//播放器
@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;

}

//    监听屏幕方向
[[NSNotificationCenter defaultCenter]addObserverForName:UIApplicationDidChangeStatusBarOrientationNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
    UIInterfaceOrientation interfaceOrientation = [[UIApplication sharedApplication]statusBarOrientation];
    if (interfaceOrientation == UIInterfaceOrientationPortrait) {
        [self.verticalPlayV setHidden:NO];
        [self.LandscapePlayV setHidden:YES];
    }
    if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
        [self.verticalPlayV setHidden:YES];
        [self.LandscapePlayV setHidden:NO];
    }
}];

这里写一下聊天室的逻辑,也是集合网上,研究半天,觉得有点恶心。
首先在主播开始直播的同时,创建聊天室,(包括:房间号==主播用户ID,所有用户的ID),说白了就是讲这些数据发送到服务器.一个聊天室就是一个单独的数据传输通道.如果有用户加入聊天室,将当前用户的ID加入到该主播聊天室.服务区保存当前(聊天室的会员.)大体上来说就是服务器分流的工作。跟前段没太大关系,害得我研究好半天

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

代码比较长,写一些废话,为的是能逗你一笑,别介意。能力有限,只能写这么多.有什么问题欢迎大家留言指正,我看到一定回复.感谢!!!!!!!
上一篇 下一篇

猜你喜欢

热点阅读