当前位置: 首页 > news >正文

沧州网站域名注册服务公司北京网站优化步

沧州网站域名注册服务公司,北京网站优化步,企业官网设计尺寸,个人网页制作设计模板文章目录 流程api核心代码muxer.hmuxer.cpp aac 和 h264 封装为视频流,封装为c的Muxter类 流程 分配视频文件上下文 int Init(const char *url); 创建流,赋值给视频的音频流和视频流 int AddStream(AVCodecContext *codec_ctx); 写视频流的head int Se…

文章目录

      • 流程
      • api
      • 核心代码
        • muxer.h
        • muxer.cpp

aac 和 h264 封装为视频流,封装为c++的Muxter类

流程

  • 分配视频文件上下文
    int Init(const char *url);

  • 创建流,赋值给视频的音频流和视频流
    int AddStream(AVCodecContext *codec_ctx);

  • 写视频流的head
    int SendHeader();

  • 写视频流的packet,需要转换packet的pts和dts , 值为 原有pts * 编码时间基/ 视频流的时间基
    int SendPacket(AVPacket *packet)

  • 写视频流的trail
    int SendTrailer();

  • 释放资源
    void DeInit();

api

int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const
// 时间基转换函数 , 计算结果为 a * bq / cq

核心代码

muxer.h
#ifndef MUXER_H
#define MUXER_H
#include <iostream>
extern "C"
{
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
}class Muxer
{
public:Muxer();~Muxer();// 输出文件 返回<0值异常// 初始化int Init(const char *url);// 资源释放void DeInit();// 创建流int AddStream(AVCodecContext *codec_ctx);// 写流int SendHeader();int SendPacket(AVPacket *packet);int SendTrailer();int Open(); // avio open
private:AVFormatContext *fmt_ctx_ = NULL;std::string url_ = "";// 编码器上下文AVCodecContext *aud_codec_ctx_= NULL;AVStream *aud_stream_ = NULL;AVCodecContext *vid_codec_ctx_= NULL;AVStream *vid_stream_ = NULL;int audio_index_ = -1;int video_index_ = -1;
};#endif // MUXER_H
muxer.cpp
 #include "muxer.h"Muxer::Muxer()
{}Muxer::~Muxer()
{}int Muxer::Init(const char *url)
{int ret = avformat_alloc_output_context2(&fmt_ctx_, NULL, NULL,url);if(ret != 0) {char errbuf[1024] = {0};av_strerror(ret, errbuf, sizeof(errbuf) - 1);printf("avformat_alloc_output_context2 failed:%s\n", ret);return -1;}url_ = url;return 0;
}void Muxer::DeInit()
{if(fmt_ctx_) {avformat_close_input(&fmt_ctx_);}url_ = "";aud_codec_ctx_ = NULL;aud_stream_ = NULL;audio_index_ = -1;vid_codec_ctx_ = NULL;vid_stream_ = NULL;video_index_ = -1;
}int Muxer::AddStream(AVCodecContext *codec_ctx)
{if(!fmt_ctx_) {printf("fmt ctx is NULL\n");return -1;}if(!codec_ctx) {printf("codec ctx is NULL\n");return -1;}AVStream *st = avformat_new_stream(fmt_ctx_, NULL);if(!st) {printf("avformat_new_stream failed\n");return -1;}//    st->codecpar->codec_tag = 0;// 从编码器上下文复制, 根据提供的编解码器的值填充参数结构avcodec_parameters_from_context(st->codecpar, codec_ctx);av_dump_format(fmt_ctx_, 0, url_.c_str(), 1);// 判断当前的是视频流还是音频流if(codec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {aud_codec_ctx_ = codec_ctx;aud_stream_ = st;audio_index_ = st->index;}  else if(codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {vid_codec_ctx_ = codec_ctx;vid_stream_ = st;video_index_ = st->index;}return 0;
}int Muxer::SendHeader()
{if(!fmt_ctx_) {printf("fmt ctx is NULL\n");return -1;}int ret = avformat_write_header(fmt_ctx_, NULL);if(ret != 0) {char errbuf[1024] = {0};av_strerror(ret, errbuf, sizeof(errbuf) - 1);printf("avformat_write_header failed:%s\n", ret);return -1;}return 0;
}int Muxer::SendPacket(AVPacket *packet)
{int stream_index = packet->stream_index;if(!packet || packet->size <= 0 || !packet->data) {printf("packet is null\n");if(packet)av_packet_free(&packet);return -1;}AVRational src_time_base;   // 编码后的包AVRational dst_time_base;   // mp4输出文件对应流的time_baseif(vid_stream_ && vid_codec_ctx_ && stream_index == video_index_) {src_time_base = vid_codec_ctx_->time_base;dst_time_base = vid_stream_->time_base;} else if(aud_stream_ && aud_codec_ctx_ && stream_index == audio_index_) {src_time_base = aud_codec_ctx_->time_base;dst_time_base = aud_stream_->time_base;}// 时间基转换// int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;// 时间基转换函数  a * bq / cqpacket->pts = av_rescale_q(packet->pts, src_time_base, dst_time_base);packet->dts = av_rescale_q(packet->dts, src_time_base, dst_time_base);packet->duration = av_rescale_q(packet->duration, src_time_base, dst_time_base);int ret = 0;//写packetret = av_interleaved_write_frame(fmt_ctx_, packet); // 不是立即写入文件,内部缓存,主要是对pts进行排序//    ret = av_write_frame(fmt_ctx_, packet);av_packet_free(&packet);if(ret == 0) {return 0;}else {char errbuf[1024] = {0};av_strerror(ret, errbuf, sizeof(errbuf) - 1);printf("avformat_write_header failed:%s\n", ret);return -1;}
}int Muxer::SendTrailer()
{if(!fmt_ctx_) {printf("fmt ctx is NULL\n");return -1;}int ret = av_write_trailer(fmt_ctx_);if(ret != 0) {char errbuf[1024] = {0};av_strerror(ret, errbuf, sizeof(errbuf) - 1);printf("av_write_trailer failed:%s\n", ret);return -1;}return 0;
}
http://www.yayakq.cn/news/94325/

