首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

ffmpeg解析mp4,提取H264解决方法

2013-08-14 
ffmpeg解析mp4,提取H264如题。我用ffmpeg中的av_read_frame读取。然后ortp库发送到flv播放器中,可播放器无法

ffmpeg解析mp4,提取H264
如题。

我用ffmpeg中的av_read_frame读取。然后ortp库发送到flv播放器中,可播放器无法播放。看了网上写说av_read_frame读取mp4的数据前四个字节要0x00 0x00 0x00 0x01标识覆盖,H264是用的这四个标识区分的。然后还需要解码。我都做了,可还是不行。不知道为什么?有明白的大侠吗?
// 初始化
int CH264::AV_OpenFile( char *pcFileName )
{
    int iOk(SUCCESS);
    av_register_all();
    if (0 != (iOk = avformat_open_input(&m_avformatctx, pcFileName, NULL, NULL)))
    {
        cerr << "AV_OpenFile(CH264) error: avformat_open_input return " << iOk << endl;
        return ERR_AV_OPENFILE;
    }
    if (0 > (iOk = av_find_stream_info(m_avformatctx)))
    {
        cerr << "AV_OpenFile(CH264) error: av_find_stream_info return " << iOk << endl;
        return ERR_AV_FINDSTREAM;
    }

    av_dump_format(m_avformatctx,0,  pcFileName, 0);

    return SUCCESS;
}

// 解析 外部函数循环调用 发送的时间截90000/25
int CH264::AV_GetNextFrame( CRtp& rtpSession )
{
    static bool hasExdata(true);
    if (0 != av_read_frame(m_avformatctx, &m_avPacket))
    {
        return ERR_AV_READFRAME;
    }
    m_avCodecCtx = m_avformatctx->streams[m_avPacket.stream_index]->codec;
    if (AVMEDIA_TYPE_VIDEO == m_avCodecCtx->codec_type)
    {
        if (NULL != m_avCodecCtx->extradata && hasExdata)
        {
            ParseH264ExtraDataInMp4(m_avPacket.stream_index);
            rtpSession.RtpSend(m_avCodecCtx->extradata, m_avCodecCtx->extradata_size);
            hasExdata = false;
        }
        //char chTemp[5] = {0x00, 0x00, 0x00, 0x01};
        //memcpy(m_avPacket.data, chTemp, 4);


        rtpSession.RtpSend(m_avPacket.data, m_avPacket.size);
        cout << "send h264 size:  " << m_avPacket.size << endl;
    }
    av_free_packet(&m_avPacket);

    return SUCCESS_CONTINUE;
}

int CH264::ParseH264ExtraDataInMp4(int stream_id)
{

    uint8_t *dummy = NULL;
    int dummy_size;
    AVBitStreamFilterContext* bsfc = av_bitstream_filter_init("h264_mp4toannexb");

    if (bsfc == NULL) 
    {
        cerr << "cannot open the h264_mp4toannexb\n";
        return -1;
    }
    av_bitstream_filter_filter(bsfc, m_avformatctx->streams[stream_id]->codec,
        NULL, &dummy, &dummy_size, NULL, 0, 0);
    av_bitstream_filter_close(bsfc);
    return 0;
}

ortp库调用应该没有问题,我读取.264文件发送都没有问题。
ffmpeg?ortp?h264?mp4
[解决办法]
看下生成的flv的数据格式是否正确?
[解决办法]
应该不会有问题吧
[解决办法]
http://blog.csdn.net/gavinr/article/details/7183499
ffmpeg解析mp4,提取H264介绍,
[解决办法]
本帖最后由 mstlq 于 2013-08-05 19:02:05 编辑 总的来说H264的码流的打包方式有两种,一种为annex-b byte stream format的格式,这个是绝大部分编码器的默认输出格式,就是每个帧的开头的3~4个字节是H264的start_code,0x00000001或者0x000001。
另一种是原始的NAL打包格式,就是开始的若干字节(1,2,4字节)是NAL的长度,而不是start_code,此时必须借助某个全局的数据来获得编码器的profile,level,PPS,SPS等信息才可以解码。

flv?
flv用的是原始打包格式而不是annex-b byte stream format

另外AVCDecoderConfigurationRecord发了吗?
建议下载一份video_file_format_spec_v10.pdf,看看flv的文件结构

热点排行