FFmpeg入门教程10.06:解码视频并保存为YUV格式文件(YUV420P or YUV420SP)
系列索引:FFmpeg入门系列索引
上一篇我们解码并保存了其中的几帧确保解码过程和结果是对的。本篇我们将解码整个视频并保存为标准的YUV格式(YUV格式具体信息详见YUV格式介绍),我们就选YUV420P(I420)作为输出格式。
保存文件需要对本地文件进行读写操作,那么首先要有文件操作指针,C为FILE,C++为iostream。
以C为例。
1 |
|
扩展名任意,只要数据格式对就可以了,最好是把数据格式标识出来,比如:1280x720_yuv420p.yuv
。
与上一篇文章相比,就是多了将像素值写入文件的部分。
解码流程图为:
flowchart TB
F --Yes--> I
K --下一帧--> F
I --No--> F
subgraph init
direction TB
A(开始) --> B[打开文件]
B --> C[查找流信息]
C --> D[查找对应解码器]
D --> E[打开解码器]
E --> F{读取帧}
F --No--> G(结束)
end
subgraph decode
direction TB
I{是视频帧?} --Yes--> J[发送帧给解码器]
J --> K[从解码器获取结果]
end
flowchart TB
F --Yes--> I
K --Next Frame--> F
I --No--> F
subgraph init
direction TB
A(Start) --> B[avformat_open_input]
B --> C[av_find_stream_info]
C --> D[avcodec_find_decoder]
D --> E[avcodec_open]
E --> F{av_read_frame}
F --No--> G(End)
end
subgraph decode
direction TB
I{Video Packet?} --Yes--> J[avcodec_send_packet]
J --> K[avcodec_receive_frame]
end
YUV420P格式
YUV420P像素分为三个部分:Y/U/V,Y部分长度为width * height,U为width * height /4 ,V部分和U部分长度一样。(为什么会是这样,见YUV格式介绍)。
测试代码:
1 |
|
因为FFmpeg软解后的帧格式为YUV420P,也就不用进行格式转换了,直接将解码后的数据写入本地就行了。
解码结果为:
1 |
|
mkv格式视频大小为1.7MB,解码后的YUV格式视频大小为278MB。
我使用ffplay播放YUV格式视频:
1 |
|
和源视频打开效果一样就是解码正常。
YUV420SP格式
因为FFmpeg使用CPU软解后的YUV格式为YUV420P,本部分在CPU软解码之后,我们将其转换为YUV420SP并写入本地文件。
1 |
|
获得的结果也是278MB,使用ffplayer播放
1 |
|
如果显示结果和源视频文件一样,就表示解码正常。
GitHub项目地址(源代码):ffmpeg_beginner中的10.06.1video_decode_mp42yuv420p
和10.06.2video_decode_mp42yuv420sp
FFmpeg入门教程10.06:解码视频并保存为YUV格式文件(YUV420P or YUV420SP)
https://blog.jackeylea.com/ffmpeg/ffmpeg-decode-video-and-save-as-yuv-file-in-yuv420p-or-yuv420sp/