从mp4、flv、ts文件中提取出AVC(h264)

分别从封装格式为mp4、flv、ts文件中提取出AVC(h264)并写入文件

/*****************************************************************//*** \file   WriteAVC.cpp* \brief  提取视频中的视频流,写入为AVC(h264)文件* * \author 13648* \date   April 2024*********************************************************************/
#define _CRT_SECURE_NO_WARNINGS
#include "myLog.h"
#include <iostream>extern "C"
{
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavcodec/bsf.h>
}#pragma comment(lib, "avformat.lib")
#pragma comment(lib, "avcodec.lib")/*** 由于h264有两种格式,一种mp4格式(不带startcode,sps,pps信息)一种annexb格式(带startcode,sps、pps信息)* 但是大多数的编解码器只支持annexb格式pkt数据,* 因此在处理mp4或者flv格式的文件时需要使用h264_mp4toannexb比特流过滤器处理*/
int main()
{AVFormatContext* ifmt_ctx = NULL;const std::string in_filename = "./MediaFile/input_5s.flv";		// input_5s.flv input_5s.tsint nRet = avformat_open_input(&ifmt_ctx, in_filename.c_str(), NULL, NULL);if (nRet != 0){LOG_WARNING("avformat_open_input error\n");return -1;}nRet = avformat_find_stream_info(ifmt_ctx, NULL);if (nRet < 0){LOG_WARNING("avformat_find_stream_info faild\n");avformat_close_input(&ifmt_ctx);return -2;}int video_idx = av_find_best_stream(ifmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);if (video_idx < 0){LOG_WARNING("avformat_find_stream_info faild\n");avformat_close_input(&ifmt_ctx);return -3;}const std::string out_filename = "./MediaFile/input_5s.h264";FILE* out_fp = fopen(out_filename.c_str(), "wb");if (!out_fp){LOG_WARNING("open out_filename faild\n");avformat_close_input(&ifmt_ctx);return -4;}// 获取比特流过滤器const AVBitStreamFilter* bsfilter = av_bsf_get_by_name("h264_mp4toannexb");AVBSFContext* bsf_ctx = NULL;// 初始化比特流过滤器av_bsf_alloc(bsfilter, &bsf_ctx);// 给过滤器上下文添加解码器属性avcodec_parameters_copy(bsf_ctx->par_in, ifmt_ctx->streams[video_idx]->codecpar);av_bsf_init(bsf_ctx);AVPacket* pkt = av_packet_alloc();pkt->data = NULL;pkt->size = 0;while (true){nRet = av_read_frame(ifmt_ctx, pkt);if (nRet < 0){LOG_WARNING("av_read_frame file finish\n");break;}if (nRet == 0 && pkt->stream_index == video_idx){
#if 1if (av_bsf_send_packet(bsf_ctx, pkt) != 0)	// 发送包到比特流过滤器添加startcode、sps、pps信息{av_packet_unref(pkt);continue;}av_packet_unref(pkt);				// 清除,下面使用这个pkt接收bsf处理后的包while (av_bsf_receive_packet(bsf_ctx, pkt) == 0)	// 添加sps pps后可能不止一个包{size_t writeLen = fwrite(pkt->data, 1, pkt->size, out_fp);if (writeLen != pkt->size){LOG_WARNING("write pkt error\n");}fflush(out_fp);av_packet_unref(pkt);}
#else// 如果是ts流(自带sps pps信息,可以直接写入)size_t writeLen = fwrite(pkt->data, 1, pkt->size, out_fp);if (writeLen != pkt->size){LOG_WARNING("fwrite pkt error\n");}av_packet_unref(pkt);
#endif}else if(nRet == 0) {av_packet_unref(pkt);}}if (pkt){av_packet_free(&pkt);}if (out_fp){fclose(out_fp);}if (bsf_ctx){av_bsf_free(&bsf_ctx);}if (ifmt_ctx){avformat_close_input(&ifmt_ctx);}return 0;
}

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

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

