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

ffmpeg ts列表合并为mp4

操作系统:ubuntu
注意事项:
1.ts文件顺序必须正确,也就是下一帧的dst和pst要比上一帧的大,否则会报错
2.codecpar->codec_tag要设置为0,否则报错Tag [27][0][0][0] incompatible with output codec id ‘27’ (avc1)
3.设置output的max_streams数目,默认是1000,超过此数目就会报错


#include <iostream>
#include <dirent.h>
#include <vector>extern "C" {
#include "include/libavformat/avformat.h"
#include "include/libavcodec/avcodec.h"
}//#pragma comment(lib,"avformat.lib")
//#pragma comment(lib,"avcodec.lib")using namespace std;int ts2Mp4(const string,const string,int);int main(int argc, char* argv[])
{//const string ts_filename = argv[1];//const string output_filename = "../1.mp4";//argv[2];ts2Mp4(argv[1],argv[2],atoi(argv[3]));return 0;
}int ts2Mp4(const string ts_path,const string mp4_path,int ts_count){/*vector<string> ts_list;DIR *pDir;struct dirent* ptr;if(!(pDir = opendir(ts_path.c_str()))){printf("cannot open ts dir\n");return -1;}while((ptr = readdir(pDir))!=0) {if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name,"..")!=0){ts_list.push_back(ptr->d_name);}}closedir(pDir);*/// create output context AVFormatContext* output_ctx = NULL;if (avformat_alloc_output_context2(&output_ctx, NULL, NULL, mp4_path.c_str()) < 0) {fprintf(stderr, "Failed to create output context\n");return -1;}//set the max streams number,default is 1000output_ctx->max_streams=3000;int video_stream_idx = -1;vector<AVFormatContext*> input_ctx_list;for(int i=0;i<ts_count;i++){// open input file char ts[256];sprintf(ts,"%s%s%d%s",ts_path.c_str(),"/",i,".ts");//string ts=tmp;printf("%s\n",ts);if(strcmp(".ts",strstr(ts,".ts"))!=0) continue;AVFormatContext* input_ctx = NULL;if (avformat_open_input(&input_ctx, ts, NULL, NULL) != 0) {fprintf(stderr, "Failed to open input file '%s'\n", ts);return -1;}if (avformat_find_stream_info(input_ctx, NULL) < 0) {fprintf(stderr, "Failed to retrieve input stream information\n");return -1;}input_ctx_list.push_back(input_ctx);// add streams for (int i = 0; i < input_ctx->nb_streams; i++) {AVStream* in_stream = input_ctx->streams[i];AVCodecParameters* in_codecpar = in_stream->codecpar;if (in_codecpar->codec_type == AVMEDIA_TYPE_VIDEO || in_codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {AVStream* out_stream = avformat_new_stream(output_ctx, NULL);if (!out_stream) {fprintf(stderr, "Failed to allocate output stream\n");return -1;}if (avcodec_parameters_copy(out_stream->codecpar, in_codecpar) < 0) {fprintf(stderr, "Failed to copy codec parameters\n");return -1;}out_stream->codecpar->codec_tag = 0;if (in_codecpar->codec_type == AVMEDIA_TYPE_VIDEO)video_stream_idx = out_stream->index;}}}// open output file if (!(output_ctx->oformat->flags & AVFMT_NOFILE)) {if (avio_open(&output_ctx->pb, mp4_path.c_str(), AVIO_FLAG_WRITE) < 0) {fprintf(stderr, "Could not open output file '%s'\n", mp4_path.c_str());return -1;}}// write header if (avformat_write_header(output_ctx, NULL) < 0) {fprintf(stderr, "Error occurred when opening output file\n");return -1;}int pkt_cnt = 0;// copy packets //int stream_index = 0;for(int i=0;i<input_ctx_list.size();i++){AVFormatContext* input_ctx=input_ctx_list[i];AVPacket packet;int ret = 0;while (av_read_frame(input_ctx, &packet) >= 0) {//printf("%d,%d\n",video_stream_idx,packet.stream_index);AVStream* in_stream = input_ctx->streams[packet.stream_index];AVStream* out_stream = output_ctx->streams[packet.stream_index];// copy packetpacket.pts = av_rescale_q_rnd(packet.pts, in_stream->time_base, out_stream->time_base,(AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));packet.dts = av_rescale_q_rnd(packet.dts, in_stream->time_base, out_stream->time_base,(AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));packet.duration = av_rescale_q(packet.duration, in_stream->time_base, out_stream->time_base);//printf("%ld,%ld,%ld\n",packet.pts,packet.dts,packet.duration);packet.pos = -1;if (packet.stream_index == video_stream_idx) {//printf("Send video %8d\n", pkt_cnt);pkt_cnt++;}ret = av_interleaved_write_frame(output_ctx, &packet);if (ret < 0) {fprintf(stderr, "Error muxing packet\n");break;}av_packet_unref(&packet);}// close input avformat_close_input(&input_ctx);}// write trailer if (av_write_trailer(output_ctx) < 0) {fprintf(stderr, "Error occurred when writing trailer\n");return -1;}// close output if (output_ctx && !(output_ctx->oformat->flags & AVFMT_NOFILE))avio_closep(&output_ctx->pb);avformat_free_context(output_ctx);printf("convert success!\n"); return 0;
}

