音视频(关于视频的封装,由mp4->mov)

(20条消息) FFmpeg + Visual studio 开发环境搭建_HW140701的博客-CSDN博客

1.封装格式:AVI,MP4,ASF

AVI:压缩标准可以任意选

FLV,ts:直播等使用的流媒体

mp4:既是封装又是压缩

#pragma comment(lib,"avcodec.lib")
#pragma comment(lib,"avutil.lib")int main(int argc, char *argv[])
{char infile[] = "test.mp4";//要转的文件char outfile[] = "test.mov";//目标文件av_register_all();//注册了很多东西/*AVFormatContext **ps整个封装格式上下文{AVIOContext *pb;IO上下文,通过他可以进行写入AVStream **streams;视频音频字幕流,存放了所有的流的信息,一般这个数组的第一个是视频,第二个是音频}const char * url音视频文件地址AVInputFormat *fmt音视频格式,此格式可以传NULL,由url决定AVDictionary **options音视频格式的参数*/AVFormatContext* ic = NULL;/*** 打开输入流并读取标头。编解码器未打开。* 流必须使用 avformat_close_input() 关闭。** @param ps 指向用户提供的 AVFormatContext 的指针(由 avformat_alloc_context 分配)。* 可能是指向 NULL 的指针,在这种情况下,AVFormatContext 由此分配* 函数并写入 PS。* 请注意,用户提供的 AVFormatContext 将在失败时释放。* @param要打开的流的网址网址。* @param fmt 如果非 NULL,则此参数强制使用特定的输入格式。* 否则会自动检测格式。* @param选项 一个充满AVFormatContext和demuxer-private选项的字典。* 返回时,此参数将被销毁并替换为包含* 未找到的选项。可能为空。** 成功时为 @return 0,失败时为 AVERROR 为负值。** @note 如果要使用自定义 IO,请预分配格式上下文并设置其 pb 字段。*/avformat_open_input(&ic, infile, 0, 0);//后两个参数可根据音频文件的后缀自动检测if (!ic){cout << "avformat_open_input failed!" << endl;getchar();}///2 create output contextAVFormatContext* oc = NULL;/*** 为输出格式分配 AVFormatContext。* avformat_free_context() 可用于释放上下文和* 其中框架分配的所有内容。** @param *ctx 设置为创建的格式上下文,或在* 故障案例* @param用于分配上下文的 oformat 格式,如果为 NULL* 改用format_name和文件名* @param format_name用于分配* 上下文,如果使用 NULL 文件名代替* @param文件名 用于分配* 上下文,可能是空的* @return >= 0 如果成功,则为负 AVERROR 代码*失败*/avformat_alloc_output_context2(&oc, NULL, NULL, outfile);if (!oc){cerr << "avformat_alloc_output_context2 " << outfile << " failed!" << endl;getchar();return -1;}///3 add the streamAVStream* videoStream = avformat_new_stream(oc, NULL);//一般数组的第一个都是视频AVStream* audioStream = avformat_new_stream(oc, NULL);///4 copy paraavcodec_parameters_copy(videoStream->codecpar, ic->streams[0]->codecpar);avcodec_parameters_copy(audioStream->codecpar, ic->streams[1]->codecpar);videoStream->codecpar->codec_tag = 0;//有关编解码器的其他信息,我们此处不进行使用audioStream->codecpar->codec_tag = 0;av_dump_format(ic, 0, infile, 0);//打印输入文件的信息cout << "================================================" << endl;av_dump_format(oc, 0, outfile, 1);//打印输出文件的信息///5 open out file io,write headint ret = avio_open(&oc->pb, outfile, AVIO_FLAG_WRITE);if (ret < 0){cerr << "avio open failed!" << endl;getchar();return -1;}/*** 分配流私有数据并将流标头写入* 输出媒体文件。** @param 的媒体文件句柄,必须使用 avformat_alloc_context() 分配。*其oformat字段必须设置为所需的输出格式;* 其 pb 字段必须设置为已打开的 AVIOContext。* @param选项 一个充满 AVFormatContext 和 muxer-private 选项的 AVDictionary。* 返回时,此参数将被销毁并替换为包含* 未找到的选项。可能为空。** 如果编解码器尚未在avformat_init中完全初始化,则@return AVSTREAM_INIT_IN_WRITE_HEADER成功,* 如果编解码器已在 avformat_init 中完全初始化,则AVSTREAM_INIT_IN_INIT_OUTPUT成功,* 失败时的负面 AVERROR。** @see av_opt_find、av_dict_set、avio_open、av_oformat_next、avformat_init_output。*/ret = avformat_write_header(oc, NULL);if (ret < 0){cerr << "avformat_write_header failed!" << endl;getchar();}AVPacket pkt;for (;;){int re = av_read_frame(ic, &pkt);//此处注意,因为帧长不一定,所以每次循环需要把之前的数据清理掉if (re < 0)break;/*** 以 AVStream->time_base 为单位的演示时间戳;时间* 解压缩的数据包将呈现给用户。* 如果未存储在文件中,则可以AV_NOPTS_VALUE。* pts 必须大于或等于 dts,因为演示之前不能发生*解压缩,除非有人想查看十六进制转储。某些格式滥用* 术语 DTS 和 PTS/CTS 的含义不同。这样的时间戳* 在存储在 AVPacket 中之前,必须转换为真正的 pts/dts。AVPacket:pts: (int64_t)显示时间,结合AVStream->time_base转换成时间戳dts : (int64_t)解码时间,结合AVStream->time_base转换成时间戳size : (int)data的大小stream_index : (int)packet在stream的index位置flags : (int)标示,结合AV_PKT_FLAG使用,其中最低为1表示该数据是一个关键帧。#define AV_PKT_FLAG_KEY    0x0001 //关键帧#define AV_PKT_FLAG_CORRUPT 0x0002 //损坏的数据#define AV_PKT_FLAG_DISCARD  0x0004 /丢弃的数据side_data_elems : (int)边缘数据元数个数duration : (int64_t)数据的时长,以所属媒体流的时间基准为单位,未知则值为默认值0pos : (int64_t )数据在流媒体中的位置,未知则值为默认值 - 1
*/pkt.pts = av_rescale_q_rnd(pkt.pts,ic->streams[pkt.stream_index]->time_base,oc->streams[pkt.stream_index]->time_base,(AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));pkt.dts = av_rescale_q_rnd(pkt.dts,ic->streams[pkt.stream_index]->time_base,oc->streams[pkt.stream_index]->time_base,(AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));pkt.pos = -1;pkt.duration = av_rescale_q_rnd(pkt.duration,ic->streams[pkt.stream_index]->time_base,oc->streams[pkt.stream_index]->time_base,(AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));av_write_frame(oc, &pkt);av_packet_unref(&pkt);cout << ".";}av_write_trailer(oc);//加一个尾字段,类似于记录前面每一帧的索引和总的时长。avio_close(oc->pb);cout << "================end================" << endl;getchar();return 0;
}

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

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

