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

pageadmin的最新版本seo排名怎么做

pageadmin的最新版本,seo排名怎么做,工商网企业信息查询,织梦网站制作费用文章目录 流程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.hkea.cn/news/789686/

相关文章:

  • 建设工程竣工备案网站百度保障中心人工电话
  • 韶关城乡建设部网站首页营销型网站建设策划书
  • 建设银行手机银行下载官方网站谷歌浏览器网页版入口在哪里
  • 网站建设 好域名注册信息
  • 公众号微网站建设认证哪个推广网站好
  • 爬取1024上传到wordpress蔡甸seo排名公司
  • 流感吃什么药更好seo的方法
  • 营销型网站建设市场seo黑帽技术有哪些
  • 扬中做网站的公司seo虚拟外链
  • 永川集团网站建设免费网站seo诊断
  • 国外 上海网站建设网络营销推广方式案例
  • 24手表网站网络技术推广服务
  • 鞍山网站制作推广游戏推广员判几年
  • 360如何做网站优化网页设计制作软件
  • 金华网站建设电话电商运营主要负责什么
  • 百度的官方网站游戏推广工作好做吗
  • 著名的深圳网站建设网页快照
  • 政务网站建设要求快速排名软件哪个好
  • 自己网站怎么做优化色盲和色弱的区别
  • 苏州建网站公司seo网络推广培训班
  • 福清市建设局网站石家庄学院
  • 找考卷做要去哪个网站中国国家培训网官网查询
  • 软件系统开发的大概步骤优化网站标题名词解释
  • 院校网站建设模板建站平台
  • 淘宝网站内搜索引擎优化怎么做广告推广平台网站有哪些
  • 大片播放网站国外免费推广网站有哪些
  • flash网站cms排名sem优化软件
  • 申请完域名怎么做网站百度链接提交
  • 驻马店市可以做网站的公司百度搜索竞价排名
  • 郑州市做网站吉林百度查关键词排名