当前位置: 首页 > article >正文

iOS平台RTMP|RTSP播放器如何实时回调YUV数据

我们在做RTMP、RTSP播放器的时候,有开发者需要自己处理拉取到的YUV数据,做二次分析之用,为此,我们做了以下的设计:

InitPlayer之后,再调用SmartPlayerStart()接口之前,设置yuv数据回调即可。

-(bool)StartPlayer
{
    NSLog(@"[daniusdk]StartPlayer++");
    
    if ( _smart_player_sdk == nil )
    {
        NSLog(@"StartPlayer, player SDK with nil");
        return false;
    }

    //设置视频画面的填充模式,如填充整个view、等比例填充view
    NSInteger render_scale_mode = 1;
    [_smart_player_sdk SmartPlayerSetRenderScaleMode:render_scale_mode];
    
    //设置视频view旋转角度
    [_smart_player_sdk SmartPlayerSetRotation:rotate_degrees_];
    
    float f = audioVolumeSlider.value; //读取滑块的值
    [_smart_player_sdk SmartPlayerSetAudioVolume:(NSInteger)f];
    
    //软/硬解码模式设置
    [_smart_player_sdk SmartPlayerSetVideoDecoderMode:is_hardware_decoder_];
    
    if (is_audio_only_) {
        [_smart_player_sdk SmartPlayerSetPlayView:nil];
    }
    else
    {
        //如果只需外部回调YUV数据,自己绘制,无需创建view和设置view到SDK
        _glView = (__bridge UIView *)([SmartPlayerSDK SmartPlayerCreatePlayView:0 y:50 width:player_view_width_ height:player_view_height_]);
        
        if (_glView == nil ) {
            NSLog(@"CreatePlayView failed..");
            return false;
        }
        
        [self.view addSubview:_glView];
        
        [_smart_player_sdk SmartPlayerSetPlayView:(__bridge void *)(_glView)];
    }
    
     _smart_player_sdk.yuvDataBlock = ^void(int width, int height, unsigned long long time_stamp,
     unsigned char*yData, unsigned char* uData, unsigned char*vData,
     int yStride, int uStride, int vStride)
     {
     NSLog(@"[PlaySideYuvCallback] width:%d, height:%d, ts:%lld, y:%d, u:%d, v:%d", width, height, time_stamp, yStride, uStride, vStride);
     //这里接收底层回调的YUV数据
     };
    
    //设置YUV数据回调输出
    [_smart_player_sdk SmartPlayerSetYuvBlock:true];
    
    NSInteger ret = [_smart_player_sdk SmartPlayerStart];
    
    if(ret != DANIULIVE_RETURN_OK)
    {
        NSLog(@"Call SmartPlayerStart failed..ret:%ld", (long)ret);
        return false;
    }
    
    NSLog(@"[daniusdk]StartPlayer--");
    return true;
}

具体YUV数据回调的代码如下:

     _smart_player_sdk.yuvDataBlock = ^void(int width, int height, unsigned long long time_stamp,
     unsigned char*yData, unsigned char* uData, unsigned char*vData,
     int yStride, int uStride, int vStride)
     {
     NSLog(@"[PlaySideYuvCallback] width:%d, height:%d, ts:%lld, y:%d, u:%d, v:%d", width, height, time_stamp, yStride, uStride, vStride);
     //这里接收底层回调的YUV数据
     };
    
    //设置YUV数据回调输出
    [_smart_player_sdk SmartPlayerSetYuvBlock:true];

如果仅需要处理回调的YUV数据,不需要额外的绘制(当然也可以自己绘制YUV数据),只要不创建设置view到底层即可,感兴趣的开发者,可以单独跟我沟通。


http://www.kler.cn/a/230217.html

相关文章:

  • solr 远程命令执行 (CVE-2019-17558)
  • 【漏洞复现】CVE-2020-13925
  • Redis-09 SpringBoot集成Redis
  • TensorFlow如何调用GPU?
  • PHP 8.4 正式发布
  • QML学习 —— 28、3种等待指示控件(附源码)
  • 使用NLTK进行自然语言处理:英文和中文示例
  • c#cad 创建-多线段(三)
  • 市场复盘总结 20240206
  • 人工智能:数据分析之数据预处理、分析模型与可视化
  • MIT-Missing Semester_Topic 6:Version Control (Git) 练习题
  • 华为OD机试真题C卷-篇3
  • OS X(MACOS) C/C++ 程序链接静态库限制。
  • 2023-总结
  • LeetCode 丑数
  • 【实验3】统计某电商网站买家收藏商品数量
  • 企业微信会话存档:大文件拉取、加密、上传
  • (十三)springboot实战——springboot前后端分离方式项目集成spring securtity安全框架
  • 23种设计模式之工厂模式
  • 【Java安全】ysoserial-URLDNS链分析
  • 为什么说不可知论有合理的成分
  • 【Java基础常见面试题】- Java SE vs Java EE
  • 如何启动若依框架
  • LeetCodeLCR 114. 火星词典——拓扑排序
  • 【Scala 】3. 类和对象
  • Linux(三)--文件系统