ffmpeg-从mp4、flv、ts文件中提取264视频流数据

ffmpeg-从mp4、flv、ts文件中提取264视频流数据

main.c

#include <stdio.h>
#include <libavutil/log.h>
#include <libavformat/avio.h>
#include <libavformat/avformat.h>void proc(int need_to_annexb, char* in_file, char* out_file)
{AVFormatContext* ifmat_ctx = NULL;int     videoindex = -1;AVPacket* pkt = NULL;int     ret = -1;int file_end = 0;//char* in_file = "believe.mp4";//char* out_file = "out_mp4_no_annexb.h264";FILE* out_fd = fopen(out_file, "wb");printf("in_file = %s , out_file = %s\n", in_file, out_file);//创建解复用器,最后使用avformat_close_input()释放相关内存ifmat_ctx = avformat_alloc_context();if(!ifmat_ctx){printf("avformat_alloc_context faild!\n");return -1;}//根据url打开码流,会选择匹配的解复用器的ret = avformat_open_input(&ifmat_ctx, in_file, NULL, NULL);if(ret != 0){printf("avformat_open_input failed!\n");return -1;}//读取媒体文件的部分数据包可以获取码流信息ret = avformat_find_stream_info(ifmat_ctx, NULL);if(ret < 0){printf("avformat_find_stream_info faile!\n");avformat_close_input(&ifmat_ctx);return -1;}//查找出哪个码流是音频还是视频还是字幕videoindex = av_find_best_stream(ifmat_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);if(videoindex == -1){printf("av_find_best_stream failed!\n");avformat_close_input(&ifmat_ctx);return -1;}//分配packetpkt = av_packet_alloc();av_init_packet(pkt);file_end = 0;while (0 == file_end){if((ret = av_read_frame(ifmat_ctx, pkt)) < 0){file_end = 1;printf("av_read_frame end!\n");}//读出的帧判断是否是视频帧if(ret == 0 && pkt->stream_index == videoindex){//是否需要使用h264_mp4toannexb转换if(need_to_annexb){//获取比特流过滤器(h264_mp4toannexb)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, ifmat_ctx->streams[videoindex]->codecpar);//初始化过滤器上下文av_bsf_init(bsf_ctx);int input_size = pkt->size;//记录下是否send 一个packet,receive 一个packet。基本都是这个情况的//有比较少情况出现会send 一个packet,receive 几个packet//(SPS、PPS、I帧在一个packet send,receive 多个packet)。int out_pkt_count = 0;if(av_bsf_send_packet(bsf_ctx, pkt) != 0){//不管是否成功,都要释放packet,因为bitstreamfilter内部还有引用这个内存空间的av_packet_unref(pkt);continue;}//不管是否成功,都要释放packet,因为bitstreamfilter内部还有引用这个内存空间的av_packet_unref(pkt);while (av_bsf_receive_packet(bsf_ctx , pkt) == 0){out_pkt_count++;size_t size = fwrite(pkt->data, 1, pkt->size, out_fd);if(size != pkt->size){printf("fwrite failed!\n");}av_packet_unref(pkt);}//send 一个packet ,receive pakcet 超过2个就输出提示信息if(out_pkt_count >= 2){printf("one send packet size = %d, receive %d packet.\n", input_size,out_pkt_count);}if(bsf_ctx)av_bsf_free(&bsf_ctx);}else{size_t size = fwrite(pkt->data, 1, pkt->size, out_fd);if(size != pkt->size){printf("fwrite failed!\n");}av_packet_unref(pkt);}}else{if(ret == 0){av_packet_unref(pkt);}}}if(out_fd)fclose(out_fd);if(pkt)av_packet_free(&pkt);if(ifmat_ctx)avformat_close_input(&ifmat_ctx);}int main()
{proc(1, "believe.flv", "out_flv_need_toannexb.h264");//使用ffplay可以播放proc(0, "believe.flv", "out_flv_no_toannexb.h264");//使用ffplay不可以proc(1, "believe.mp4", "out_mp4_need_toannexb.h264");//使用ffplay可以播放proc(0, "believe.mp4", "out_mp4_no_toannexb.h264");//使用ffplay不可以proc(1, "believe.ts", "out_ts_need_toannexb.h264");//使用ffplay可以播放proc(0, "believe.ts", "out_ts_no_toannexb.h264");//使用ffplay可以播放//注意://flv/mp4/mkv一些结构中,h264需要h264_mp4toannexb处理,添加startcode/SPS/PPS等信息//ts不用h264_mp4toannexb处理。return 0;
}

flv两个文件的对比:
在这里插入图片描述
mp4两个文件的对比:
在这里插入图片描述
ts两个文件的对比:
在这里插入图片描述

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

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

相关文章

线索化二叉树(代码 、分析 、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; BTree.h BTree.c 二叉树&#xff08;多路平衡搜索树&#xff09; SeqList.h SeqList.c 顺序表 main.c #include <stdio.h> #include <stdlib.h> #include "BTree.h&qu…

Python---寻找给定序列中相差最小的两个数字

编写函数&#xff0c;寻找给定序列中相差最小的两个数字 def getTwoClosestElements(arr):#先进行排序&#xff0c;使得相邻元素最接近#相差最小的元素必然相邻seq sorted(arr)#先进行排序dif float(inf)#无穷大#遍历所有元素&#xff0c;两两比较&#xff0c;比较相邻元素的…

Python---利用蒙特.卡罗方法计算圆周率近似值

利用蒙特.卡罗方法计算圆周率近似值 什么是蒙特.卡罗方法&#xff1f; 答&#xff1a;蒙特卡罗方法是一种计算方法。原理是通过大量随机样本&#xff0c;去了解一个系统&#xff0c;进而得到所要计算的值。 正方形内部有一个相切的圆&#xff0c;它们的面积之比是π/4。 这里假…

FLV封装格式的分析

FLV封装格式的分析&#xff0c;各种详细的参数比较多没有详细解释&#xff0c;这是总体的格式分布。详细的参数说明可以参照文档。 以flv格式内封装的音频流是aac、视频流是h264分析&#xff1a; flv文件tag部分截图&#xff1a;可以看到音频TAG、视频TAG是交错存储的

《计算机基础复习》===数据库技术基础

数据库系统三级结构&#xff1a; 数据库系统一般划分为三个抽象级&#xff1a;用户级、概念级、物理级。 1&#xff09;用户级数据库&#xff1a;对应于外模式。它是用户看到和使用的数据库&#xff0c;又称用户视图&#xff1b;用户级数据库主要由外部记录组成&#xff0c;不同…

bs架构 erp 进销存_从依赖经验到用柔性ERP,企业少走了多少弯路?

企业在面对紧急订单时&#xff0c;传统企业将面临两难问题&#xff1a;如不接受紧急订单,可能会导致潜在的顾客丢失,损失市场占有率;接受紧急订单,可能会给企业带来很多管理上的问题,如材料采购、库存管理等。而企业通过信息化手段提升生产计划与控制的柔性&#xff0c;则可从容…

云端: 小软件大平台,绿色又安全 V0.9 Beta3(090722)

云端 是一个小软件&#xff0c;但又是一个大平台。安装云端之后&#xff0c;再使用其他软件不再需要安装——一点、下载、直接使用&#xff1b;并且&#xff0c;通过虚拟化的运行环境&#xff0c;能够保持系统长久的干净、绿色&#xff0c;并保持软件与系统的安全隔离——此方面…

MGraph图(代码、分析、汇编)

目录:代码&#xff1a;分析&#xff1a;汇编&#xff1a;MGrapth图表示有邻接矩阵的方式构成的图结构。邻接矩阵用两个数组保存数据&#xff0c;一个一维数组存储图中的顶点信息&#xff0c;一个二维数组存储图中边或弧的信息。无向图中的二维数组是个对称矩阵 1.0表示无边&…

java: 程序包lombok不存在_Java开发神器:Lombok 学习指南

点击上方“Java知音”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;semlinkerwww.segmentfault.com/a/1190000020864572一、Lombok 简介Lombok 是一款 Java 开发插件&#xff0c;使得 Java 开发者可以通过其定义的一些注解来消除业务工程中…

AAC ADTS格式分析

AAC ADTS格式分析&#xff1a; 没有详细的参数说明&#xff0c;只有格式分析。可以查询文档查看详细参数说明。 ADTS的全称是Audio Data Transport Stream。是AAC音频的传输流格 式。AAC音频格式在MPEG-2&#xff08;ISO-13318-7 2003&#xff09;中有定义。AAC后来 又被采用到…

新知道的几个东西

nginx&#xff08;发音同engine x&#xff09;是一款由俄罗斯程序设计师Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。起初是供俄国大型的入口网站及搜寻引擎Rambler&#xff08;俄文&#xff1a;Рамбл…

台达plc控制伺服电机编程实例_PLC控制伺服电机:控制脉冲的相关计算

伺服电机PLC通过脉冲的方式控制伺服电机时&#xff0c;其输出脉冲与伺服电机的配置应具有一定的对应关系。如&#xff0c;PLC输出多少个脉冲电机旋转一圈&#xff1f;电机旋转一圈移动的距离(或角度)是多少&#xff1f;这里我们以某伺服电机为例进行举例说明&#xff1a;完成对…

实验四 Windows程序设计

1&#xff0c;创建Windows窗体应用程序&#xff0c;实现用户登录功能&#xff0c;当输入正确与错误时均给出相应的提示信息&#xff0c;规定用户输入错误次数不能超过3次。&#xff08;源代码运行界面&#xff09; 这里的口令有个小常识&#xff0c;就是显示*&#xff0c;在口令…

最小连通-(代码、分析、汇编)

目录&#xff1a;介绍&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;介绍&#xff1a; 一个有 n 个结点的连通图的生成树是原图的极小连通子图&#xff0c;且包含原图中的所有 n 个结点&#xff0c; 并且有保持图连通的最少的边。 最小生成树可以用kruskal&am…

c++ 怎样连接两个链表_LeetCode | 链表的入口,一文帮你搞定“环形链表”(python版,最简单解析)...

链表节点的定义链表作为一种数据结构&#xff0c;由链表节点互相连接构成。链表节点包含自身的数据和一个指向下一节点的指针。""" Definition of ListNode """ class ListNode(object):def __init__(self, val, nextNone):self.val valself.ne…

QI实例-改变空间参考

学习AE一段时间了&#xff0c;总是对QI不是很理解&#xff0c;今天一晚上写了QI实例&#xff0c;尝试理解下。 首先想到的是→改变空间参考→alter、SpatialReference→alterSpatialReference&#xff0c;输入到帮助文档里。  查看是IGeoDatasetSchemaEdit接口的方法&#xf…

C#省市二级联动(王者荣耀挑选英雄为例)

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace beyond_联动_ {public partial clas…

二叉排序树(Binary Sort Tree) 又称为二叉查找树(Binary Search Tree) - (代码、分析)

目录&#xff1a;代码&#xff1a;分析&#xff1a;代码&#xff1a; BSTree.h #ifndef _BSTREE_H_ #define _BSTREE_H_typedef void BSTree;//定义二叉树类型 typedef void BSKey;//定义节点的键值类型&#xff08;用于节点排序&#xff09;typedef struct _tag_BSTreeNode …

springboot tomcat默认线程数_记一次JAVA线程池的错误用法

最近项目一个项目要结项了&#xff0c;但客户要求 TPS 能达到上千&#xff0c;而用我写的代码再怎么弄成只能达到 30 的 TPS&#xff0c;然后我又将代码中能缓存的都缓存了&#xff0c;能拆分的也都拆分了&#xff0c;拆分时用的线程池来实现的&#xff1b;其实现的代码主要为…

引以为鉴-ARM开发板连线注意事项

前些日子把实验室的三台机子放到一个工位上&#xff0c;非常拥挤&#xff0c;做实验也很不方便。因此&#xff0c;想把ARM开发板的环境重新搭建到自己的电脑上。说完就做&#xff0c;上午就开始忙活起来。把开发板上的USB线、串口线、JTAT接口、还有电源线一一插好。接着就开始…