0
点赞
收藏
分享

微信扫一扫

6、读取YUV数据并理解YUV数据

书写经典 2022-09-28 阅读 204


基本思想:跟这大佬学习视频,坚持记笔记,推动学完视频,

首先保证window11电脑上配置了ffmpeg库,可以在命令行使用

一、使用ffmpeg将mp4视频转成yuv格式

6、读取YUV数据并理解YUV数据_d3

 先播放一下视频

G:\>ffplay sxj731533730.mp4
ffplay version 4.4-full_build-www.gyan.dev Copyright (c) 2003-2021 the FFmpeg developers
built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-shared --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libglslang --enable-vulkan --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint

测试

6、读取YUV数据并理解YUV数据_d3_02

 然后将mp4转yuv格式

G:\>ffmpeg -i sxj731533730.mp4 sxj731533730_test.yuv
ffmpeg version 4.4-full_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-shared --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libglslang --enable-vulkan --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint

测试一下yuv播放

G:\> ffplay -f rawvideo -video_size 852*480 -pix_fmt yuv420p  sxj731533730_test.yuv

6、读取YUV数据并理解YUV数据_ios_03

二、根据大佬的视频先学习一下yuv的视频格式,借用大佬的图

6、读取YUV数据并理解YUV数据_d3_04

测试代码

#include <iostream>
using namespace std;

void yuv420(const char *path,int width,int height)
{
int i=0;
FILE *fp=fopen(path,"rb+");
FILE *fp_y= fopen("G:\\yuv_420_y.y","wb+");
FILE *fp_u= fopen("G:\\yuv_420_u.y","wb+");
FILE *fp_v= fopen("G:\\yuv_420_v.y","wb+");

unsigned char*p=(unsigned char *) malloc(width*height+width*height/4+width*height/4); //
while(i<1){
fread(p,1,width*height+width*height/4+width*height/4,fp);
fwrite(p,1,width*height,fp_y);
fwrite(p+width*height,1,width*height/4,fp_u);
fwrite(p+width*height+width*height/4,1,width*height/4,fp_v);
i++;
}
fclose(fp);
fclose(fp_u);
fclose(fp_v);
fclose(fp_y);

}

int main() {

int width=852;
int height=480;
yuv420("G:\\sxj731533730_test.yuv",width,height);
return 0;
}

使用ffplay播放分量数据

G:\>ffplay -s 852*480 -pix_fmt gray yuv_420_y.y

6、读取YUV数据并理解YUV数据_i++_05

G:\>ffplay -s 426*240 -pix_fmt gray yuv_420_y.u

 

6、读取YUV数据并理解YUV数据_音视频_06

v分量就不放了,长宽各一半 

二、在说明一下yuv422的使用分量方式

YUV444:对于每一个像素都对应一个Y分量、一个U分量、一个V分量。

YUV422:对于一个像素都对应一个Y分量,但是每两个像素(或者说Y分量)对应一个U分量和一个V分量。

YUV420:对于一个像素都对应一个Y分量,但是每四个像素(或者说Y分量)对应一个U分量和一个V分量。

#include <iostream>
using namespace std;

void yuv422(const char *path,int width,int height)
{
int i=0;
FILE *fp=fopen(path,"rb+");
FILE *fp_y= fopen("G:\\yuv_422_y.y","wb+");
FILE *fp_u= fopen("G:\\yuv_422_u.y","wb+");
FILE *fp_v= fopen("G:\\yuv_422_v.y","wb+");

unsigned char*p=(unsigned char *) malloc(width*height+width*height/2+width*height/2); //
while(i<1){
fread(p,1,width*height+width*height/2+width*height/2,fp);
fwrite(p,1,width*height,fp_y);
fwrite(p+width*height,1,width*height/2,fp_u);
fwrite(p+width*height+width*height/2,1,width*height/2,fp_v);
i++;
}
fclose(fp);
fclose(fp_u);
fclose(fp_v);
fclose(fp_y);

}

int main() {

int width=852;
int height=480;
yuv422("G:\\sxj731533730_test.yuv",width,height);
return 0;
}

 测试

G:\>ffplay -s 852*480 -pix_fmt gray yuv_422_y.y

测试视频

6、读取YUV数据并理解YUV数据_音视频_07


举报

相关推荐

0 条评论