Android sws_scale RGB0帧需要很长时间并导致视频延迟

时间:2018-04-17 14:00:24

标签: android ffmpeg rgb yuv native-activity

从FFMPEG中读取帧并尝试直接在Native android中的表面窗口上绘制,如果将图像缩放到我们从相机获得的精确大小并将YUV420P应用于RGBA,则需要1ms来缩放{ {1}}但是如果缩放图像表面大小,则av_image_fill_arrays缩放同一帧。

低延迟:[sws_scale为~~ 1ms]

25 to 30ms

低延迟:[sws_scale为~~ 30ms]

swsContext = sws_getContext(videoCodecContext->width,
                                    videoCodecContext->height,
                                    videoCodecContext->pix_fmt,
                                    videoCodecContext->width,
                                    videoCodecContext->height,
                                    AV_PIX_FMT_RGB0,
                                    SWS_FAST_BILINEAR, NULL, NULL, NULL);
av_image_fill_arrays()
av_read_frame()
avcodec_decode_video2(
sws_scale(swsContext,
          (const uint8_t *const *) videoFrame->data,
          videoFrame->linesize,
          0,
          videoCodecContext->height,
          pictureFrame->data,
          pictureFrame->linesize);
ANativeWindow_lock()
Write all buffer bytes to window.
ANativeWindow_unlockAndPost()

注意:我们正在获得YUV420P像素格式。

每当我们更改视频宽度和高度而不是videoContext时,它将花费超过30毫秒,因此结果是视频延迟。

TRY 1:将缓冲区从JNI传递到Java并在那里创建位图以便稍后进行扩展,但createBitmap本身需要[videoContext Width: 848 Height: 608] swsContext = sws_getContext(videoCodecContext->width, videoCodecContext->height, videoCodecContext->pix_fmt, 1080, 608, AV_PIX_FMT_RGB0, SWS_FAST_BILINEAR, NULL, NULL, NULL); ,这还不够好。

尝试2:将YUV420P直接转换为RGB转换,但仍然~500ms更高。

尝试3:直接将YUV写入窗口咬合,但它显示没有颜色(如果有人在这里有解决方案可能会有帮助)。

尝试4: sws_scale,仍然不值得。

尝试5: swsContext中的不同像素格式和标志。

enter image description here

任何帮助都会受到赞赏。

0 个答案:

没有答案