ffmpeg 转换es流成为ps流

目的是将es流转换成为ps流

写入到文件中

#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/avutil.h>
#include <libavutil/timestamp.h>int main(int argc, char** argv) {const char* input_filename = "input.mp4"; // 输入文件名const char* output_filename = "output.ps"; // 输出PS文件名// 初始化FFmpegav_register_all();avformat_network_init();// 打开输入文件AVFormatContext* ifmt_ctx = NULL;if (avformat_open_input(&ifmt_ctx, input_filename, 0, 0) < 0) {fprintf(stderr, "Could not open input file '%s'\n", input_filename);return -1;}// 获取输入流信息if (avformat_find_stream_info(ifmt_ctx, 0) < 0) {fprintf(stderr, "Failed to retrieve input stream information\n");return -1;}// 打开输出文件AVFormatContext* ofmt_ctx = NULL;avformat_alloc_output_context2(&ofmt_ctx, NULL, "mpeg", output_filename);if (!ofmt_ctx) {printf("Could not create output context\n");return -1;}// 复制流并设置输出参数for (unsigned int i = 0; i < ifmt_ctx->nb_streams; i++) {AVStream* in_stream = ifmt_ctx->streams[i];AVStream* out_stream = avformat_new_stream(ofmt_ctx, in_stream->codecpar->codec);if (!out_stream) {fprintf(stderr, "Failed allocating output stream\n");return -1;}avcodec_parameters_copy(out_stream->codecpar, in_stream->codecpar);out_stream->time_base = in_stream->time_base;}// 打开输出文件的输出流if (!(ofmt_ctx->oformat->flags & AVFMT_NOFILE)) {if (avio_open(&ofmt_ctx->pb, output_filename, AVIO_FLAG_WRITE) < 0) {fprintf(stderr, "Could not open output file '%s'\n", output_filename);return -1;}}// 写入文件头if (avformat_write_header(ofmt_ctx, NULL) < 0) {fprintf(stderr, "Error occurred when opening output file\n");return -1;}// 重采样和转封装的逻辑通常在这里,但因为我们只是简单地转封装,可以使用av_interleaved_write_frame直接写入AVPacket pkt;while (1) {AVStream* in_stream, *out_stream;if (av_read_frame(ifmt_ctx, &pkt) >= 0) {in_stream  = ifmt_ctx->streams[pkt.stream_index];out_stream = ofmt_ctx->streams[pkt.stream_index];// 设置pts/dtspkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);pkt.pos = -1;// 写入包if (av_interleaved_write_frame(ofmt_ctx, &pkt) < 0) {fprintf(stderr, "Error muxing packet\n");break;}av_packet_unref(&pkt);} else {break;}}// 写入尾部并关闭文件av_write_trailer(ofmt_ctx);if (ofmt_ctx && !(ofmt_ctx->oformat->flags & AVFMT_NOFILE))avio_closep(&ofmt_ctx->pb);// 释放资源avformat_close_input(&ifmt_ctx);avformat_free_context(ofmt_ctx);return 0;
}

写入到缓存

