yuv编码成h264格式写成文件
(使用ffmpeg 编码yuv420p编码成h264格式)

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>#include <libavcodec/avcodec.h>
#include <libavutil/time.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>static int encode(AVCodecContext* enc_ctx, AVFrame* frame, AVPacket* pkt, FILE* outfile)
{int ret;//发送一帧进行编码ret = avcodec_send_frame(enc_ctx, frame);if(ret < 0){fprintf(stderr, "avcodec_send_frame() failed!\n");return -1;}while (ret >= 0){//获取编码后的数据ret = avcodec_receive_packet(enc_ctx, pkt);if(ret == AVERROR(EAGAIN) || ret == AVERROR_EOF){return 0;}else if(ret < 0){fprintf(stderr, "avcodec_receive_packet() failed!\n");return -1;}//写入文件fwrite(pkt->data, 1, pkt->size, outfile);}}int main()
{printf("Hello video encoder!\n");char* in_yuv_file = "test_yuv420p_1280x720.yuv";char* out_h264_file = "test_420p_1280x720.h264";FILE* infile = NULL;FILE* outfile = NULL;const char* codec_name = "libx264";const AVCodec* codec = NULL;AVCodecContext* codec_ctx = NULL;AVFrame* frame = NULL;AVPacket* pkt = NULL;int ret = 0;//查找指定的编码器codec = avcodec_find_encoder_by_name(codec_name);if(!codec){fprintf(stderr, "avcodec_find_encoder_by_name() failed!\n");return 0;}//分配编码器上下文codec_ctx = avcodec_alloc_context3(codec);if(!codec_ctx){fprintf(stderr, "avcodec_alloc_context3() failed!\n");return 0;}//设置分辨率codec_ctx->width = 1280;codec_ctx->height = 720;//设置time_baseAVRational time_base = {1, 25};AVRational framerate = {25, 1};codec_ctx->time_base = time_base;codec_ctx->framerate = framerate;//设置I帧间隔(GOP size)codec_ctx->gop_size = 25;//planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)//YYYY....UU....VV....codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P;//设置一些参数//这些参数可能会相互影响的,preset设置就有可能会影响到profileif(codec->id == AV_CODEC_ID_H264){//h264的参数// baseline profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;//extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;//main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced),也支持//CAVLC 和CABAC 的支持;//high profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、 无损视频编码//和更多的YUV 格式;ret = av_opt_set(codec_ctx->priv_data, "profile", "main", 0);if(ret != 0){sprintf(stderr,"av_opt_set() profile = main failed!\n");}//x264编码器下的参数//编码速度和压缩率之间做出1个权衡//ultrafast//superfast//veryfast//faster//fast//medium – default preset//slow//slower//veryslow//placeboret = av_opt_set(codec_ctx->priv_data, "preset", "medium", 0);if(ret != 0){sprintf(stderr, "av_opt_set() preset = medium failed!\n");}//x264编码器下的参数//film:电影类型,对视频的质量非常严格时使用该选项//animation:动画片,压缩的视频是动画片时使用该选项//grain:颗粒物很重,该选项适用于颗粒感很重的视频//stillimage:静态图像,该选项主要用于静止画面比较多的视频//psnr:提高psnr,该选项编码出来的视频psnr比较高//ssim:提高ssim,该选项编码出来的视频ssim比较高//fastdecode:快速解码,该选项有利于快速解码//zerolatency:零延迟,该选项主要用于视频直播ret = av_opt_set(codec_ctx->priv_data, "tune", "zerolatency", 0);if(ret != 0){sprintf(stderr, "av_opt_set() tune = zerolatency failed!\n");}}//码率codec_ctx->bit_rate = 3000000;//将codec_ctx 和codec关联ret = avcodec_open2(codec_ctx, codec, NULL);if(ret < 0){fprintf(stderr, "avcodec_open2() failed!\n");return 0;}//打开输入文件 和 输出文件infile = fopen(in_yuv_file, "rb");if(!infile){fprintf(stderr, "fopen() in_yuv_file failed!\n");return 0;}outfile = fopen(out_h264_file, "wb");if(!outfile){fprintf(stderr, "fopen() out_h264_file failed!\n");return 0;}//分配AVPacketpkt = av_packet_alloc();if(!pkt){fprintf(stderr, "av_packet_alloc() failed!\n");return 0;}//分配AVFrameframe = av_frame_alloc();if(!frame){fprintf(stderr, "av_frame_alloc() failed!\n");return 0;}frame->width = codec_ctx->width;frame->height = codec_ctx->height;frame->format = codec_ctx->pix_fmt;//计算出一帧数据的大小 像素格式 * 宽 * 高int frame_bytes = av_image_get_buffer_size(frame->format, frame->width,frame->height, 1);printf("frame_bytes = %d\n", frame_bytes);uint8_t* yuv_buf = (uint8_t*)malloc(frame_bytes);if(!yuv_buf){printf("yuv_buf malloc() failed!\n");return 0;}int64_t pts = 0;while (1){//从文件读一帧数据memset(yuv_buf, 0, frame_bytes);size_t read_bytes = fread(yuv_buf, 1, frame_bytes, infile);if(read_bytes <= 0){fprintf(stderr, "fread end!\n");break;}//根据设置的参数将yuv数据填充到frame->data , frame->linesizeint fill_size = av_image_fill_arrays(frame->data, frame->linesize, yuv_buf,frame->format, frame->width, frame->height, 1);if(fill_size != frame_bytes){fprintf(stderr, "av_image_fill_arrays failed!\n");break;}pts += 40;//设置ptsframe->pts = pts;ret = encode(codec_ctx, frame, pkt, outfile);if(ret < 0){fprintf(stderr, "encode failed!\n");break;}}//冲刷编码器encode(codec_ctx, NULL, pkt, outfile);fclose(infile);fclose(outfile);if(yuv_buf){free(yuv_buf);}av_frame_free(&frame);av_packet_free(&pkt);avcodec_free_context(&codec_ctx);printf("video encoder end!\n");return 0;
}

yuv编码成h264格式写成文件相关推荐

  1. 用python读取pg数据库中的blob类型图片数据,转换存成jpg格式存到本地文件夹

    先啰嗦一下,热热身 在工作中,我们常见到数据库中的数据类型主要为char,varchar,text等,但是有时我们也会用blob格式来存储语音文件或者图像文件,在网上找了很多,都没找到合适的办法,只好 ...

  2. ffmpeg将yuv数据编码为H264格式数据

    1.yuv->H264经过编码后可以明显缩小视频文件的体积,例如我们经常看到的MP4文件其实就是由H264格式的视频文件和aac音频格式文件打包而成. 2.整个编码流程: 网上的一个关于AVFo ...

  3. ffmpeg实战教程(三)音频PCM采样为AAC,视频YUV编码为H264/HEVC

    ffmpeg实战教程(三)音频PCM采样为AAC,视频YUV编码为H264/HEVC https://blog.csdn.net/King1425/article/details/71180330 音 ...

  4. 用x264和ffmpeg将YUV编码为.h264(1)

    参考: 1.http://blog.csdn.net/leixiaohua1020/article/details/25430425 2.http://blog.csdn.net/leixiaohua ...

  5. 如何编码实现NTFS格式下删除文件的恢复(结束)

    写完"如何编码实现NTFS格式下删除文件的恢复"和"如何编码实现NTFS格式下删除文件的恢复(续一)"后,好多朋友询问下文,但是最近忙着写别的东西,实在是没工夫 ...

  6. FFmpeg —— 12.示例程序(六):视频编码器(YUV编码为H264)

    流程 下面附一张使用FFmpeg编码视频的流程图.使用该流程,不仅可以编码H.264的视频,而且可以编码MPEG4/MPEG2/VP8等等各种FFmpeg支持的视频.图中蓝色背景的函数是实际输出数据的 ...

  7. ffmpeg学习八:软件生成yuv420p视频并将其编码为H264格式

    通过前面对ffmpeg中常用的几个api的源码分析,从而对api有了更好的理解.之前已经做过视频的解码了,今天来尝试视频的编码.ffmpeg已经给我们提供了相应的可供参考的程序:doc/example ...

  8. 如何编码实现NTFS格式下删除文件的恢复

    主要内容 一.NTFS系统结构原理 二.编码实现NTFS磁盘删除文件扫描 三.编码实现NTFS磁盘删除文件恢复 (编码实现的磁盘文件恢复小工具下载地址) 工具截图 第一部分 NTFS系统结构原理 NT ...

  9. 【目标检测】TT100K数据集使用,提取标注信息并转换成VOC格式的xml文件或yolo格式的txt文件

    1 TT100K 官网 TT100K官网 1.1 数据集介绍 本人下载的是2021的数据集,训练集 6105张图片, 测试集 3071 张图片,每张图片的分辨率为2048 * 2048,共有232 种 ...

最新文章

  1. UML类图符号 各种关系说明以及举例
  2. CentOS开机自动运行程序的脚本
  3. 一个关于linux文件预读机制问题
  4. MYSQL数据库VALUES_MySQL数据库“十宗罪”(十大经典错误案例)
  5. tez安装官方文档整理+翻译
  6. mysql 连续签到天数_最大连续签到天数-sql
  7. (93)异步FIFO结构,为什么用格雷码? ,面试必问(十七)(第19天)
  8. 基于SSM的猫头鹰轻博客系统
  9. php手机i选择图片多选,ios 相册图片多选 带预览功能
  10. 1小时就会的测试用例【直播推流/拉流】
  11. python查看文件大小_python查看文件大小和文件夹内容的方法
  12. php搭建mysql连接池
  13. 忘记网站后台密码 PHP+mysql+md5 破解
  14. Photoshop插件-证件照-3寸裁剪-3寸排版-脚本开发-PS插件
  15. 用C语言求最小公倍数和最大公约数
  16. iOS多线程编程之NSThread的使用(★★★推荐,为原作者点赞★★★)
  17. Java中map的含义
  18. 应用为本 浅谈电脑硬盘日常保养与维护技巧
  19. 在阿里的一年,让我的技术思维有了翻天覆地的变化
  20. 王文彬:谈PaaS对互联网产业的影响 PaaS vs IaaS 你需要知道的!

热门文章

  1. antd Table/ProList中rowClassName用法(补充记录)
  2. Ajax应用查询员工信息
  3. js笔记(二)数组、对象、this
  4. meta标签的用处详解
  5. 图的顺序存储(邻接矩阵存储)【摘录自严长生老师的网站】
  6. 企业级应用与互联网应用的区别
  7. HBase MapReduce
  8. 使用Gitolite搭建Gitserver
  9. java如何从方法返回多个值
  10. 【知识积累】DES算法之C#加密Java解密