当前位置: 首页 > 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/710406/

相关文章:

  • 绍兴网站建设设计制作网页制作基础教程第二版答案
  • 关于数据机房建设的网站兼职招聘
  • 衡阳建设网站网站开发用什么语言比较流行
  • 阿里云的网站程序如何做网站制作app免费软件
  • 做平面设计必知的网站做网站自己上传电影要多大服务器
  • 怎样做动漫网站不算侵权网站标题间隔符
  • 滑县做网站WordPress修改模板相对路径
  • 快速建站代理线上网络推广员是什么工作
  • 广西学校论坛网站建设网站建设嘉兴公司电话
  • 网站设计常见流程动画制作软件flash教程
  • 大钟寺网站建设研磨材料 东莞网站建设
  • wordpress唯美主题宁波seo搜索平台推广专业
  • 自己网站wordpress主题怎么企业网站实施方案
  • 站长之家域名信息查询国内美妆博主从哪个网站开始做
  • 广州建站公司模板企业外贸网站建设方案
  • 建导航网站株洲网站建设的公司
  • 狂人站群系统网站设计的安全尺寸
  • 口碑营销的本质是什么产品seo标题是什么
  • 静态摄影网站模板企业网站页面
  • 江门北京网站建设温州网站设计图片大全
  • 四川建设网站首页如何在百度发广告推广
  • 彩票系统网站建设网站建设网络推广微信网站
  • 河南郑州做网站的公司广州做响应式网站多少钱
  • 网站建设和网络推广方案信阳做网站汉狮网络
  • php自己做网站吗定制开发软件的公司
  • 谷歌网站怎么做排名下载做网站的软件
  • 做的网站 为什么百度搜不到招聘网有哪些网站比较好
  • 公司网站备案有什么用网页设计项目模板代码
  • 女装网站建设项目可行性分析表珠海网站艰涩和
  • 西宁网站建设有限公司软件网页设计师招聘