文章目录

  • 1 问题描述
    • 1.1 可能的原因
  • 2 解决方法

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;
}

大家有兴趣可以访问我的个站:http://www.stubbornhuang.com

FFmpeg - RGB图像编码为h264出现垂直翻转/上下颠倒的问题相关推荐

  1. RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78214267 既然已经可以通过 RTSP 获取h264 裸流了.那么通过 F ...

  2. ffmpeg 解码视频(h264、mpeg2)输出yuv420p文件

    ffmpeg 解码视频(h264.mpeg2)输出yuv420p文件 播放yuv可以参考:ffplay -pixel_format yuv420p -video_size 768x320 -frame ...

  3. 音视频开发(17)---RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中 https://blog.csdn.net/qq_29350001/article/details/7821426 ...

  4. 使用ffmpeg开源库将h264封装为mp4格式

    最近一直在做使用ffmpeg关于读取标准h264格式内存如何封装为mp4格式文件,在经过一周的持续奋战之后在网上找了一些代码,特别的雷神的博客让我获益匪浅,开始不知道如何持续读取发送来的内存块,如何边 ...

  5. Windows 7(Win7)下MinGW+msys编译ffmpeg,并加入H264编码支持

    可以去ffmpeg官网下载已经编译好的版本:https://ffmpeg.zeranoe.com/builds/ 该编译好的版本支持H264编码和解码 如果需要自己编译,步骤如下: 1.下载安装MSY ...

  6. ffmpeg基础三:H264,从MP4文件获取(av_bsf_get_by_name(“h264_mp4toannexb“))和从TS流获取保存H264

    参考:零声学院 1.流媒体编解码流程 2.编码原理 在⾳视频传输过程中,视频⽂件的传输是⼀个极⼤的问题:⼀段分辨率为19201080,每个像 素点为RGB占⽤3个字节,帧率是25的视频,对于传输带宽的 ...

  7. 图像编码与 H264 基础知识

    RGB 颜色模型 图像的采集可以通过摄像头或者截取屏幕来获取的图像数据.一幅图像可以看作为一个二维的矩阵,其中矩阵中的每一个点被称为像素.像素的颜色可以通过红.绿.蓝来表示,也就是常说的 3 基色.如 ...

  8. ffmpeg 多张图片合成h264编码格式的视频 按照指定时间截取 并添加 acc编码格式音乐 IOS可播放

    $imgurl="./RecordingScreen/".$Filename."/%04d.jpg";//图片路径 %04d 意思是 从0001开始的四位数图片 ...

  9. ffmpeg使用filter生成H264测试视频(带时间戳OSD)

    偶然发现ffmpeg有一个很好用的filter:testsrc.使用它可以快速生成指定格式.分辨率.时长的H264(或其他)测试视频(容器可指定),这个在某些测试环节真的很有用.特别是提供帧级精度的时 ...

最新文章

  1. llinux 调整swap方法
  2. 每日一笑 | 爱的魔力转圈圈~
  3. 2018.8.2 Juint测试介绍及其命名的规范
  4. 云漫圈 | 谈谈怎么做【服务隔离】
  5. VMware workstation 15.5.2及镜像文件下载
  6. 计算机视觉CV中RANSAN算法的学习笔记
  7. 【机房收费系统】---导出Excel表
  8. 3.8Python数据处理篇之Numpy系列(八)---Numpy的梯度函数
  9. 蓝讯数卡api接口,可以接通25家话费充值卡、游戏点卡官方通道,轻松完成客户快速消耗...
  10. php如何实现记录步数,微信步数获取-PHP后端部分
  11. Tomcat-startup.bat一点闪退的原因与解决方法
  12. 我的博客今天启用了量子统计
  13. python透明图片合并_Python用OpenCV合并图片,添加透明部分
  14. 软件架构师的“不归之路“——架构师的职责
  15. 计算机中c盘是什么分区,电脑C盘怎么分区
  16. iPhone手机使用:苹果新款手机(iPhone X、iPhone XS Max、iPhone XR等)关机、截屏等快捷键
  17. 荣耀30青春版怎么样?到手后远超预期!
  18. 2022年MinGW-w64的安装及配置教程(傻瓜式)
  19. #内存泄露# linux常用内存相关命令
  20. ben we_老WE成立手游战队!2020LOL冬季转会汇总:TSM蛇蛇

热门文章

  1. 打印机的设置窗口看不到已经安装的打印机列表的处理
  2. 魅族推荐平台架构解析(三)
  3. MacOS 便笺Stickies数据恢复
  4. SpringBoot发送邮件报错:Got bad greeting from SMTP host: smtp.exmail.qq.com, port: 465, response: [EOF]
  5. redis jredis jedis 使用
  6. 最小生成树之Prim算法和Kruskal算法
  7. 基于Java毕业设计迎新管理系统演示录像2020源码+系统+mysql+lw文档+部署软件
  8. TX2 Linux配置组播(Multicast)
  9. 乐视网php工资,乐视今天发工资了吗?没有
  10. 基于MapBox的船舶AIS数据在地图上的实时显示(仿船讯网效果)