anyrtcIO-Community / anyRTC-RTMP-OpenSource

RTMP 推流器,RTMP(HLS)秒开播放器,直播点播,跨平台(Win,IOS,Android)开源代码
https://www.anyrtc.io
GNU General Public License v3.0
4.68k stars 1.61k forks source link

iOS 端视频帧数据获取方式疑问? #45

Open linjiansheng opened 7 years ago

linjiansheng commented 7 years ago

目前代码VideoCapture.mm:processVideo方法中,直接从[imageFramebuffer byteBuffer]中获取出来使用,这是不是不够完备?没有显示调用glFinish 会导致 cvpixbuffer 获取的是黑屏数据,而如果显示调用glFInish是耗时的。

DyncEric commented 7 years ago

没有显示调用glFinish 会导致 cvpixbuffer 获取的是黑屏数据 你遇到这样的情况了吗

linjiansheng commented 7 years ago

我在其它项目使用中有遇到这样的问题,网上看到的原因说是cpu提交了gl指令,但是还没有完全执行完,所以导致cvpixbuffer的图像不完整,还有GPUImageRawDataOutput 也是这么做了。 早上测试了iOS Demo 并没有出现这个问题。 下面是我改过的代码,测试设备iPhone 5: 还有一个疑问,为什么美颜滤镜这里为什么要引入 _emptyFilter,变成 _videoCamera->_filter->_emptyFilter->view, 这个 _emptyFilter 怎么看起来是多余的

- (void)setBeautyFace:(BOOL)beautyFace{
    if(_beautyFace == beautyFace) return;

    _beautyFace = beautyFace;
    [_emptyFilter removeAllTargets];
    [_filter removeAllTargets];
    [_cropfilter removeAllTargets];
    [_videoCamera removeAllTargets];

    if(_beautyFace){
        _filter = [[GPUImageBeautifyFilter alloc] init];
        _emptyFilter = [[GPUImageEmptyFilter alloc] init];
    }else{
        _filter = [[GPUImageColorInvertFilter alloc] init]; // GPUImageEmptyFilter 修改成反色filterGPUImageColorInvertFilter
    }

    __weak typeof(self) _self = self;
    [_filter setFrameProcessingCompletionBlock:^(GPUImageOutput *output, CMTime time) {
        // glFinish(); 如果没有glFInish 直播出去画面跟预览画面不一致,打开这句代码就一致
        [_self processVideo:output];
    }];