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
操作系统:ubuntu 注意事项: 1.ts文件顺序必须正确,也就是下一帧的dst和pst要比上一帧的大,否则会报错 2.codecpar->codec_tag要设置为0,否则报错Tag [27][0][0][0] incompatible with output codec id ‘27’ (avc1…...
MATLAB程序初始化OpenFOAM颗粒位置
问题引入 在OpenFOAM的颗粒两相流求解器中,我们可以采用manualInjection的方式进行自定义颗粒的初始位置,这个命令十分方便,在CFDEM中也有类似的命令,不过CFDEM中的命令更加强大,我们不仅可以定义颗粒的初始位置&…...
软件第三方CMA、CNAS测试的目的和意义,信息化建设验收测试依据是什么?
在当今互联网时代,软件的第三方CMA、CNAS测试成为了软件行业的重要环节。那么,这个测试的目的和意义是什么呢?另外,信息化建设验收测试依据又是什么呢? 一、软件测试第三方CMA、CNAS测试的目的和意义 1、研究进展 随着软件行业的迅…...
CNN成长路:从AlexNet到EfficientNet(02)
一、说明 在~10年的深度学习中,进步是多么迅速!早在 2012 年,Alexnet 在 ImageNet 上的准确率就达到了 63.3% 的 Top-1。现在,我们超过90%的EfficientNet架构和师生训练(teacher-student)。 二、第一阶段 …...
【Kubernetes】yaml文件格式
目录 YAML 语法格式: 查看 api 资源版本标签 写一个yaml文件demo 创建资源对象 查看创建的pod资源 创建service服务对外提供访问并测试 创建资源对象 查看创建的service 在浏览器输入 nodeIP:nodePort 即可访问 kubectl run --dry-runclient 打印相应的 A…...
Python web实战之Django的文件上传和处理详解
概要 关键词:Python Web开发、Django、文件上传、文件处理 今天分享一下Django的文件上传和处理。 1. 上传文件的基本原理 在开始深入讲解Django的文件上传和处理之前,先了解一下文件上传的基本原理。当用户选择要上传的文件后,该文件会被发…...
android res中values-swxxdp计算
一. res中values-swxxdp计算 以四寸中控面板为例 通过adb shell wm size获取屏幕大小为1264x1680 通过adb shell wm density获取屏幕显示密度dpi为300 最小宽度计算方法:s w 160 ∗ 手机宽度像素 / d p i sw160*手机宽度像素/dpisw160∗手机宽度像素/dpi 过公式…...
c动态内存申请
动态分配内存概述 先说数组的长度是预定义好的,固定不变的。但是呢,实际上所需的内存空间取决于实际输入的数据,而无法预先确定。所以根据实际情况,推出了内存管理函数。这些内存管理函数可以按需要动态分配内存空间,…...
C#8.0本质论第一章--C#概述
C#8.0本质论第一章–C#概述 朋友推荐的一本讲C#的书–C#本质论,英文叫Essential C#,官网可以免费看英文版的https://essentialcsharp.com/home。 C#可以为各种不同的系统平台开发应用软件和程序组件,支持移动设备,游戏主机&…...
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异常处理的函数
函数主体如下: CREATE OR REPLACE FUNCTION fn_get_agmt_bal(p_agmt_no varchar2) RETURN NUMBER ISv_bal NUMBER : 0;--在SQL/PLUS中执行时,若合dbms_output生效,需先执行【SET SERVEROUTPUT ON】; BEGINselect agmt_balinto v_balfrom edw…...
langchain-ChatGLM源码阅读:参数设置
文章目录 上下文关联对话轮数向量匹配 top k控制生成质量的参数参数设置心得 上下文关联 上下文关联相关参数: 知识相关度阈值score_threshold内容条数k是否启用上下文关联chunk_conent上下文最大长度chunk_size 其主要作用是在所在文档中扩展与当前query相似度较高…...
什么是Java中的工厂模式?
工厂模式(Factory Pattern)是一种常见的设计模式,它可以帮助我们简化对象创建的过程,将对象的创建与使用分离,提高代码的可维护性和可扩展性。在Java中,工厂模式通常分为简单工厂模式(Simple Fa…...
数据库--MySQL
一、什么是范式? 范式是数据库设计时遵循的一种规范,不同的规范要求遵循不同的范式。 最常用的三大范式 第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列) 第二范式(2NF):满足…...
浏览器多管闲事之跨域
年少时的梦想就是买一台小霸王游戏机 当时的宣传语就是小霸王其乐无穷~。 大些了,攒够了零花钱,在家长的带领下终于买到了 那一刻我感觉就是最幸福的人 风都是甜的! 哪成想... 刚到家就被家长扣下了 “”禁止未成年人玩游戏机 (问过卖家了&a…...
那为什么 async 函数最终返回的是一个新的 Promise?
async 函数的设计就是这样的:无论你返回什么值,它都会自动被包装为一个 Promise 对象。这就是为什么说 async 函数最终返回的是一个新的 Promise 对象。 当你在 async 函数中使用 return 语句返回一个值时,这个值会成为最终返回的 Promise 对…...
Java的泛型
泛型 泛型又称参数化类型,是Jdk5.0出现的新特性,解决数据类型的安全性问题 在类声明或实例化时只要指定好需要的具体的类型即可 Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁…...
pve和openwrt以及我的电脑中网络的关系和互通组网
情况1 一台主机 有4个口,分别eth0,eth1,eth2,eth3 pve有管理口 这个情况下 ,没有openwrt 直接电脑和pve管理口连在一起就能进pve管理界面 情况2 假设pve 的管理口味eth0 openwrt中桥接的是eth0 eth1 eth2 那么电脑连接eth3或者pve管理口设置eth3…...
TypeScript学习笔记
1.ts和js的区别 2. ts的优势 3. ts下载后报错解决方法 报错: PS C:\Users\\Desktop> tsc -v tsc : 无法加载文件 C:\Users\32173\AppData\Roaming\npm\tsc.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/ go.microsoft.com/fwlink/?…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
