通过前面对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->