/*
*   一笑奈何
*   cn-yixiaonaihe.blog.csdn.net
*/#include <iostream>
#include <thread>
extern "C" {
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libswscale/swscale.h"
#include "libswresample/swresample.h"
}
using namespace std;
static double r2d(AVRational r)
{return r.den == 0 ? 0 : (double)r.num / (double)r.den;
}
void XSleep(int ms)
{//c++ 11chrono::milliseconds du(ms);this_thread::sleep_for(du);
}
int main(int argc, char *argv[])
{cout << "Test Demux FFmpeg.club" << endl;const char *url = "test.rgb";const char *outfile = "test.mov";//初始化封装库av_register_all();//初始化网络库 (可以打开rtsp rtmp http 协议的流媒体视频)avformat_network_init();//注册解码器avcodec_register_all();FILE *fp = fopen(url,"rb");int width = 1920;int height = 1080;int fps = 25;static int i = 0;char errorbuf[1024];if (!fp){cout << "open FILE failed!" << endl;fclose(fp);return -1;}AVCodec *codec=avcodec_find_encoder(AV_CODEC_ID_H264);if (!codec){cout << "avcodec_find_encoder No" << endl;return -1;}AVCodecContext *c = avcodec_alloc_context3(codec);if (!c){cout << "avcodec_alloc_context3 No" << endl;return -1;}c->bit_rate = 400000000;c->width = width;c->height = height;c->time_base = { 1,fps };c->framerate = { fps,1 };c->gop_size = 50;c->max_b_frames = 0;c->pix_fmt = AV_PIX_FMT_YUV420P;c->codec_id = AV_CODEC_ID_H264;c->thread_count = 8;//全局编码c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;int ret = avcodec_open2(c, codec, 0);if (ret < 0){cout << "avcodec_open2 No" << endl;return -1;}cout << "avcodec_open2 OK" << endl;//2 create out contextAVFormatContext *oc = nullptr;avformat_alloc_output_context2(&oc, 0, 0, outfile);//3 add video streamAVStream *st = avformat_new_stream(oc, NULL);//st->codec = c;st->id = 0;st->codecpar->codec_tag = 0;avcodec_parameters_from_context(st->codecpar,c);cout << "========================" << endl;av_dump_format(oc, 0, outfile, 1);cout << "========================" << endl;//4 rgb to yuvSwsContext *ctx = NULL;ctx = sws_getCachedContext(ctx,width, height, AV_PIX_FMT_BGRA,width, height, AV_PIX_FMT_YUV420P,SWS_BICUBIC,NULL,NULL,NULL);//输入的空间unsigned char *rgb = new unsigned char[width * height * 4];//输出的空间AVFrame *yuv = av_frame_alloc();yuv->format = AV_PIX_FMT_YUV420P;yuv->width = width;yuv->height = height;//分配空间ret=av_frame_get_buffer(yuv, 32);if (ret < 0){cout << "av_frame_get_buffer No" << endl;return -1;}//5 wirte mp4 head//写入文件头信息ret = avio_open(&oc->pb, outfile, AVIO_FLAG_WRITE);//打开输出文件IOif (ret < 0){cout << "avio_open failed" << endl;getchar();return -1;}ret = avformat_write_header(oc, NULL);if (ret < 0){cout << "avformat_write_header failed" << endl;getchar();}int p = 0;for (;;){int len = fread(rgb, 1, width * height * 4, fp);if (len <= 0)break;uint8_t *indata[AV_NUM_DATA_POINTERS] = { 0 };indata[0] = rgb;int inlinesize[AV_NUM_DATA_POINTERS] = { 0 };inlinesize[0] = width * 4;//*4字节数int h=sws_scale(ctx, indata, inlinesize, 0, height,yuv->data,yuv->linesize);if (h <= 0)break;//6 encode frameyuv->pts = p;p = p + 3600;//yuv->pict_type = AV_PICTURE_TYPE_I;ret=avcodec_send_frame(c, yuv);if (ret != 0){continue;}AVPacket pkt;av_init_packet(&pkt);//一次发送可能多次接收ret = avcodec_receive_packet(c, &pkt);if (ret != 0){av_strerror(ret, errorbuf, sizeof(errorbuf));cout << "avcodec_receive_packet  NO ->" << errorbuf << " "<<ret<<endl;cout << " Number :" << i << " "<<ret<<endl;i++;continue;}//av_write_frame(oc, &pkt);//av_packet_unref(&pkt);av_interleaved_write_frame(oc, &pkt);cout << "<" << pkt.size << ">";}//写入视频索引尾部信息av_write_trailer(oc);//主动关闭后才可以把缓冲区的内容写到文件avio_close(oc->pb);//清理封装输出上下文avformat_free_context(oc);//关闭编码器avcodec_close(c);//清理编码器上下文avcodec_free_context(&c);//清理视频重采样上下文sws_freeContext(ctx);delete rgb;fclose(fp);cout << "==================end===============" << endl;return 0;
}