相关文章

十八章:用于弱监督语义分割的自监督等变注意力机制

0.摘要 图像级弱监督语义分割是一个具有挑战性的问题&#xff0c;近年来得到了深入研究。大多数先进的解决方案利用类激活图&#xff08;CAM&#xff09;。然而&#xff0c;由于全监督和弱监督之间存在差距&#xff0c;CAM几乎无法用作对象掩码。在本文中&#xff0c;我们提出了…

深度优先搜索|79, 695,212

深度优先搜索|79. 单词搜索, 695. 岛屿的最大面积, 212. 单词搜索 II 单词搜索岛屿的最大面积单词搜索II 单词搜索 用的是深度优先搜索&#xff0c;这种判断类型的回溯我就一直不知道要怎么回退&#xff0c;然后勉强写了一个。 这里还有一个注意事项就是&#xff0c;走到最后一…

[JAVAee]定时器

目录 定时器的含义 定时器的使用 定时器的解析 ①TaskQueue ​②TimerThread ③Timer 定时器的模拟实现 ①创建Task自定义类型 ②创建TimerThread类 ③Timer类 完整代码 定时器的含义 从名字上看,就是我们通俗理解的那个定时器.设置一定的时间,并在一定的时间后发生…

安卓抓包神奇黄鸟HttpCanary安装配置及使用教程

1、下载安装包 黄鸟抓包下载地址 2、安装下载的apk 3、证书安装问题 vivo手机我安装时打开黄鸟app&#xff0c;会直接弹出&#xff0c;直接安装即可 其他手机&#xff0c;需要去系统设置中安装 3.1 搜索 证书&#xff0c;选择CA证书 3.2 进行本人操作验证 3.3 安装HttpCa…

黄东旭:The Future of Database,掀开 TiDB Serverless 的引擎盖

在 PingCAP 用户峰会 2023 上&#xff0c; PingCAP 联合创始人兼 CTO 黄东旭 分享了“The Future of Database”为主题的演讲&#xff0c; 介绍了 TiDB Serverless 作为未来一代数据库的核心设计理念。黄东旭 通过分享个人经历和示例&#xff0c;强调了数据库的服务化而非服务化…

WPF实战学习笔记24-首页编辑与完成

首页编辑与完成 indexview添加Listbox控件的鼠标双击行为 添加todo、memo的编辑命令indexviewmodel添加对应的更新事件处理 添加ToggleButton与后台的绑定 将ToggleButton的ischeck绑定到status属性添加bool int 转换器添加完成命令添加完成功能函数 Listbox添加行为 给行为…

C语言假期作业 DAY 01

