FFmpeg进行h264的编码流程:

  • 1、通过编码器名,查找编码器(h264编码器名字是libx264)
  • 2、设置编码器的参数(比如码率、分辨率、帧率、时间基等)。
  • 3.打开编码器avcodec_open2()。
  • 4.对帧数据进行编码avcodec_send_frame()/avcodec_receive_packet(),编码完后写入文件。(在实际使用中帧数据来源于解码后的元数据或来源于摄像头,本文示例的帧数据时人工添加了模拟数据。)

相关API

文件操作
相关API

源码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#include <libavcodec/avcodec.h>#include <libavutil/opt.h>
#include <libavutil/imgutils.h>// 对每一帧进行编码
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"\n", frame->pts);ret = avcodec_send_frame(enc_ctx, frame);if (ret < 0) {fprintf(stderr, "Error sending a frame for encoding\n");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\n");exit(1);}printf("Write packet %3"PRId64" (size=%5d)\n", pkt->pts, pkt->size);fwrite(pkt->data, 1, pkt->size, outfile);av_packet_unref(pkt);}
}int encode_video(const char *filename, const char *codec_name)
{//编码器const AVCodec *codec;//编码器上下文AVCodecContext *c= NULL;//got_output 用于标记一帧是否压缩成功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 *///码率,400kbc->bit_rate = 400000;/* resolution must be a multiple of two */c->width = 352;c->height = 288;/* frames per second *///时间基,每一秒25帧,每一刻度25分之1(时间基根据帧率而变化)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;//b帧,参考帧c->max_b_frames = 1;//编码的原始数据的YUV格式c->pix_fmt = AV_PIX_FMT_YUV420P;//如果编码器id 是 h264if (codec->id == AV_CODEC_ID_H264)// preset表示采用一个预先设定好的h264参数集,级别是slow,slow表示压缩速度是慢的,慢的可以保证视频质量,用快的会降低视频质量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);}//初始化帧并设置帧的YUV格式和分辨率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 */// 这里是人工添加数据模拟生成1秒钟(25帧)的视频(真实应用中是从摄像头获取的原始数据,摄像头拿到数据后会传给编码器,然后编码器进行编码形成一帧帧数据。)for (i = 0; i < 25; i++) {//初始化packetav_init_packet(&pkt);pkt.data = NULL;    // packet data will be allocated by the encoderpkt.size = 0;// 强制输出写入文件fflush(stdout);/* make sure the frame data is writable *///确保帧被写入ret = av_frame_make_writable(frame);if (ret < 0)exit(1);// 下面2个循环是人工往frame里面添的数据/* 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 *///开始编码//c : 编码器上下文//&pkt : 输出压缩后的数据//frame :输入未压缩数据//&got_output :判断是否压缩成功/* send the frame to the encoder */// 进行编码压缩encode(c,frame,&pkt,f);}// 进行编码压缩encode(c,frame,&pkt,f);/* 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 0;
}

