从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中的不同像素格式和标志。
任何帮助都会受到赞赏。