题目 1.选择题 1、执行下面程序&#xff0c;正确的输出是&#xff08; &#xff09; int x5,y7; void swap() { int z; zx; xy; yz; } int main() { int x3,y8; swap(); printf("%d,%d\n"&#xff0c;x, y)…

Android Studio 代码模板插件实现

Android Studio 代码模板插件 背景 可以跳过背景和简述&#xff0c;从模板插件实现开始看. 开发新页面时&#xff0c;原先需要写一堆模板代码。比如用Databinding写列表结构的页面&#xff0c;需要手写以下文件&#xff1a; XxActivity.ktXxFragment.ktXxViewModel.ktXxListA…

一、SpringBoot基础[日志]

一、日志 解释&#xff1a;SpringBoot使用logback作为默认的日志框架&#xff0c;其中还可以导入log4j2等优秀的日志框架 1.修改日志内容 修改整个日志格式&#xff1a;logging.pattern.console%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{15} 你好 %msg%n %d{yyy…

基于K8s环境·使用ArgoCD部署Jenkins和静态Agent节点

今天是「DevOps云学堂」与你共同进步的第 47天 第⑦期DevOps实战训练营 7月15日已开营 实践环境升级基于K8s和ArgoCD 本文节选自第⑦期DevOps训练营 &#xff0c; 对于训练营的同学实践此文档依赖于基础环境配置文档&#xff0c; 运行K8s集群并配置NFS存储。实际上只要有个K8s集…

CAD .NET 15.0 企业版 Crack

CAD .NET 15.0 企业版 企业版 企业版 企业版 企业版 Updated: June 14, 2023 | Version 15.0 NEW CAD .NET is a library for developing solutions in .NET environment. It supports AutoCAD DWG/ DXF, PLT and other CAD formats. The library can be used in a wide rang…

C语言之pthread_cond_t信号变化探究总结(八十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【RabbitMQ(day2)】默认(直连)交换机的应用

文章目录 一、第一种模型&#xff08;Hello World&#xff09;二、第二种模型&#xff08;work queue&#xff09;自动确认机制的后果和公平分配 三、阐述默认交换机 这篇博客是以下资料学后的总结&#xff1a; 不良人的RabbitMQ的教学视频 官方启动教程 RabbitMQ中文文档 一、…

基于TCP/IP对等模型对计算机网络知识点的整合

目录 前言 应用层 Telnet SSH FTP/TFTP SNMP&#xff1a;简单的网络管理协议 HTTP&#xff1a;超文本传输协议 SMTP&#xff1a;电子邮件传输协议 DNS&#xff1a;域名解析协议 DHCP&#xff1a;动态主机配置协议 NTP&#xff1a;网络时钟协议 传输层 TCP UDP 端…

【SQL语句】

目录 一、SQL语句类型 1.DDL 2.DML 3.DLL 4.DQL 二、数据库操作 1.查看 2.创建 2.1 默认字符集 2.2 指定字符集 3.进入 4.删除 5.更改 5.1 库名称 5.2 字符集 三、数据表操作 1.数据类型 1.1 数值类型&#xff08;常见&#xff0c;下同&#xff09; 1.1.1 T…

ChatGPT长文本对话输入方法

ChatGPT PROMPTs Splitter 是一个开源工具&#xff0c;旨在帮助你将大量上下文数据分成更小的块发送到 ChatGPT 的提示&#xff0c;并根据如何处理所有块接收到 ChatGPT&#xff08;或其他具有字符限制的语言模型&#xff09;的方法。 推荐&#xff1a;用 NSDT设计器 快速搭建可…

【QT】Day3

1. 完成闹钟的实现&#xff1a; widgt.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> #include <QTimerEvent> //定时器事件处理函数 #include <QTime> //时间类 #include <QTextToSpeech> //文本转语音类头…

Jmap-JVM(十六)

上篇文章说了ZGC是jdk11加入的&#xff0c;他是未来jvm垃圾收集器的奠定者&#xff0c;满足TB级别内存处理&#xff0c;STW时间保持在10ms以下。 Jmap 我们可以先通过jmap -histo 进程ip 来查看&#xff0c;但是这样看不太清晰&#xff0c;我们可以用这行命令生成一个文件&…

机器学习:GPT3

GPT3 模型过于巨大 GPT3是T5参数量的10倍&#xff01; 训练GPT3的代价是$12百万美元 Zero-shot Ability GPT3的思想是不是能拿掉Fine-tune 只需要给定few-shot或者zero-shot就能干相应的任务了。 few-shot learning&#xff08;no gradient descent&#xff09;&#…

数据结构---栈

(一)栈之基础补充 C语言内存分配 对于一个C语言程序而言,内存空间主要由五个部分组成 代码段(text)、数据段(data)、未初始化数据段(bss),堆(heap) 和 栈(stack) 组成,其中代码段,数据段和BSS段是编译的时候由编译器分配的,而堆和栈是程序运行的时候由系统分配的。布局如…