FFmpeg H264编码相关推荐

  1. windows 编译libx264 ffmpeg H264编码

    之前用FFmpeg的情形一般是 FFMpeg 拉RTSP流 解封装,然后将读出来的packet数据交给硬件去做解码编码,现在出现了一个新的轻装要求支持FFMeg软解. 即利用FFMpeg来解码 编码, ...

  2. ffmpeg的H264编码 视频逐渐模糊

    万能的互联网,又一次在临危之时解决了我的问题 最近在看ffmpeg里的H264编码,然后试着去做了一下.但是目前发现一个问题,就是编码写入的.264文件,用播放器(VLC,暴风都试过)播放后,发现编码 ...

  3. NDK开发-Android下摄像头YUV数据获取与H264编码(FFmpeg、x264)总结

    涉及知识点: Camera2 API使用 YUV420P与YUV420SP(NV21)格式转换 h264文件格式 FFmpeg工程 x264解码器 这次就先记录一下开发过程,因为牵涉到的很多技术问题都 ...

  4. Hisi3516交叉编译ffmpeg支持h264编码

    前言 Hi3516是海思半导体针对高清IPCamera产品应用开发的一款专业高端SOC芯片,具有1080P@30fps H264多码流编码性能.而ffmpeg是众多播放器的底层解.编码库,x264是一 ...

  5. Linux系统安装ffmpeg + h264视频编码

    通过我这篇文章安装的小伙伴可能会遇到h264编码转换失败的问题,本篇文章将完美解决这个问题. 此篇文章方法也适合未安装ffmpeg的系统,忽略第一步即可. 1.首先,进入你安装的ffmpeg文件夹下, ...

  6. Windows 7(Win7)下MinGW+msys编译ffmpeg,并加入H264编码支持

    可以去ffmpeg官网下载已经编译好的版本:https://ffmpeg.zeranoe.com/builds/ 该编译好的版本支持H264编码和解码 如果需要自己编译,步骤如下: 1.下载安装MSY ...

  7. FFmpeg 开发记录---H264编码,avi封装,暴风影音,qq影音播放有声无画

    使用ffmpeg编码视频文件时,视频编码为H264,音频编码为MP3,封装格式为avi,发现输出的文件用vlc,mkplayer等能正常播放,但是用暴风影音或者QQ影音等无法正常播放,有声音无画面.后 ...

  8. 使用ffmpeg以v4l2输入打开相机进行h264编码

    网上有很多关于ffmpeg打开输入流的博客,雷神的博客仅在windows下介绍了如何通过dshow打开摄像头,有关linux使用video4linux2(v4l2)方式的较少,也不全面. 本文以树莓派 ...

  9. ffmpeg H264 编解码配置

    ffmpeg H264编解码前面有文章介绍下,本文主要介绍一些参数配置. 编码: int InitEncoderCodec( int iWidth, int iHeight) {AVCodec * p ...

最新文章

  1. 哪些是我们必须要会深度学习知识
  2. ViewBag与ViewData传值乱码问题解决方案
  3. 清华大学计算机64班,清华大学计算机系的论比文评价.ppt
  4. [官方教程] [ES4封装教程]1.使用 VMware Player 创建适合封装的虚拟机
  5. FreeRTOS系统配置文件FreeRTOSConfig.h
  6. 知乎问答:现在程序员的工资是不是被高估了?
  7. [算法] 十个经典排序算法
  8. 黑莓手机将停售;三大运营商:疫情防控期间用户欠费不停机;Chrome 测试移除搜索结果页网址 | 极客头条...
  9. jsp java 购物车,jsp简单购物车
  10. 体重增长:目前为止我们所知道的一切器
  11. 为Exynos4412移植2022版U-Boot(一)步骤及其原理分析
  12. python程序memory error_科学网—[转载]解决Python memory error的问题(四种解决方案) - 高琳琳的博文...
  13. NOIP2002 产生数
  14. Ubuntu18.04安装搜狗输入法不能 用的问题20211221
  15. 2007中文网志年会印象
  16. java文件头部 追加_java文件追加写入头部
  17. 显示12306服务器处理中正在排队,12306排队等待中怎么回事_12306排队等待时间_12306一直在排队解决方法...
  18. Cortex-M3单片机的IAP在线升级上位机和下位机
  19. FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM
  20. ARM系列芯片(发展那个飞速啊)

热门文章

  1. 计算机集成控制系统应用实例,计算机集成控制系统
  2. 2018ap计算机考试时间,ap2018年考试时间是什么时候
  3. 机器学习:推荐系统算法原理解析
  4. Could not locate aapt. Please ensure you have the Android buildtools installed
  5. 广西小学计算机教案上册,第9课 去上排键家做客 教案
  6. php捉迷藏,物理学家捉迷藏(一)
  7. mssql 数据库恢复
  8. Map集合的概述与特点,常用API及特有的三种遍历方式总结,带应用
  9. JavaScript实现select下拉菜单省份和城市的级联菜单
  10. c语言remove命令和erase,详解C++ list中erase与remove函数的使用