前言
本系列文章
FFMPEG Demo分析之muxing.c
FFmpeg Demo分析之demuxing_decoding.c
FFmpeg Demo分析之decode_video.c
本篇文章来介绍一下单独使用libavcodec库进行编码视频文件。编码音频和编码视频的步骤其实都差不多。先来简单介绍下编码的步骤。步骤如下:
找到编码器->分配编码器上下文->给编码器上下文赋值一些必要的编码参数->打开编码器->分配AVPacket和AVFrame->给AVFrame赋值一些必要参数分配data空间->给AVFrame填充编码数据->进行编码生成输出AVPacket->释放资源。
详细的流程图

C++音视频开发学习资料:点击领取→音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
C++程序员必看,抓住音视频开发的大浪潮!冲击年薪60万

代码详细分析
#include #include #include #include #include #include //编码 和音频编码一样。这都是老套路了。static void encode(AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt, FILE *outfile){ int ret; /* send the frame to the encoder */ if (frame) printf("Send frame %3"PRId64"
", frame->pts); ret = avcodec_send_frame(enc_ctx, frame); if (ret < 0) { fprintf(stderr, "Error sending a frame for encoding
"); exit(1); } while (ret >= 0) { ret = avcodec_receive_packet(enc_ctx, pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) return; else if (ret < 0) { fprintf(stderr, "Error during encoding
"); exit(1); } printf("Write packet %3"PRId64" (size=%5d)
", pkt->pts, pkt->size); fwrite(pkt->data, 1, pkt->size, outfile); av_packet_unref(pkt); }}int main(int argc, char **argv){ const char *filename, *codec_name; const AVCodec *codec; AVCodecContext *c= NULL; int i, ret, x, y; FILE *f; AVFrame *frame; AVPacket *pkt; uint8_t endcode[] = { 0, 0, 1, 0xb7 }; if (argc <= 2) { fprintf(stderr, "Usage: %s