#include <stdio.h>
#include <stdlib.h>
#include <libavformat/avformat.h>int main(int argc, char *argv[]) {AVFormatContext *inFormatContext = NULL;AVFormatContext *outFormatContext = NULL;AVOutputFormat *outputFormat = NULL;AVPacket packet;int ret;uint8_t *psBuffer = NULL;int psBufferSize = 0;// 注册所有的FFmpeg组件av_register_all();// 打开输入文件ret = avformat_open_input(&inFormatContext, argv[1], NULL, NULL);if (ret < 0) {fprintf(stderr, "无法打开输入文件\n");return -1;}// 查找流信息ret = avformat_find_stream_info(inFormatContext, NULL);if (ret < 0) {fprintf(stderr, "无法获取流信息\n");return -1;}// 打开输出文件outFormatContext = avformat_alloc_context();if (!outFormatContext) {fprintf(stderr, "无法创建输出文件上下文\n");return -1;}outputFormat = av_guess_format(NULL, "output.ps", NULL);if (!outputFormat) {fprintf(stderr, "无法猜测输出格式\n");return -1;}outFormatContext->oformat = outputFormat;// 逐个处理输入文件的流for (int i = 0; i < inFormatContext->nb_streams; i++) {AVStream *inStream = inFormatContext->streams[i];AVStream *outStream = avformat_new_stream(outFormatContext, NULL);if (!outStream) {fprintf(stderr, "无法创建输出流\n");return -1;}ret = avcodec_parameters_copy(outStream->codecpar, inStream->codecpar);if (ret < 0) {fprintf(stderr, "无法复制编解码参数\n");return -1;}}// 分配内存缓冲区avio_open_dyn_buf(&outFormatContext->pb);// 写入输出文件的头部信息ret = avformat_write_header(outFormatContext, NULL);if (ret < 0) {fprintf(stderr, "无法写入输出文件的头部信息\n");return -1;}// 读取数据包并写入内存缓冲区while (av_read_frame(inFormatContext, &packet) >= 0) {// 将数据包写入内存缓冲区ret = av_write_frame(outFormatContext, &packet);if (ret < 0) {fprintf(stderr, "无法写入数据包\n");break;}av_packet_unref(&packet);}// 写入输出文件的尾部信息av_write_trailer(outFormatContext);// 获取内存缓冲区的大小和数据指针psBufferSize = avio_close_dyn_buf(outFormatContext->pb, &psBuffer);// 对PS数据进行处理,例如可以将其写入文件或进行其他操作// 注意:psBuffer 现在包含了整个PS流的数据,其大小为psBufferSize// 释放资源avformat_close_input(&inFormatContext);avformat_free_context(outFormatContext);av_free(psBuffer);return 0;
}

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

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

相关文章

golang中数组array和切片slice的区别

go语言中最常用的数据结构 数组array 和 切片 slice的区别对比&#xff1a; 定义和初始化&#xff1a; 数组&#xff1a; [size]类型 切片&#xff1a; []类型 &#xff0c; 数组变量[low:high] var arr1 [3]string{"a", "b", "c"} //…

一对一WebRTC视频通话系列(一)—— 创建页面并显示摄像头画面

本系列博客主要记录WebRtc实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 一、创建html页面 简单添加input、button、video控件的布局。 <html><head><title>WebRTC demo</title></head><h1>…

【算法基础实验】图论-深度优先搜索和深度优先路径

深度优先(DFS) 理论基础 深度优先搜索&#xff08;DFS, Depth-First Search&#xff09;是图和树的遍历算法中的一种&#xff0c;它从一个节点开始&#xff0c;沿着树的边走到尽可能深的分支&#xff0c;直到节点没有子节点为止&#xff0c;然后回溯继续搜索下一个分支。DFS …

ubuntu外置网卡配置AP模式

外置网卡RTL8811CU设置 UBUNTU使用RTL8811CU网卡&#xff08;包含树莓派&#xff09; 外置网卡配置AP模式流程 1. 检查网卡支持情况&#xff08;是否支持AP模式&#xff09; iw list找到以上部分&#xff0c;发现支持AP 2. 安装依赖 sudo apt-get update sudo apt-get in…

【代码随想录刷题记录】LeetCode209长度最小的子数组

题目地址 1. 思路 1.1 基本思路及代码实现 按照卡尔老师的思路&#xff0c;这个题目涉及到了一个重要的知识&#xff1a;滑动窗口&#xff0c;&#xff08;卡尔老师的图片演示比我做的好&#xff0c;就看卡尔老师的图片演示就行&#xff0c;其中我的fast指针对应卡尔老师的j…

模拟实现将字符串转化为整形

模拟实现atoi Convert strings to double (atof), integer (atoi, _atoi64), or long (atol). 需要注意1. 空指针 2. 空字符串 3. 遇到了非数字字符 4. 超出范围 #include<stdio.h> #include<ctype.h> #include<assert.h> #include<limits.h> enum …

c语言从入门到函数速成(1)

温馨提醒&#xff1a;本篇文章适合人群&#xff1a;刚学c又感觉那个地方不怎么懂的同学以及以及学了一些因为自身原因停学一段时间后又继续学c的同学 好&#xff0c;正片开始。 主函数 学c时最先学的是我们c语言程序的主体函数&#xff0c;c的主函数有两种写法&#xff0c;这…

