avformat_open_input返回失败问题

很多时候我们希望通过回调函数给ffmpeg传递码流,让它帮我们完成解码操作,要实现该功能需要定义AVIOContext和AVFormatContext对象,下面把核心代码贴出来:

        if (NULL != m_pull_data_func)
        {
            m_avio_ctx_input = avio_alloc_context(m_avio_ctx_buffer, m_avio_ctx_buffer_size,
                0, m_pull_data_func_param, m_pull_data_func, NULL, NULL);
        }
        else
        {
            break;
        }

        if (!m_avio_ctx_input)
        {
            ret = AVERROR(ENOMEM);
            break;
        }

        m_fmt_ctx->pb = m_avio_ctx_input;
		m_fmt_ctx->flags = AVFMT_FLAG_CUSTOM_IO;

		ret = avformat_open_input(&m_fmt_ctx, NULL, NULL, NULL);
        if (ret < 0)
        {
            fprintf(stderr, "Could not open input\n");
            break;
        }

        /* retrieve stream information */
        if (avformat_find_stream_info(m_fmt_ctx, NULL) < 0)
        {
            fprintf(stderr, "Could not find stream information\n");
            break;
        }

m_pull_data_func是我们传给ffmpeg的回调函数,ffmpeg会从该函数中获取码流,这里说两点影藏的坑,

1、m_pull_data_func必须按照ffmpeg的要求把它需要的数据返回(因为ffmpeg要通过输入的码流判断码流格式)

2、m_pull_data_func的返回值也必须准确。

你可能感兴趣的:(ffmpeg)