ffmpeg 转换es流成为ps流

ops/2024/10/21 9:29:24/

目的是将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.ppmy.cn/ops/31744.html

相关文章

Java项目:基于SSM框架实现的在线医疗服务系统(ssm+B/S架构+源码+数据库+毕业论文+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的在线医疗服务系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

node.js中path模块-路径处理,语法讲解

node中的path 模块是node.js的基础语法&#xff0c;实际开发中&#xff0c;我们通过使用 path 模块来得到绝对路径&#xff0c;避免因为相对路径带来的找不到资源的问题。 具体来说&#xff1a;Node.js 执行 JS 代码时&#xff0c;代码中的路径都是以终端所在文件夹出发查找相…

力扣763. 划分字母区间

Problem: 763. 划分字母区间 文章目录 题目描述思路复杂度Code 题目描述 思路 1.创建一个名为 last 的数组&#xff0c;用于存储每个字母在字符串 s 中最后出现的位置。然后&#xff0c;获取字符串 s 的长度 len。 2.计算每个字母的最后位置&#xff1a;遍历字符串 s&#xff0…

【基于MAX98357的Minimax(百度)长文本语音合成TTS 接入教程】

【基于MAX98357的Minimax&#xff08;百度&#xff09;长文本语音合成TTS 接入教程】 1. 前言2. 先决条件2.1 硬件准备2.2 软件准备2.3 接线 3. 核心代码3.1 驱动实现3.2 代码解析 4. 播放文本5. 结论 视频地址&#xff1a; SeeedXIAO ESP32S3 Sense【基于MAX98357的Minimax&am…

美国SEC爆锤以太坊

美国SEC爆锤以太坊已有1年之久。 4月30日&#xff0c;据美国《福克斯商业》独家曝光&#xff0c;最新法庭文件显示&#xff0c;美国SEC主席Gensler认为以太坊是一种证券至少已有一年之久 美国SEC及其主席Gary Gensler似乎至少在一年前就认为&#xff0c;以太坊可能是一种未经注…

web3风格的网页怎么设计?分享几个,找找感觉。

web3风格的网站是指基于区块链技术和去中心化理念的网站设计风格。这种设计风格强调开放性、透明性和用户自治&#xff0c;体现了Web3的核心价值观。 以下是一些常见的Web3风格网站设计元素&#xff1a; 去中心化标志&#xff1a;在网站的设计中使用去中心化的标志&#xff0…

K8S哲学 - statefulSet 灰度发布

kubectl get - 获取资源及配置文件 kubectl get resource 【resourceName -oyaml】 kubectl create - 指定镜像创建或者 指定文件创建 kubectl create resource 【resourceName】 --imagemyImage 【-f my.yaml】 kubectl delete kubectl describe resource resourc…

【银角大王——Django课程——用户表的基本操作2】

用户表的基本操作2 编辑用户按钮删除按钮入职日期——不显示时分&#xff0c;只显示年月日——使用DataField函数不使用DateTimeField修改models记得重新执行命令&#xff0c;更新数据库结构修改前修改后 编辑用户按钮 点击编辑&#xff0c;跳转到编辑页面&#xff08;将编辑的…