相关文章

【深度学习】Progressive Distillation for Fast Sampling of Diffusion Models

论文&#xff1a;https://arxiv.org/abs/2202.00512v2 这篇论文提出了一种"渐进式蒸馏"(Progressive Distillation)的方法,来大幅降低用于生成对抗网络(GAN)的扩散模型(Diffusion Model)在推理阶段的采样步数,从而提高其推理效率。主要贡献有: 提出了一种新的扩散模…

配置vscode用于STM32编译,Debug,github上传拉取

配置环境参考&#xff1a; Docs 用cubemx配置工程文件&#xff0c;用VScode打开工程文件。 编译的时候会有如下报错&#xff1a; vscode出现process_begin :CreateProcess failed 系统找不到指定文件 解决方案&#xff1a;在你的makefile中加上SHELLcmd.exe就可以了 参考…

java发送请求-cookie有关代码

在初始化后添加cookie的代码 用这个httpclients类调custom方法&#xff0c;进行代码定制化 找和cookie有关的方法&#xff0c;设置默认的cookie存储信息 入参是接口 将入参粘贴后找方法&#xff0c;用new实现这个接口 这个方法是无参空构造&#xff0c;可以使用 设置了cookie …

【C++】RapidJSON 设置支持 std::string,防止编译报错

问题 rapidjson 创建 json 数据&#xff0c;使用 std::string 字符串进行赋值&#xff0c;编译时&#xff0c;抱一堆错误 .... rapidjson/include/rapidjson/document.h:690:5: note: candidate expects 0 arguments, 1 provided [build] make[2]: *** [main/CMakeFiles/ma…

C语言:输入输出专题

本专题使用C环境代码均为Linux系统下的ubuntu&#xff0c;所有测试结果仅供参考。 标准IO&#xff0c;文件IO专题 sanf函数 #include <stdio.h> #include <stdlib.h> #define STRSIZE 3 /* 输入函数int scanf(const char *format,...); 地址表返回输出成功的个数…

Betaflight 4.5RC3 AT32F435遇到的一些“怪”现象

Betaflight 4.5RC3 AT32F435遇到的一些“怪”现象 1. 源由2. “怪”现象2.1 电机#4没有RPM转速2.2 遥控器通道10接收机测试失败2.3 OSD 异常2.4 磁力计数据无法获取 3. 参考资料 1. 源由 升级下固件&#xff0c;追下“时髦”&#xff0c;赶下“潮流”&#xff0c;本着“活着就…

MySQL学习路线一条龙

引言 在当前的IT行业&#xff0c;无论是校园招聘还是社会招聘&#xff0c;MySQL的重要性不言而喻。 面试过程中&#xff0c;MySQL相关的问题经常出现&#xff0c;这不仅因为它是最流行的关系型数据库之一&#xff0c;而且在日常的软件开发中&#xff0c;MySQL的应用广泛&#…

蚁剑修改特征性信息

前言 我们首先得知道蚁剑的流量特征&#xff1a; 编码器和解码器的特征&#xff1a;蚁剑自带的编码器和解码器具有明显的特点&#xff0c;可以通过更改配置文件来达到流量加密的目的1。例如&#xff0c;蚁剑支持多种编码方式&#xff0c;如base64、chr、rot13等&#xff0c;这…

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之②:数据治理之二(自动处理)

前述 在前文的multi Agents for Data Analysis的设计说起&#xff0c;本文将继续探索和测试借助llm实现基于私有知识库的数据治理全自动化及智能化。整体设计如下&#xff1a; 整个体系设计了3个Agent以及一个Planer&Execute Agent&#xff0c;第一个Agent用于从企业数据…

【Linux系列】“dev-node1“ 运行的操作系统分析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Vue3与TypeScript中动态加载图片资源的解决之道