相关文章:

ffmpeg ts列表合并为mp4

操作系统&#xff1a;ubuntu 注意事项&#xff1a; 1.ts文件顺序必须正确&#xff0c;也就是下一帧的dst和pst要比上一帧的大&#xff0c;否则会报错 2.codecpar->codec_tag要设置为0&#xff0c;否则报错Tag [27][0][0][0] incompatible with output codec id ‘27’ (avc1…...

MATLAB程序初始化OpenFOAM颗粒位置

问题引入 在OpenFOAM的颗粒两相流求解器中&#xff0c;我们可以采用manualInjection的方式进行自定义颗粒的初始位置&#xff0c;这个命令十分方便&#xff0c;在CFDEM中也有类似的命令&#xff0c;不过CFDEM中的命令更加强大&#xff0c;我们不仅可以定义颗粒的初始位置&…...

软件第三方CMA、CNAS测试的目的和意义,信息化建设验收测试依据是什么?

在当今互联网时代&#xff0c;软件的第三方CMA、CNAS测试成为了软件行业的重要环节。那么&#xff0c;这个测试的目的和意义是什么呢?另外&#xff0c;信息化建设验收测试依据又是什么呢?    一、软件测试第三方CMA、CNAS测试的目的和意义 1、研究进展 随着软件行业的迅…...

CNN成长路:从AlexNet到EfficientNet(02)

一、说明 在~10年的深度学习中&#xff0c;进步是多么迅速&#xff01;早在 2012 年&#xff0c;Alexnet 在 ImageNet 上的准确率就达到了 63.3% 的 Top-1。现在&#xff0c;我们超过90%的EfficientNet架构和师生训练&#xff08;teacher-student&#xff09;。 二、第一阶段 …...

【Kubernetes】yaml文件格式

目录 YAML 语法格式&#xff1a; 查看 api 资源版本标签 写一个yaml文件demo 创建资源对象 查看创建的pod资源 创建service服务对外提供访问并测试 创建资源对象 查看创建的service 在浏览器输入 nodeIP:nodePort 即可访问 kubectl run --dry-runclient 打印相应的 A…...

Python web实战之Django的文件上传和处理详解

概要 关键词&#xff1a;Python Web开发、Django、文件上传、文件处理 今天分享一下Django的文件上传和处理。 1. 上传文件的基本原理 在开始深入讲解Django的文件上传和处理之前&#xff0c;先了解一下文件上传的基本原理。当用户选择要上传的文件后&#xff0c;该文件会被发…...

android res中values-swxxdp计算

一. res中values-swxxdp计算 以四寸中控面板为例 通过adb shell wm size获取屏幕大小为1264x1680 通过adb shell wm density获取屏幕显示密度dpi为300 最小宽度计算方法&#xff1a;s w 160 ∗ 手机宽度像素 / d p i sw160*手机宽度像素/dpisw160∗手机宽度像素/dpi 过公式…...

c动态内存申请

动态分配内存概述 先说数组的长度是预定义好的&#xff0c;固定不变的。但是呢&#xff0c;实际上所需的内存空间取决于实际输入的数据&#xff0c;而无法预先确定。所以根据实际情况&#xff0c;推出了内存管理函数。这些内存管理函数可以按需要动态分配内存空间&#xff0c;…...

C#8.0本质论第一章--C#概述

C#8.0本质论第一章–C#概述 朋友推荐的一本讲C#的书–C#本质论&#xff0c;英文叫Essential C#&#xff0c;官网可以免费看英文版的https://essentialcsharp.com/home。 C#可以为各种不同的系统平台开发应用软件和程序组件&#xff0c;支持移动设备&#xff0c;游戏主机&…...