25 JavaScript学习:var let const

JavaScript全局变量 JavaScript中全局变量存在多种情况和定义方式&#xff0c;下面详细解释并提供相应的举例&#xff1a; 使用var关键字声明的全局变量&#xff1a; var globalVar "我是全局变量";未使用var关键字声明的变量会成为全局变量&#xff08;不推荐使用&…

【御控物联网平台】物联网数据传输数据格式

物联网平台常用设备消息的标准数据格式为JSON&#xff0c;但是不同厂家、不同型号设备数据传输格式各异&#xff0c;给物联网平台带来数据解析的压力。御控物联网平台提供支持JSON数据消息解析功能的代码库&#xff08;JS、Java、.Net&#xff09;&#xff0c;实现设备自定义JS…

八大排序详解:动图、代码、注释

目录 何为八大排序&#xff1f; 直接插入排序 排序过程解读 直接插入排序的特性总结&#xff1a; 希尔排序 希尔排序的特性总结&#xff1a; 直接选择排序 直接选择排序的特性总结&#xff1a; 堆排序 直接选择排序的特性总结&#xff1a; 冒泡排序 快速排序 1.Hoa…

Layui中change事件不生效

1、问题概述? 在项目中给下拉框添加change事件,期望当select值发生变化的时候,触发事件。 问题:change事件不生效。 代码如下: 【select代码如下】 <div class="layui-inline"><label class="layui-form-label">请选择省</label&…

初学React基础

最近准备跟着黑马React学一下React&#xff0c;扩充一下技术面&#xff0c;打算还是以一边学习一边记笔记为主&#xff0c;进行学习&#xff01; 1. React介绍 1.1. React是什么&#xff1f; React是由FaceBook现在称&#xff08;Meta&#xff09;开发的开源 JavaScript 库&a…

【leetcode】数组和相关题目总结

1. 两数之和 直接利用hashmap存储值和对于索引&#xff0c;利用target-nums[i]去哈希表里找对应数值。返回下标。 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> mp;vector<int> res;fo…

【linux】进程间通信(匿名管道)

对于本篇文章我们采取三段论&#xff1a;是什么 为什么 怎么办。 目录 进程间为什么要通信&#xff1f;进程间如何通信&#xff1f;进程间怎么通信&#xff1f;匿名管道&#xff1a;匿名管道原理&#xff1a;代码示例&#xff1a;匿名管道的情况与特征&#xff1a; 进程间为什…

win下vscode的vim切换模式的中英文切换

问题描述 在vscode中安装vim插件后&#xff0c;如果insert模式下完成输入后&#xff0c;在中文输入方式下按esc会发生无效输入&#xff0c;需要手动切换到英文。 解决方法 下载完成vscode并在其中配置vim插件下载github—im-select.exe插件&#xff08;注意很多博文中的gitcod…

关于解释器模式这一篇就够了

解释器模式的概念 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;它给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子。简单来说&#xff0c;解释器模式…

【MySQL篇】使用mysqldump全量+mysqlbinlog增量完成实例的全库恢复(第四篇,总共四篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&am…

每天五分钟深度学习框架pytorch:如何创建多维Tensor张量元素?

本文重点 上节课程我们学习了如何创建Tensor标量,我们使用torch.tensor。本节课程我们学习如何创建Tensor向量,我们即可以使用torch.Tensor又可以使用torch.tensor,下面我们看一下二者的共同点和不同点。 Tensor张量 tensor张量是一个多维数组,零维就是一个点(就是上一…

【数据结构】链表专题3

前言 本篇博客我们继续来讨论链表专题&#xff0c;今天的链表算法题是经典中的经典 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 目录 1.判断链表是否…

ROS1快速入门学习笔记 - 014launch启动文件的使用方法

一、定义 Launch文件&#xff1a;通过XML文件实现多节点的配置和启动&#xff08;可自动启动ROSMaster&#xff09; 二、常用语法 1. 根标签 <launch> - launch文件中的根元素采用<launch>标签定义 <launch>表示开始&#xff1b;<launch>表示结束&…