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两个文件的对比:

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

  1. 从TS文件中提取DVB Subtitle字幕的有效方法

     从TS文件中提取DVB Subtitle字幕的有效方法 深圳市同洲电子股份有限公司韦斌 (本文发表于<卫星电视与宽带多媒体>2013年16期) 摘要:DVB Subtitling标准 ...

  2. ffmpeg-从flv文件中提取AAC音频数据保存为文件

    AAC ADTS格式协议: 从flv文件中提取AAC音频数据保存为文件. 如果需要详细了解AAC ADTS格式,可以查询文档. 原文件: 提取aac文件: main.c #include <st ...

  3. 实战:从文件夹中庞大的excel(.xlsx)文件中提取并整合数据

    从文件夹中庞大的excel(.xlsx)文件中提取并整合数据 Input 需要从文件夹树中提取有格式的单个数据格并汇总. 例如: 2017-2020x市蚊虫数据/2018/7月/abcds方法统计.x ...

  4. klg日志文件中提取RGBD图像数据

    main函数 本程序用于从klg日志文件中提取RGB图像和Depth图像信息,klg文件在ElasticFusion中被用于保存数据集. 涉及的相关开源代码如下: LogView mp3guy/Log ...

  5. 从mpeg ts文件中提取I帧(1):将ts包拼装为section或pes包

    写在前面的话:         不觉中已经在数码工作了十年有余,十年的青春.十年的汗水,如今即将离开,个中滋味难以言表! 以后可能不会在广电行业工作了,就用这个小程序,为自己十年的广电工作画上一个句号 ...

  6. C语言 从txt文件中提取特定的数据

    C语言:从txt中逐行读取文本,提取其中的特殊数据 在Matlab中几行正则化的操作,C中尝试实现. 问题描述 在大量的txt中提取其中的特定数据 例如: Labeled Markers (4):Ma ...

  7. 在csv文件中提取特定的数据做图-以天气为例子

    前言:这是在<python入门>中的一个例子,写成文章,作为学习的复盘. 现在有这么一份天气数据,需要将画出最高温和最低温的曲线图. 前期的基础知识: CSV文件 CSV是最通用的一种文件 ...

  8. python调用simulink_使用Python从dbc文件中提取simulink建模数据定义

    使用dbc文件建模完成CAN通讯是一种比较高效的开发模式,不过在建模的过程中dbc文件中描述的数据需要自己去定义.使用文本编辑工具打开dbc文件可以看到,实际上dbc文件是一个可以进行语义解析的文本. ...

  9. 从mpeg ts文件中提取I帧(3):pes包的解析

    本系列的第一篇文章讲解了如何把ts包拼装为pes包,本章主要讲解如何解析pes包. 一.pes包的格式如下图所示: 二.相关字段解析 packet_start_code_prefix          ...

最新文章

  1. 机房收费系统【VB版】——上下机
  2. NTU 课程笔记 :NLP - language model
  3. C++学生信息管理系统V1(课后作业)
  4. UVALive 4254 Processor(二分)
  5. 利用反射获得类的public static/const成员的值
  6. Shell基本命令汇总
  7. 15个顶级多线程面试题及答案
  8. CAP--什么是CAP,为何三者不可兼得
  9. 混合游戏环境:让人类一直身处在物联网中(作业 全靠google)
  10. (PDF目录)自动生成PDF书签目录
  11. 明日传奇第三季/全集Legends of Tomorrow迅雷下载
  12. 【春节闲聊】程序员如何打破35岁魔咒
  13. vue 微信公众号开发
  14. java一个对象回收的过程_一个Java对象的回忆录:垃圾回收
  15. YUV420SP/YUV420P
  16. 金银岛(信息学奥赛一本通 - T1225)
  17. win11鼠标文本选择光标变白色
  18. CTF---Web入门第九题 FALSE
  19. 记虾皮shopee两轮面试题
  20. 稳压电源如何操作使用

热门文章

  1. jpannel设置位置xy_实用的摄影技巧!10种常见摄影场景的单反相机设置技巧!
  2. React 篇 Search Bar and content Table
  3. 浏览器兼容问题及解决方案
  4. Webpack 常用命令总结以及常用打包压缩方法
  5. 【开发调试】谷歌浏览器中调试移动网页和测试网速下页面效果
  6. css正則匹配、模糊匹配
  7. Resource接口
  8. 写在08年“愚人节”
  9. 004-JQuery属性
  10. css控制页面文字不能被选中user-select:none;