ffmpeg学习八:软件生成yuv420p视频并将其编码为H264格式

该博客介绍了如何使用ffmpeg生成yuv420p格式视频,并通过源码分析理解ffmpeg API,将生成的yuv视频编码为H264格式。讨论了linesize与宽度的区别,并详细阐述了从yuv到h.264编码过程中的注意事项及解决编解码器支持问题的方法。
摘要由CSDN通过智能技术生成

通过前面对ffmpeg中常用的几个api的源码分析,从而对api有了更好的理解。之前已经做过视频的解码了,今天来尝试视频的编码。ffmpeg已经给我们提供了相应的可供参考的程序:doc/examples/decoding_encoding.c文件就是解码和编码的例程。仔细阅读它的代码后,我们可以按照自己的理解,写自己的视频编码程序。我们将会把一个yuv420p格式的文件,使用h264编码器进行编码。

生成yuv视频

yuv图像的格式,可以参考这篇博客: 图文详解YUV420数据格式
如果你读yuv格式有所了解,或者认真阅读了上面的博客,那么阅读下面的代码就非常容易了。它的功能就是生成一个有200帧的yuv视频。

//created by Jinwei Liu
#include <math.h>
#include <stdlib.h>
#include <libavutil/opt.h>
#include <libavcodec/avcodec.h>
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/imgutils.h>
#include <libavutil/mathematics.h>
#include <libavutil/samplefmt.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>


int main(int argc, char **argv)
{
    AVFrame *frame;
    int i,x,y;
    /* register all the codecs */
    av_register_all();

    if(argc!=3)
        printf("usage:./encodec.bin widht height\n");

    frame  = av_frame_alloc();
    frame->width = atoi(argv[1]);
    frame->height = atoi(argv[2]);
    av_image_alloc(frame->data,frame->linesize,frame->width,frame->height,AV_PIX_FMT_YUV420P,32);
    FILE * file_fd =fopen("soft.yuv","wb+");
    for (i = 0; i < 200; i++) {
        /* prepare a dummy image */
        /* Y */
            for (y = 0; y < frame->height; y++) {
                for (x = 0; x < frame->width; x++) {
                    frame->data[0][y * frame->linesize[0] + x] = (x + y + i * 3)%256;
                }
            }

            /* Cb and Cr */
            for (y = 0; y < frame->height/2; y++) {
                for (x = 0; x < frame->width/2; x++) {
                    frame->data[1][y * frame->linesize[1] + x] = (128 + y + i * 2)%256;
                    frame->
  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值