在前端开发中&#xff0c;Vue.js已成为一个备受欢迎的框架&#xff0c;尤其是在构建单页面应用时。Vue3的发布更是带来了许多性能优化和新特性&#xff0c;而TypeScript的加入则进一步提升了代码的可维护性和健壮性。然而&#xff0c;在实际的项目开发中&#xff0c;我们有时会…

牛客NC93 设计LRU缓存结构【hard 链表,Map Java】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84 思路 双向链表map最新的数据放头结点&#xff0c;尾节点放最老的数据&#xff0c;没次移除尾巴节点本地考察链表的新增&#xff0c;删除&#xff0c;移动节点参考答案Java im…

第六篇: 3.5 性能效果 (Performance)- IAB/MRC及《增强现实广告效果测量指南1.0》

​​​​​​​ 翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇 广告效果测量定义和其他矩阵之- 3.1 广告印象&#xff08;AD Impression&#xff09;第三篇 广告效果测量定义和其他矩阵之- 3.2 可见性 &#xff08;Viewability…

精准备份:如何自动化单个MySQL数据库的备份过程

自动化备份对于维护数据库的完整性和安全性至关重要。本指南将向您展示如何使用Shell脚本来自动化MySQL数据库的备份过程。 备份脚本内容 首先&#xff0c;这是我们将使用的备份脚本&#xff1a; #!/bin/bash# 完成数据库的定时备份 # 备份路径 BACKUP/data/backup/db # 当前…

正确使用@Autowired

目录 一、前言二、跟着官方文档&#xff0c;学习正确使用Autowired0、实验环境1、通过构造方法进行注入1.1 问题1&#xff1a;那万一没有这个CustomerPreferenceDao对象&#xff0c;会报错吗&#xff1f; 2、通过setter方法注入3、通过方法注入&#xff08;这个方法可以是任意名…

Shell学习 - 2.26 Shell expr命令:对整数进行运算

expr 是 evaluate expressions 的缩写&#xff0c;译为“表达式求值”。Shell expr 是一个功能强大&#xff0c;并且比较复杂的命令&#xff0c;它除了可以实现整数计算&#xff0c;还可以结合一些选项对字符串进行处理&#xff0c;例如计算字符串长度、字符串比较、字符串匹配…

【Android】apk安装报错:包含病毒: a.gray.BulimiaTGen.f

​ 有时候apk安装或者更新时&#xff0c;显示&#xff1a;[高风险]包含病毒: a.gray.BulimiaTGen.f这种bug&#xff1b; 原因&#xff1a;这是手机管家误报病毒。 处理方法&#xff1a;我看网上其他资料可以进行申诉&#xff0c;也可以进行apk加固&#xff0c;我这边尝试用360…

MSsql数据库 sql注入

和mysql不同&#xff1b;每个数据库都有自己的信息总结表四个系统数据库 master sysdatabases :所有数据库信息 name &#xff1a;所有数据库名 sysobjects :数据库所有对象的信息 syscolumns :字段信息 固定字段名 name 对象名 id 对象id xtype 对象类型代码 xtypeU 用户创建的…

【Linux】 Vim:掌握高效编辑的艺术

以为光阴 一分一秒 微不足道 可以任性 无拘无束 心高气傲 放下尊严又赌上性命 千金已散尽 只换来一张空头支票 年少时候豪言壮语许下承诺 积攒半生仍没故事值得诉说 最后一天许下的心愿 是你不要再记得我 &#x1f3b5; 杨宗纬《千金散尽》 在文本编辑器的…

无参数绕过RCE

一.什么是无参数 顾名思义&#xff0c;就是只使用函数&#xff0c;且函数不能带有参数&#xff0c;这里有种种限制&#xff1a;比如我们选择的函数必须能接受其括号内函数的返回值&#xff1b;使用的函数规定必须参数为空或者为一个参数等 无参数题目特征 if(; preg_replace…