美文网首页
ffmpeg编解码实战_day97

ffmpeg编解码实战_day97

作者: FANDX | 来源:发表于2020-04-21 22:20 被阅读0次

    常用的结构体

    • AVCodec:编解码结构体
    • AVCodecContext:编解码上下文
    • AVFrame:解码后的帧

    结构体的常用api

    • av_frame_alloc():生成AVFrame结构体的
    • av_frame_free():释放AVFrame结构体
    • avcodec_alloc_context3():生成编解码器上下文
    • avcodec_free_context:释放解码器上下文

    解码的步骤

    1. 查找解码器:avcodec_find_decoder
    2. 打开解码器:avcodec_open2
    3. 解码:avcodec_decode_video2

    H264的编码流程

    1. 查找解码器:avcodec_find_encoder_by_name
    2. 设置编码参数,并打开编码器:avcodec_open2
    3. 编码:avcodec_encode_video2

    实战案例

    #include <stdio.h>
    #include <stdlib.h>
    #include <libavcodec/avcodec.h>
    
    #include <libavutil/opt.h>
    #include <libavuil/imgutil.h>
    
    
    int main(int argc, char **argv)
    {
        const char * filename, *codec_name;
        const AVCodec *codec;
        AVCodecContext *c = NULL;
        int i, ret, x, y, got_outget;
      FILE *f;
      AVFrame *frame;
      AVPacket pkt;
      uint8_t encode[] = {0, 0, 1, 0xb7};
      
      avcodec_register_all();
      // 拿到具体的编解码器
      codec = avcodec_find_encoder_by_name(codec_name)
        c = avcodec_all_codec_context3(codec);
      
      c->bit_rate = 400000;
      c->width = 352;
      c->height = 288;
      c->time_base = (AVRational){1, 25};
      c->framerate = (AVRational){25, 1};
      c->gop_size = 10; // 一组帧是多少,10帧生成一个关键帧
      c->max_b_frames = 1;
      c->pix_fmt = AV_PIX_FMT_YUV420P;
      
      if (codec-> == AV_CODEC_ID_H264){
      av_opt_set(c->priv_data, "preset", "slow", 0);  
      }
      if (avcodec_open2(c, codec, NULL)<0){
        fprintf(stderr, "Could not open codec\n");
        exit(1);
      }
      f = fopen(filename, "wb");
      if (!f){
        fprintf(stderr, "Coudld not open %s\n", filename);
        exit(1);
      }
      
      
      
      
        
    }
    
    

    相关文章

      网友评论

          本文标题:ffmpeg编解码实战_day97

          本文链接:https://www.haomeiwen.com/subject/thnmihtx.html