繁体   English   中英

使用libavcodec for ARGB的Android Encode h264

[英]Android Encode h264 using libavcodec for ARGB

我有一个缓冲区内容流,其中实际上包含480x800大小的ARGB图像[大小为480 * 800 * 4的字节数组]。 我想以指定的fps(12)将大约10,000幅相似的图像编码为h.264流。 显示了如何将图像编码为编码的视频,但是要求输入的是yuv420。

现在我有ARGB图像,我想编码为CODEC_ID_H264 如何将YUV420p的RGB转换为ffmpeg编码器? 显示了如何针对rgb24进行操作,但针对rgb32进行操作(表示ARGB图像数据)

我该如何使用libavcodec?

编辑:我发现如何从ffmpeg编码器的YUV420p转换RGB? 但是我不明白。

从第一个链接,我知道AVFrame结构包含由Y,U和V值填充的data [0],data 1 ,data [2]。

在第二个链接中,他们展示了如何使用sws_scale这样将RGB24转换为YUV420。

SwsContext * ctx = sws_getContext(imgWidth, imgHeight,
                              AV_PIX_FMT_RGB24, imgWidth, imgHeight,
                              AV_PIX_FMT_YUV420P, 0, 0, 0, 0);
uint8_t * inData[1] = { rgb24Data }; // RGB24 have one plane
int inLinesize[1] = { 3*imgWidth }; // RGB stride
sws_scale(ctx, inData, inLinesize, 0, imgHeight, dst_picture.data, dst_picture.linesize)

在这里,我假设rgb24Data是包含RGB24图像字节的缓冲区。

那么,我如何将这些信息用于32位的ARGB? 我是否需要手动剥离Alpha通道或其他解决方法?

谢谢

只需将像素格式和行距从RGB24切换到ARGB

SwsContext * ctx = sws_getContext(imgWidth, imgHeight,
                              AV_PIX_FMT_ARGB, imgWidth, imgHeight,
                              AV_PIX_FMT_YUV420P, 0, 0, 0, 0);
uint8_t * inData[1] = { rgb24Data }; // RGB24 have one plane
int inLinesize[1] = { 4*imgWidth }; // RGB stride
sws_scale(ctx, inData, inLinesize, 0, imgHeight, dst_picture.data, dst_picture.linesize)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM