Android 使用 libavcodec 为 ARGB 编码 h264

标签 android ffmpeg h.264 libavcodec argb

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

现在我有 ARGB 图像,我想编码成 CODEC_ID_H264 How to convert RGB from YUV420p for ffmpeg encoder?显示如何为 rgb24 执行此操作,但如何为 rgb32 执行此操作,即 ARGB 图像数据

我如何为此使用 libavcodec?

编辑:我找到了 How to convert RGB from YUV420p for ffmpeg encoder? 但我不明白。

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

在第二个链接中,他们展示了如何使用 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 channel 或任何其他解决方法?

谢谢

最佳答案

只需将像素格式和行间距从 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)

关于Android 使用 libavcodec 为 ARGB 编码 h264,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20537044/

相关文章:

video - 从单个帧 (PNG) 制作视频并添加音轨

camera - 从树莓派视频流中解析帧

android - Admob - 横幅广告在部署几天后未显示

video - 将 HLS (m3u8) 转换为 MP4

android - 参数类型不得包含类型变量或通配符

FFmpeg 使用自定义 "af"s 向下复用多个轨道

h.264 - 具有多个PPS和SPS的H264

ffmpeg 为 MJPEG 编码生成更高质量的图像

java - HttpPost -> 重定向 -> 需要响应的位置或正文

android - setOnChronometerTickListener 的问题