用ffmpeg读取网络视频流为什么会启动很慢?

news/2024/7/10 20:10:44 标签: ffmpeg

ffmpeg几乎是万能的,很多人会用ffmpeg用来做流媒体协议解析。接口统一,调用非常方便

调用示例:

 av_register_all();
 avformat_network_init();//注册网络流格式
 avformat_alloc_context();//申请流格式上下文
 avformat_find_stream_info(ctx, 0) 
 dump_stream_format(ctx);//dump 流信息

 av_read_frame(ctx,AVPacket);

 一般打开慢是在 avformat_find_stream_info(ctx, 0)  函数调用。
看看ffmpeg的具体实现
 for (i = 0; i < ic->nb_streams; i++) {
        const AVCodec *codec;
        AVDictionary *thread_opt = NULL;
        st = ic->streams[i];
        avctx = st->internal->avctx;
}

  for (i = 0; i < ic->nb_streams; i++) {
            int fps_analyze_framecount = 20;

            st = ic->streams[i];
            if (!has_codec_parameters(st, NULL))
                break;
            /* If the timebase is coarse (like the usual millisecond precision
             * of mkv), we need to analyze more frames to reliably arrive at
             * the correct fps. */
            if (av_q2d(st->time_base) > 0.0005)
                fps_analyze_framecount *= 2;//一般我们设置的是这个时间基,40帧
            if (!tb_unreliable(st->internal->avctx))
                fps_analyze_framecount = 0;
            if (ic->fps_probe_size >= 0)
                fps_analyze_framecount = ic->fps_probe_size;
            if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
                fps_analyze_framecount = 0;
            /* variable fps and no guess at the real fps */
            if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
                st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
                int count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
                    st->info->codec_info_duration_fields/2 :
                    st->info->duration_count;
                if (count < fps_analyze_framecount)
                    break;
            }
            if (st->parser && st->parser->parser->split &&
                !st->internal->avctx->extradata)
                break;
            if (st->first_dts == AV_NOPTS_VALUE &&
                !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
                st->codec_info_nb_frames < ((st->disposition & AV_DISPOSITION_ATTACHED_PIC) ? 1 : ic->max_ts_probe) &&
                (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
                 st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))
                break;
        }
        analyzed_all_streams = 0;
        if (!missing_streams || !*missing_streams)
        if (i == ic->nb_streams) {
            analyzed_all_streams = 1;
            /* NOTE: If the format has no header, then we need to read some
             * packets to get most of the streams, so we cannot stop here. */
            if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
                /* If we found the info for all the codecs, we can stop. */
                ret = count;
                av_log(ic, AV_LOG_DEBUG, "All info found\n");
                flush_codecs = 0;
                break;
            }

从代码可以看出来,在没有音频帧的情况下,需要读取40帧才会返回。
很多安防设备没有音频,所以这里可以自行解析数据以快速得到画面。




 


http://www.niftyadmin.cn/n/793519.html

相关文章

H264解码器原理之一

H264的层次结构包括VCL(视频编码层)与NAL(网络提取层)&#xff0c;具体的语法结构&#xff0c;在之前的文章已经提到过&#xff0c;这里就不再赘述了。NAL主要是把VCL的内容进行封装&#xff0c;帮助更好的适合复杂的网络环境。在解码端&#xff0c;NAL解码器又复杂拆分&#x…

解析音视频网络传输技术之一

前面讲解了音视频编解码的基本知识&#xff0c;相信阅读过的朋友&#xff0c;都有个基本的认识。音视频除了存储&#xff0c;还如何传输呢?比如直播互动&#xff0c;网上课堂等&#xff0c;这些场景中&#xff0c;音视频是如何实现在网络中传输呢?今天这篇文章&#xff0c;就…

ffmpeg如何从内存读取或者写流数据

一 ffmpeg默认的是从网络或者本地文件读取/写入数据 很多应用工程中&#xff0c;需要从内存读写数据以加快速度&#xff0c;或者由于操作磁盘权限不够等问题。 二 今天来讲讲如何让ffmpeg操作内存 在我的其它博客中讲解了从网络读取流数据的过程&#xff0c;这里就先简单补充一…

实现音视频在Android与IOS平台的采集与编码之Android视频(1)

一、前言 前面我们已经讲解了视频的编码、解码、网络传输的相关基础知识&#xff0c;相信认真阅读多的朋友&#xff0c;应该熟悉了&#xff0c;有人会问&#xff0c;这些知识能够帮我们做什么呢?本篇文章就来说说具体能做那些项目。由于时间和篇幅的关系&#xff0c;先来说说…

ffmpeg放大缩小图像

一 首先熟悉一下ffmpeg的两个结构体 AVPacket和AVFrame AVPacket 主要域:*data size AVFrame主要域&#xff1a;*data[POINTER_NUM]; linesize[POINTER_NUM];压缩过的数据存放在AVPacket结构体中&#xff0c;解压后的数据YUV存放在AVFrame结构体中 二 ffmpeg中缩放图像的函数是…

秒懂卷积

最近看到很多地方都有提到卷积(比如卷积神经网络&#xff0c;视频噪声抑制)&#xff0c;但是一直不理解具体是啥&#xff0c;物理意义又是啥。 一 卷积的基本概念 其实就是两个可积函数在x上的乘积的积分。公式记作 卷积和傅立叶变换有着密切的关系&#xff0c;两个函数的傅立…

ffmpeg源码优化之推流发送篇

1.引言 大家好&#xff0c;距离上篇文章已经过去有一段时间了&#xff0c;主要是最近太忙了&#xff0c;一直没有更新。今天总算能抽出一点时间&#xff0c;说说ffmpeg源码级别的优化了&#xff0c;这块应该会连载&#xff0c;请大家持续关注。废话不多说&#xff0c;接下来就…

RK3399音视频开发之花屏、抖动分析(硬核文章)

1.引言 最近在RK339开发做项目时&#xff0c;碰到一个非常棘手的问题&#xff0c;挂机测试或终端后重启后具有小概率的花屏&#xff0c;抖动&#xff0c;而且这个现象是不可逆&#xff0c;只有重启推流服务或者重启整个终端&#xff0c;才会恢复。这个问题会导致视频采集&…