【开源项目】基于FFmpeg的RGB格式封装MOV文件相关推荐

  1. 最简单的基于FFMPEG 4.2的封装格式转换器(无编解码MP4转FLV)

    文章目录 最简单的基于FFMPEG 4.2的封装格式转换器(无编解码) 配置 代码 结果 关键函数说明 avformat_open_input avformat_find_stream_info av ...

  2. 基于 FFMPEG 的像素格式变换(swscale,致敬雷霄骅)

    基于 FFMPEG 的像素格式变换(swscale,致敬雷霄骅) 前几天写了几篇关于ffmpeg 编程转封装的入门文章,下一步本来是要写转码或者编码的.但是发现无论是转码还是编码,都会遇到图像像素格式 ...

  3. Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件

    Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 目录 利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 1.先下载ff ...

  4. DoNet开源项目-基于jQuery EasyUI的后台管理系统

    本文转载于 石佳劼的博客,有问题请到原文咨询,原文连接. 博主在业余时间开发了一个简单的后台管理系统,其中用到了 jQuery EasyUI 框架,上次分享过系统布局,参考文章:jQuery Easy ...

  5. DoNet开源项目-基于Amaze UI的点餐系统

    本文转载于 石佳劼的博客,有问题请到原文咨询,原文连接. 点餐系统 帮朋友做的点餐系统,主要是为了让顾客在餐桌上,使用微信扫描二维码,就可以直接点菜,吃完使用微信付款. 系统演示地址,账户名和密码均为 ...

  6. 开源项目-基于Intel VT技术的Linux内核调试器

    本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...

  7. Web 自动化解决方案 [开源项目] 基于 Selenium 的 Web 自动化测试框架完美版

    欢迎查阅Selenium(Web自动化测试框架体系) Selenium ) Selenium是一个用于Web应用程序的自动化测试工具,直接运行在浏览器中,就像真正的用户在操作一样• 支持的浏览器包括I ...

  8. [开源项目]基于FPGA的视频图像拼接融合

    基于FPGA的视频图像拼接融合 本项目简单来说,就是实时生成视频全景图,该架构经过优化,可以实时视频输出. 算法 下图说明了描述算法每个步骤的系统框图 该系统大致可以分为三个子系统: 预处理 基于 S ...

  9. 开源项目-基于小熊派STM32红外热成像仪

    点击上方"嵌入式应用研究院",选择"置顶/星标公众号" 干货福利,第一时间送达! 来源 | 嵌入式应用研究院 整理&排版 | 嵌入式应用研究院 中秋假期 ...

最新文章

  1. python goto 用法
  2. 脱机多维数据集CUB文件的生成
  3. java cmd找不到文件_cmd中输入java找不到文件解决方法
  4. 遇见王沥川的人生感悟_23岁酱油泡饭默默无闻,31岁逆袭人生,王彦霖有何魅力?...
  5. 企业使用开源软件的风险
  6. Java_基础阶段笔记总结汇总
  7. c语言10个数求立方合并输出,C语言 求出100~999之间的所有“水仙花数”并输出...
  8. Mr.J-- jQuery学习笔记(十二)--移入移出事件电影排行榜小demo
  9. Xshell利用密钥远程登录Linux
  10. 奇瑞a3中控按键图解_5万元价位人生第一辆爱车如何选 奇瑞艾瑞泽5对比吉利远景...
  11. python数据分析 活用pandas库_Python数据分析:活用Pandas库
  12. 机器人编程常用语言汇总(WeDo/EV3/Arduino/Scratch)
  13. 《东周列国志》第九十二回 赛举鼎秦武王绝胫 莽赴会楚怀王陷秦
  14. 520表白小程序设计Python代码详解(PyQt5界面,B站动漫风)
  15. 《共享经济:市场设计及其应用》——…
  16. 最快的计算机操作,自学电脑操作怎样比较快?
  17. 哪些5G芯片和5G模组已经问世?| 截止至2020年Q1
  18. ​前端VueRouter解析
  19. ELF文件格式的详解
  20. Abaqus基础问题解答

热门文章

  1. hazelcast入门教程_Hazelcast入门指南第2部分
  2. hystrix合并请求_Hystrix中的批处理(折叠)请求
  3. java scala_经过几天的Scala回归Java的10个最烦人的事情
  4. 使用AWS Lambda,S3和AWS CloudFront进行动态内容缓存
  5. 使用JavaSymbolSolver解决Java代码中的方法调用
  6. spring 事物合并_Spring系列合并
  7. spring shell_Spring Shell项目发布
  8. 打破冷漠僵局文章_研究僵局–第1部分
  9. spring观察者模式_Spring事件的观察者模式
  10. 使用Java 8流遍历递归数据结构