【FFMPEG应用篇】基于FFmpeg的RGB格式封装MOV文件

/*
*   一笑奈何
*   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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python launcher卸载后蓝屏_误卸载python2.4导致yum不能用后的修复

去 http://mirrors.ustc.edu.cn/centos/或者镜像下载如下包&#xff0c;版本不一定非常一致 python-2.4.3-56.el5.x86_64.rpm python-devel-2.4.3-56.el5.i386.rpm python-devel-2.4.3-56.el5.x86_64.rpm python-iniparse-0.2.3-6.el5.noarch.rpm python-libs-2.4.3-56.el5.x86…

owin 怎么部署在云中_使用Boxfuse轻松在云中运行Spring Boot应用程序

owin 怎么部署在云中几天前&#xff0c;我开始构建一个将使用REST API检索和存储数据的iOS应用。 该REST API将是我也必须构建的服务器应用程序。 由于我熟悉Java和Spring &#xff0c;因此决定使用Spring Boot作为框架。 为了能够在我的iPhone上使用它&#xff0c;如果我可以在…

【FFMPEG应用篇】基于FFmpeg的PCM数据编码为AAC

/* * 一笑奈何 * cn-yixiaonaihe.blog.csdn.net */#include <iostream> #include <thread> extern "C" { #include "libavformat/avformat.h" #include "libavcodec/avcodec.h" #include "libswscale/swscale.h" #inc…

计算机过程控制系统实例ppt,chap7 前馈控制系统_武汉理工大学:调节仪表与过程控制系统_ppt_大学课件预览_高等教育资讯网...

第七章 前馈及复合控制系统其他反馈控制的缺点&#xff1a;无法将干扰克服在被控制量偏离设计值之前。被控对象总是存在一定的纯滞后和容量滞后&#xff0c;故限制了控制作用的充分发挥。 7-1 基本概念1、问题的提出2、技术思路直接按扰动而不是按偏差进行控制。干扰发生后&…

用python画时序图源代码_使用python实现画AR模型时序图

背景&#xff1a; 用python画AR模型的时序图。 结果&#xff1a;代码&#xff1a; import numpy as np import matplotlib.pyplot as plt """ AR(1)的时序图&#xff1a;x[t]a*x[t-1]e """ num 2000 e np.random.rand(num) x np.empty(num) &…

属性拼接转换成字符串_使用一些可选的将字符串配置属性转换为其他类型

属性拼接转换成字符串有一天&#xff0c;您遇到一些代码&#xff0c;并认为这很漂亮&#xff0c;为什么我没有想到呢&#xff1f; 因此&#xff0c;我的长期同事Mark Warner在使用方法引用处理从String进行转换的标准名称/值存储模式方面有一个不错的选择。 int size store.g…

【FFMPEG应用篇】基于FFmpeg的PCM和RGB数据统一封装

项目采用工程模式进行构造。 技术解决难点&#xff1a; 1.编码后的PTS时间一定要赋值。2.音视频封装同步问题&#xff0c;其中涉及到PTS同步问题&#xff0c;例如视频25PTS/s 音频43PTS/s&#xff08;44100采样率/1024每帧&#xff09;&#xff0c;音频要慢于视频所以这种情…

windows数据自动上传服务器,windows服务器间自动传输文件

日常运维工作中需要在windows服务器间传输文件的使用场景比较多&#xff0c;比较典型的例子为应用程序的离线自动备份&#xff0c;下面分享笔者日常使用的服务器间自动传输文件脚本rem 设置共享net use \\**IP**\程序配置和数据备份 "******(密码)" /user:"admi…

python模块使用_一文让你学会所有的python模块使用

部分高等技能:为了削减一个编译模块的大年夜小&#xff0c;你可以在 Python 敕令行中应用 -O 或者 -OO。-O 参数删除了断言语句&#xff0c;-OO 参数删除了断言语句和 __doc__ 字符串。 因为某些法度榜样依附于这些变量的可用性&#xff0c;你应当只在肯定无误的场合应用这一选…

rest web服务_在WildFly的REST Web服务中与Jackson的双向关系

rest web服务这是使用Jackson的REST Web服务中Java实体之间的双向关系的示例。 假设我们在两个实体Parent和Child之间存在双向关系。 使用MySQL工作台为这两个表生成SQL模式文件。 DROP SCHEMA IF EXISTS bidirectional_schema ; CREATE SCHEMA IF NOT EXISTS bidirectional…

