2015-10-29 32 views
1

我与Android的ffmpeg解码H264 RTP流。我发现了一个奇怪的问题:如果我不叫avformat_find_stream_info,解码P frame需要几十微秒,相比之下,呼吁avformat_find_stream_info之前解码将P frame解码时间缩短至平均不到1毫秒。但是,avformat_find_stream_info本身在网络流上耗费时间。是否有什么我可以做,使解码快速,而无需调用avformat_find_stream_info的ffmpeg解码慢呼不avformat_find_stream_info

+0

什么信息中缺少AVFormatContext和AVCodecContext导致解码P帧这么慢? – skipper

+0

10 us小于1毫秒。另外,你能描述你如何测量帧解码时间吗? –

+0

在调用avcodec_decode_video2()之前和之后记录systemTime(SYSTEM_TIME_MONOTONIC)的系统时间。 – skipper

回答

3

avformat_find_stream_info叫,流媒体URL(或本地文件)通过该功能进行扫描,以检查在给定的URL有效流。

这意味着,换句话说,它将从给定输入URL几个包进行解码,以便可以解码包快速与AVCodecContext,这是在avformat_find_stream_info初始化。

我没有测试它,但它不能被解码没有调用avformat_find_stream_info在一般情况下,或者它可能是每次解码数据包时被初始化。

无论如何,这就是为什么avformat_find_stream_info消耗网络流量。因为,正如我所说的那样,它会抽取前几个数据包。

如果你真的想在不调用此函数包解码速度快,你应该初始化AVCodecContext自己,手动。

+0

当然,你无需调用avformat_find_stream_info事先解码帧,至少对于真正MPEGTS,其中我处理。我不确定需要什么信息,所以我不知道如何手动填充AVCodecContext结构。我想我需要RTFSC。 – skipper

+0

正如我所说的,它实际上并不需要调用“avformat_find_stream_info”。在mpegts格式中,每个帧都有自己的编解码器信息,因此即使视频数据的一部分丢失,您也可以播放视频。使用“avcodec_find_decoder”和“avcodec_open2”功能可轻松打开解码器。 –