本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:FFmpeg – RGB图像编码为h264出现垂直旋转的问题
原文链接:https://www.stubbornhuang.com/819/
发布于:2020年05月07日 10:44:09
修改于:2022年02月26日 11:48:32

1 问题描述
在Unity中或者OpenGL中抓取的帧缓冲区数据(Unity为Texture2D)即一张RGB图片数据使用ffmpeg做.h264编码后使用vlc播放出现了图像垂直颠倒的问题,如下图所示:
正常的图片:
.h264编码之后在vlc中播放出现了垂直翻转的问题:
1.1 可能的原因
RGB图像有两种存储方式:
- 一种是从上往下扫描
- 另一种是从下往上扫描。
OpenCV为从上往下扫描的方式,ffmpeg可能也是从上往下的存储方式,而OpenGL/Unity中的帧缓冲数据可能是从下往上的扫描的方式,导致了图像的垂直翻转的问题。
从上扫描的图像第一行的首地址即为图像Buffer的起始地址,而从下往上扫描的图像第一行的首地址为:buffer_data + linesize*(height-1),其中buffer_data为图像Buffer的起始地址,linesize为图像的行字节宽度,对于RGB24图像,linesize = (width * 3 + 3)/4×4,对于YUV420图像,linesize = (width + 3)/4 *4。
2 解决方法
在sws_scale之前进行RGB数据的垂直翻转,可使用以下函数:
///
/// @brief 垂直翻转RGB数据
/// @param[in] width - RGB图像宽度
/// @param[in] height - RGB图像高度
/// @param[in] rgbData - RGB图像数据指针
/// @param[in] bitsPerPixel - 每一个像素的字节大小,通常为rgbData的长度/width*height
///
void h264Encoder::VerticalRotateRGBData(int width, int height, unsigned char* rgbData, int bitsPerPixel)
{
unsigned char* tempRgbData = new unsigned char[width*bitsPerPixel];
height--;
int index = (height + 1) / 2;
for (int y = 0; y < index; y++)
{
memcpy(tempRgbData, &rgbData[y*width*bitsPerPixel], width*bitsPerPixel);
memcpy(&rgbData[y*width*bitsPerPixel], &rgbData[(height - y)*width*bitsPerPixel], width*bitsPerPixel);
memcpy(&rgbData[(height - y)*width*bitsPerPixel], tempRgbData, width*bitsPerPixel);
}
delete[] tempRgbData;
}
当前分类随机文章推荐
- FFmpeg - 关于ffmpeg avcodec_open2函数失败的问题 阅读2431次,点赞0次
- FFmpeg - 将某个文件夹下的图片按标号顺序合成为指定编码格式和指定帧率的视频 阅读2275次,点赞0次
- FFmpeg - RGB图像编码为h264出现垂直旋转的问题 阅读2276次,点赞0次
- FFmpeg - 通过h264编码的视频文件开始很清晰后面逐渐模糊 阅读2334次,点赞1次
- FFmpge - Ubuntu编译FFmpeg出现WARNING: pkg-config not found, library detection may fail警告 阅读199次,点赞0次
- FFmpeg - 音频处理基本概念以及音频重采样(采样率转换) 阅读3165次,点赞0次
- Python - 使用ffmepg批量转换某个文件夹以及所有子文件夹下所有的视频,修改其帧率/码率/分辨率到另一文件夹,并保留原有文件夹结构 阅读1482次,点赞0次
- C++ - 使用ffmpeg读取视频旋转角度并使用OpenCV根据旋转角度对视频进行旋转复原 阅读525次,点赞0次
- Ubuntu编译安装FFmpeg+libx264以及编译+安装Opencv+FFmpeg保姆教程 阅读224次,点赞1次
- FFmpeg - ./configure编译参数全部总结和整理 阅读199次,点赞0次
全站随机文章推荐
- Unity - 字节数组byte[]保存为文件 阅读2419次,点赞2次
- 资源下载 - OpenGL着色语言OpenGL橙宝书PDF中文版下载 阅读5959次,点赞5次
- 资源分享 - The HDRI Handbook- High Dynamic Range Imaging for Photographers and CG Artists英文高清PDF下载 阅读1378次,点赞0次
- 资源分享 - OpenGL 4.0 Shading Language Cookbook (First Edition) 英文高清PDF下载 阅读979次,点赞0次
- C++ – 字节数组byte[]或者unsigned char[]与bool的相互转换 阅读177次,点赞0次
- 资源分享 - Fundamentals of Computer Graphics, Fourth Edition高清英文PDF下载 阅读9748次,点赞8次
- Mediapipe - Windows10 编译Mediapipe C++版本保姆级教程 阅读5322次,点赞9次
- UnrealEngine4 - 将FTexture2DRHIRef保存为图片 阅读2025次,点赞0次
- C++ - 判断本机文件是否存在的方式总结 阅读1682次,点赞0次
- 资源分享 - 3D数学基础:图形和游戏开发 第2版 , 3D Math Primer for Graphics and Game Development (Second Edition) 中文版 PDF下载 阅读217次,点赞0次
评论
144