【开源项目】基于Directx屏幕录制

#include<d3d9.h> #include<iostream> #pragma comment(lib,"d3d9.lib") using namespace std; //截取全屏 void CaptureScreen(void *data) {//1 创建directx3d对象static IDirect3D9 *d3d nullptr;if (!d3d){d3d Direct3DCreate9(D3D_SDK_VERSION);…

git 修改分支名字_基础Git操作与GitHub协作吐血整理,收好!| 原力计划

作者 | 光子俊来源 | CSDN博客出品 | CSDN(ID:CSDNnews)Git介绍Git是目前世界上最先进的分布式版本控制系统&#xff0c;可以为我们管理项目、构建工程、多人协作提供便利&#xff0c;作为一个爱技术的你可以是必须要掌握的呀&#xff01;&#xff01;&#xff01;Git安装(inst…

Win7system登录打开计算机,Windows7系统system文件丢失导致开机黑屏如何解决

最近有windows7系统用户在开机的时候遇到了黑屏的问题&#xff0c;却提示“因以下文件的损坏或丢失&#xff0c;Windows无法启动windows/system32/config/system”的错误&#xff0c;导致无法开机&#xff0c;针对Windows7系统system文件丢失导致开机黑屏问题&#xff0c;本文就…

javafx阴影_JavaFX技巧来节省内存! 属性和可观察对象的阴影场

javafx阴影在 JavaFX的世界中&#xff0c; Properties API允许UI开发人员将值绑定到UI控件。 这种功能出奇的简单&#xff0c;但是当对象模型经常使用属性时&#xff0c;应用程序可能会很快耗尽内存。 我通常会编写两个单独的对象&#xff0c;例如pojo类和表示模型对象。 此技术…

【开源项目】基于QT录制PCM音频实例详细

#include "QtAudio_input.h" #include <QtWidgets/QApplication> #include<QAudioInput> #include<iostream> using namespace std; int main(int argc, char *argv[]) {QAudioFormat fmt;fmt.setSampleRate(44100);//样本率fmt.setSampleSize(16)…

工业计算机改造报告,工业计算机实验报告..docx

实验一 A/D、D/A 转换实验一、实验目的1.了解温控系统的组成。2.了解NI 测量及自动化浏览器的使用并对数据采集卡进行设置。3.了解Dasylab 软件的各项功能&#xff0c;并会简单的应用。4.通过实验了解计算机是如何进行数据采集、控制的。二、实验设备微型计算机、NI USB 6008 数…

yum install -y 是什么意思_为什么你应该在docker 中使用gosu?

为什么要使用gosu&#xff1f;Docker容器中运行的进程&#xff0c;如果以root身份运行话会有安全隐患&#xff0c;该进程拥有容器内的全部权限&#xff0c;更可怕的是如果有数据卷映射到宿主机&#xff0c;那么通过该容器就能操作宿主机的文件夹了&#xff0c;一旦该容器的进程…

openshift_Openshift源中的高可用性Drools无状态服务

openshift嗨&#xff0c;大家好&#xff01; 在这篇博客文章中&#xff0c;我想举一个简单的示例&#xff0c;展示使用Openshift 3&#xff08;Docker和Kubernetes&#xff09;扩展我们的Drools Stateless服务有多么容易。 我将展示如何通过按需提供新实例来扩展我们的服务&…

【WebRTC---源码篇】(一)全局初始化

一&#xff0c;任何平台的客户端在使用WebRTC的API之前都需要进行一些初始化操作&#xff0c;主要是设置实验性功能开关&#xff0c;初始化SSL&#xff0c;当然也可以启用trace,设置日志输出等。 Windows和Linux端的初始化 rtc::WinsockInitializer winsock_init;rtc::Win32So…

ibm服务器芯片架构,IBM x366 服务器技术详解

背景资料IBM eServer x366 提供了突破性的 4 路性能&#xff0c;采用机架优化的 3U服务器设计&#xff0c;结合了源自大型机灵感的 eServer X3技术的高可用性&#xff0c;具有最新 64 位Intel Xeon MP 处理器带来的 64位性能&#xff0c;可创建面向商业企业应用程序、虚拟化及 …