geoserver编辑样式 【开发工具QGis的初次使用】

geoserver编辑样式 开发工具配置中文语言 geoserver样式的更改 开发工具 链接: geoserver样式style的更改 链接: QGis开发工具的安装及使用 配置中文语言 setting > options > general > 中文 geoserver样式的更改 链接: geoserver样式style的更改 利用QGIs Q…...

【网络基础知识铺垫】

文章目录 1 :peach:计算机网络背景:peach:1.1 :apple:网络发展:apple: 2 :peach:协议:peach:2.1 :apple:协议分层:apple:2.2 :apple:OSI七层模型:apple:2.3 :apple:TCP/IP模型:apple:2.4 :apple:TCP/IP模型与操作系统的关系:apple: 3 :peach:网络传输基本流程:peach:4 :peach:网…...

一个利用oracle异常处理的函数

函数主体如下&#xff1a; CREATE OR REPLACE FUNCTION fn_get_agmt_bal(p_agmt_no varchar2) RETURN NUMBER ISv_bal NUMBER : 0;--在SQL/PLUS中执行时&#xff0c;若合dbms_output生效&#xff0c;需先执行【SET SERVEROUTPUT ON】; BEGINselect agmt_balinto v_balfrom edw…...

langchain-ChatGLM源码阅读:参数设置

文章目录 上下文关联对话轮数向量匹配 top k控制生成质量的参数参数设置心得 上下文关联 上下文关联相关参数&#xff1a; 知识相关度阈值score_threshold内容条数k是否启用上下文关联chunk_conent上下文最大长度chunk_size 其主要作用是在所在文档中扩展与当前query相似度较高…...

什么是Java中的工厂模式?

工厂模式&#xff08;Factory Pattern&#xff09;是一种常见的设计模式&#xff0c;它可以帮助我们简化对象创建的过程&#xff0c;将对象的创建与使用分离&#xff0c;提高代码的可维护性和可扩展性。在Java中&#xff0c;工厂模式通常分为简单工厂模式&#xff08;Simple Fa…...

数据库--MySQL

一、什么是范式&#xff1f; 范式是数据库设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 最常用的三大范式 第一范式(1NF)&#xff1a;属性不可分割&#xff0c;即每个属性都是不可分割的原子项。(实体的属性即表中的列) 第二范式(2NF)&#xff1a;满足…...

浏览器多管闲事之跨域

年少时的梦想就是买一台小霸王游戏机 当时的宣传语就是小霸王其乐无穷~。 大些了&#xff0c;攒够了零花钱&#xff0c;在家长的带领下终于买到了 那一刻我感觉就是最幸福的人 风都是甜的&#xff01; 哪成想... 刚到家就被家长扣下了 “”禁止未成年人玩游戏机 (问过卖家了&a…...

那为什么 async 函数最终返回的是一个新的 Promise?

async 函数的设计就是这样的&#xff1a;无论你返回什么值&#xff0c;它都会自动被包装为一个 Promise 对象。这就是为什么说 async 函数最终返回的是一个新的 Promise 对象。 当你在 async 函数中使用 return 语句返回一个值时&#xff0c;这个值会成为最终返回的 Promise 对…...

Java的泛型

泛型 泛型又称参数化类型&#xff0c;是Jdk5.0出现的新特性,解决数据类型的安全性问题 在类声明或实例化时只要指定好需要的具体的类型即可 Java泛型可以保证如果程序在编译时没有发出警告&#xff0c;运行时就不会产生ClassCastException异常。同时&#xff0c;代码更加简洁…...

pve和openwrt以及我的电脑中网络的关系和互通组网

情况1 一台主机 有4个口&#xff0c;分别eth0,eth1,eth2,eth3 pve有管理口 这个情况下 &#xff0c;没有openwrt 直接电脑和pve管理口连在一起就能进pve管理界面 情况2 假设pve 的管理口味eth0 openwrt中桥接的是eth0 eth1 eth2 那么电脑连接eth3或者pve管理口设置eth3&#xf…...

TypeScript学习笔记

1.ts和js的区别 2. ts的优势 3. ts下载后报错解决方法 报错: PS C:\Users\\Desktop> tsc -v tsc : 无法加载文件 C:\Users\32173\AppData\Roaming\npm\tsc.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/ go.microsoft.com/fwlink/?…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...