ffmpeg h264编码视频

在这里插入图片描述
主要代码如下:

#include "libavutil/avutil.h"
#include "libavutil/timestamp.h"
#include "libavdevice/avdevice.h"
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libswscale/swscale.h"
#include "ff.h"



void encode_video(void) {
      const char *filename="/home/chendongpu/encodevideo.h264", *codec_name="libx264";
      const AVCodec *codec;
      AVCodecContext *c= NULL;
      int i, ret, x, y, got_output;
      FILE *f;
      AVFrame *frame;
      AVPacket pkt;
      uint8_t endcode[] = { 0, 0, 1, 0xb7 };

      avcodec_register_all();

      /* find the mpeg1video encoder */
      codec = avcodec_find_encoder_by_name(codec_name);
      if (!codec) {
          fprintf(stderr, "Codec not found\n");
          exit(1);
      }

      c = avcodec_alloc_context3(codec);
      if (!c) {
          fprintf(stderr, "Could not allocate video codec context\n");
          exit(1);
      }

      /* put sample parameters */
      c->bit_rate = 400000;
      /* resolution must be a multiple of two */
      c->width = 352;
      c->height = 288;
      /* frames per second */
      c->time_base = (AVRational){1, 25};
      c->framerate = (AVRational){25, 1};

      /* emit one intra frame every ten frames
       * check frame pict_type before passing frame
       * to encoder, if frame->pict_type is AV_PICTURE_TYPE_I
       * then gop_size is ignored and the output of encoder
       * will always be I frame irrespective to gop_size
       */
      c->gop_size = 10;
      c->max_b_frames = 1;
      c->pix_fmt = AV_PIX_FMT_YUV420P;

      if (codec->id == AV_CODEC_ID_H264)
          av_opt_set(c->priv_data, "preset", "slow", 0);

      /* open it */
      if (avcodec_open2(c, codec, NULL) < 0) {
          fprintf(stderr, "Could not open codec\n");
          exit(1);
      }

      f = fopen(filename, "wb+");
      if (!f) {
          fprintf(stderr, "Could not open %s\n", filename);
          exit(1);
      }

      frame = av_frame_alloc();
      if (!frame) {
          fprintf(stderr, "Could not allocate video frame\n");
          exit(1);
      }
      frame->format = c->pix_fmt;
      frame->width  = c->width;
      frame->height = c->height;

      ret = av_frame_get_buffer(frame, 32);
      if (ret < 0) {
          fprintf(stderr, "Could not allocate the video frame data\n");
          exit(1);
      }

      /* encode 1 second of video */
      for (i = 0; i < 25; i++) {
          av_init_packet(&pkt);
          pkt.data = NULL;    // packet data will be allocated by the encoder
          pkt.size = 0;

          fflush(stdout);

          /* make sure the frame data is writable */
          ret = av_frame_make_writable(frame);
          if (ret < 0)
              exit(1);

          /* prepare a dummy image */
          /* Y */
          for (y = 0; y < c->height; y++) {
              for (x = 0; x < c->width; x++) {
                  frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3;
              }
          }

          /* Cb and Cr */
          for (y = 0; y < c->height/2; y++) {
              for (x = 0; x < c->width/2; x++) {
                  frame->data[1][y * frame->linesize[1] + x] = 128 + y + i * 2;
                  frame->data[2][y * frame->linesize[2] + x] = 64 + x + i * 5;
              }
          }

          frame->pts = i;

          /* encode the image */
          ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
          if (ret < 0) {
              fprintf(stderr, "Error encoding frame\n");
              exit(1);
          }

          if (got_output) {
              printf("Write frame %3d (size=%5d)\n", i, pkt.size);
              fwrite(pkt.data, 1, pkt.size, f);
              av_packet_unref(&pkt);
          }
      }

      /* get the delayed frames */
      for (got_output = 1; got_output; i++) {
          fflush(stdout);

          ret = avcodec_encode_video2(c, &pkt, NULL, &got_output);
          if (ret < 0) {
              fprintf(stderr, "Error encoding frame\n");
              exit(1);
          }

          if (got_output) {
              printf("Write frame %3d (size=%5d)\n", i, pkt.size);
              fwrite(pkt.data, 1, pkt.size, f);
              av_packet_unref(&pkt);
          }
      }

      /* add sequence end code to have a real MPEG file */
      fwrite(endcode, 1, sizeof(endcode), f);
      fclose(f);

      avcodec_free_context(&c);
      av_frame_free(&frame);
      return ;
}

下载源码

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

reg183

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值