相关文章:

  • 公司建设网站价格多少开一个软件开发公司需要多少钱
  • 网站搭建心得体会含数据的wordpress
  • 注册域名怎么建设网站seo公司排名教程
  • 项目符号在哪里设置怀化 优化生育政策
  • 焦作建设企业网站公司九里徐州网站开发
  • 网站建设客户开发方案dw网页制作成品代码加图片
  • 常州做网站优化使用网站
  • 如何建外贸网站莱州网站建设包年
  • 电商网站用php做的吗网站seo服务商
  • 广州做网站基本流程网站建设方案交换认苏州久远网络
  • c 手机网模板网站什么软件推广比较好
  • 网站logo怎么设置php投资理财企业网站模板
  • iis 网站正在建设中0735郴州招聘信息网
  • 四面山网站建设自学做网站需要学会哪些
  • 英文免费网站模板苏州易网推网络科技有限公司
  • 建设项目环保竣工验收备案网站江西省建设工程协会网站查询
  • 网站后台内容编辑器下载网站建设的定位是什么意思
  • 获取整个网站源码工具家政服务 技术支持 东莞网站建设
  • 美工是做什么的难学吗北京百度seo关键词优化
  • 合肥网站建设求职简历要建立网站是否要先做网页设计_然后把网页设计与数据库连接起来?
  • 阿里云网站开发工具如何自己做一个网页
  • 本溪网站设计公司自己房子怎么挂网站做民宿
  • 个人站长做哪些网站好国外网页网站设计
  • 开网站的是啥公司电话营销技巧和营销方法
  • 网站建设在淘宝上以后让还让发布吗做网站的销售能干什么
  • 上海大公司北京搜索引擎优化管理专员
  • 网站快速建设入门教程wordpress 收集表单
  • 网站多次提交app网站开发要多少钱
  • 帝国网站建设苏州高端网站建设定制
  • 青岛建站推广sem工作原理