织梦CMS - 轻松建站从此开始!

罗索

SDP config的生成 - MPEG4

罗索客 发布于 2009-10-19 14:22 点击:次 
如果你要自己开发流媒体服务器,那你必须需要自己去生成RTP DESCRIBE中的SDP config,以下是我的做法.
TAG:

 如果你要自己开发流媒体服务器,那你必须需要自己去生成RTP DESCRIBE中的SDP config,以下是我的做法:

步骤:
1. 将你的视频用FFMPEG先编码好。
2. 编码成功后,先判断当前帧是否是I frame。
3. 如果是I frame,定位MPEG4 VOL.
4. 取出整个VOL,并转成字串

详细代码如下:

                        if (!m_pContext->coded_frame->key_frame)
                            break;
                        bool bFoundVOL = false;
                        for (int i=0; i<out_size; i++)
                        {
                            if (m_pVideoEncBuffer[i] == 0x00 && m_pVideoEncBuffer[i+1] ==0x00 && m_pVideoEncBuffer[i+2] == 0x01 && m_pVideoEncBuffer[i+3] ==0xB0)
                            {
                                nStart = i;
                                //FILE* fp = fopen("c:\\\\MPEG4-VOL.dat", "a+b");
                                //if (fp)
                                //{
                                //    fwrite(m_pVideoEncBuffer, sizeof(BYTE), out_size, fp);
                                //    fclose(fp);
                                //}
                                bFoundVOL = true;
                            }
                            if (!bFoundVOL) continue;
                            if (m_pVideoEncBuffer[i] == 0x0 && m_pVideoEncBuffer[i+1] ==0x0 && m_pVideoEncBuffer[i+2] == 0x01 && m_pVideoEncBuffer[i+3] ==0xB6)
                            {
                                nEnd = i;
//                                m_pContext->extradata = m_pVideoEncBuffer + nStart;
                                m_pContext->extradata_size = nEnd - nStart;

                                //////////////////////////////////////////////////////////////////////////
                                if (m_pContext->extradata_size > 65536)
                                {
                                    av_log(m_pContext, AV_LOG_ERROR, "Too many extra data!\\n");
                                    break;
                                }

                                char* config = new char[m_pContext->extradata_size*2+2];
                                memset(config, 0, m_pContext->extradata_size*2);
                                for (int k = nStart; k < nEnd; k ++)
                                {
                                    sprintf(config + (k-nStart)*2, "X", m_pVideoEncBuffer[k]);
                                }
                                szExtraData = config;
                                delete[] config;
                                config = NULL;
                                break;
                            }
                        }

(韦国华)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200910/7566.html]
本文出处:罗索工作室 作者:韦国华
顶一下
(2)
66.7%
踩一下
(1)
33.3%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容