从flv文件中提取h264码流(使用av_bsf_send_packet和av_bsf_receive_packet)
最近在学习音视频开发,需要开发一个从flv文件中提取h264码流的demo。
具体的原理,在雷神的文章中写的很清楚了:
https://blog.csdn.net/leixiaohua1020/article/details/39767055
https://blog.csdn.net/leixiaohua1020/article/details/39802819
在这里致敬一下雷神,给我们这些小白入门音视频铺平了道路!
但是雷神在Demo中使用的API是旧版本的API,比如bitstream_filter相关的:
av_bitstream_filter_init()
av_bitstream_filter_filter()
等,这些API即将被弃用,我们需要使用新版本的API。
但是网上并没有找到相关的实现,根据上面链接的方法也并不能正确解析出h264码流。
在分析bitstream_filter.c源码后我们发现,在调用av_bsf_init()前需要调用avcodec_parameters_from_context(),增加解码必要的一些参数。
修改后的demo如下,大家可以用来参考。因为我也是刚入门,所以欢迎大家批评指正~:
#include <stdio.h>
#include <libavformat/avformat.h>
#define FFMPEG_NEWint main() {AVFormatContext *ifmt_ctx = NULL;AVPacket pkt;int ret, i;int videoindex = -1, audioindex = -1;const char *in_filename = "demo.flv";const char *out_filename_v = "ffmpeg_demo.h264";const char *out_filename_a = "ffmpeg_demo.mp3";//av_register_all(); 已废弃if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {printf("Could not open input file.");goto ERROR;}if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) < 0) {printf("Failed to retrieve input stream information");goto ERROR;}videoindex = -1;for (i=0; i<ifmt_ctx->nb_streams; i++) { //nb_streams:视音频流的个数if (ifmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)videoindex = i;else if (ifmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)audioindex = i;}printf("\nInput Video===========================\n");av_dump_format(ifmt_ctx, 0, in_filename, 0); // 打印信息printf("\n======================================\n");FILE *fp_audio=fopen(out_filename_a,"wb+"); FILE *fp_video=fopen(out_filename_v,"wb+");#ifdef FFMPEG_NEWAVBSFContext *bsf_ctx = NULL; const AVBitStreamFilter *pfilter = av_bsf_get_by_name("h264_mp4toannexb");if (pfilter == NULL) {printf("Get bsf failed!\n");goto ERROR;}
#else AVBitStreamFilterContext* h264bsfc = av_bitstream_filter_init("h264_mp4toannexb");
#endifwhile (av_read_frame(ifmt_ctx, &pkt) >= 0) {if (pkt.stream_index == videoindex) {#ifdef FFMPEG_NEWif ((ret = av_bsf_alloc(pfilter, &bsf_ctx)) != 0) {printf("Alloc bsf failed!\n");goto ERROR;}ret = avcodec_parameters_from_context(bsf_ctx->par_in, ifmt_ctx->streams[videoindex]->codec);if (ret < 0) {printf("Set Codec failed!\n");goto ERROR;}ret = av_bsf_init(bsf_ctx);if (ret < 0) {printf("Init bsf failed!\n");goto ERROR;}av_bsf_send_packet(bsf_ctx, &pkt);ret = av_bsf_receive_packet(bsf_ctx, &pkt);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)break;else if (ret < 0) {printf("Receive Pkt failed!\n");goto ERROR;}
#elseav_bitstream_filter_filter(h264bsfc, ifmt_ctx->streams[videoindex]->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
#endifprintf("Write Video Packet. size:%d\tpts:%lld\n",pkt.size,pkt.pts);fwrite(pkt.data, 1, pkt.size, fp_video);}else if (pkt.stream_index == audioindex) {printf("Write Audio Packet. size:%d\tpts:%lld\n",pkt.size,pkt.pts);fwrite(pkt.data, 1, pkt.size, fp_audio);}av_packet_unref(&pkt);}
#ifdef FFMPEG_NEWav_bsf_free(&bsf_ctx);
#elseav_bitstream_filter_close(h264bsfc);
#endiffclose(fp_video);fclose(fp_audio);avformat_close_input(&ifmt_ctx);return 0;ERROR:if (ifmt_ctx)avformat_close_input(&ifmt_ctx);if (fp_audio)fclose(fp_audio);if (fp_video)fclose(fp_video);if (bsf_ctx)av_bsf_free(&bsf_ctx);return -1;
}
从flv文件中提取h264码流(使用av_bsf_send_packet和av_bsf_receive_packet)相关推荐
- Mp4文件中提取H264码流
一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 1 MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象 ...
- 使用代码从抓包文件中提取H264码流
1 从抓包文件中过滤出包含单条流的RTP包 使用ssrc 或者 payload type过滤皆可,具体如下图: 2 使用wireshark可以提前分析下本条码流到底有没有丢包 这样就可以预先知道这条流 ...
- 【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
原文地址为: [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph A ...
- [转]【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
[流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph Apr 1st 2012 Email:skyseraph00@163 .com 一.MP4格式基 ...
- 流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
源地址:http://www.cnblogs.com/skyseraph/archive/2012/04/01/2429384.html [流媒體]H264-MP4格式及在MP4文件中提取H264的S ...
- 【转载】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
[流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph Apr 1st 2012 Email:skyseraph00@163.com 一.MP4格式基本概 ...
- 从flv文件中提取音频并存储为mp3格式
在优酷上下载了一些教学视频,为了把它们放到mp3里面,需要从这些flv文件中提取出音频数据并存储为mp3格式. 操作系统是centos 5.3. 在网上搜索了一下,找到以下方法: 方法一:使用menc ...
- H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
SkySeraph Apr 1st 2012 Email:skyseraph00@163.com 一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装 ...
- 【流媒体】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象编码的 ...
最新文章
- 集合框架(List的三个子类的特点)
- (传送门) Ubuntu随身系统
- 网络编程学习笔记(socketpair函数)
- Python3安装配置【转】
- SAP OData服务性能测量的四种办法
- java内存区域及静态常量池、运行时常量池介绍
- e盾网络验证源码_Laravel [mews/captcha] 图片验证码
- 录制电脑屏幕的软件_电脑屏幕录制操作方法,太实用了!
- 分布式团队_我们说的意思是:我们是一个分布式优先团队
- PMI、砺志咨询活动:项目经理软技能征文大赛—15个PDU、免费软技能培训
- XML Web services 发现
- 行业研究 | 语音识别行业发展现状解读
- WordPress 5.2 Beta 1 发布,将于4月30日推出正式版
- $ 在 JQuery 里的意思
- 基于PCA的ORL人脸识别---Python
- drawboard pdf拆分文件_Drawboard PDF 免费版
- kali系统卸载Docker容器
- 清北学堂2018noip集训D1
- 华为0基础——名字的美丽度
- 抓包工具 - HttpWatch(功能详细介绍)
热门文章
- Ubuntu18.04重启后无法进入图形化界面
- .sbt文件的配置详解
- 计算机视觉相关词汇翻译
- 爬虫系列之链家的信息爬取及数据分析
- npm WARN tarball tarball data for xxxx@^0.25... npm项目依赖安装卡住,报错,尝试多次无果的解决方法
- 电子技术——负反馈特性
- 管理信息系统基础知识点
- java空对象怎么判断,java怎么判断对象为空
- 如何下载原生纯净的Windows系统?(MSDN)
- Duplicated tag: ‘mirrors‘ (position: START_TAG seen ...erred\r\n