• H.264采集、编码、传输的流程


    转载自H.264采集、编码、传输的流程  

    H.264采集、编码、传输的流程 - imeradio - 狂奔的蜗牛



    1 采集到的原始数据放入buf中
    2 转化为yuv格式放入yuv
    conv.RGB24_to_YV12(buf, yuv,IMAGE_WIDTH, IMAGE_HEIGHT) ;
    3 调用编码器进行编码
    3.1 从yuv中读取数据到m_pic
    read_frame_yuv( &m_Pic, m_pOpt->hin, i_Frame + m_pOpt->i_seek )
    m_pOpt->hin即为yuv
    3.2 将m_pic编码成nal格式数据
    x264_encoder_encode( m_pEnc, &nal, &i_nal, pic, &pic_out )
    m_pEnc为编码器句柄
    nal为一个数组(一帧可能被编码成多个nal)
    3.3 将多个nal格式的数据读到一个m_pdata
    x264_nal_encode( m_pData, &i_data, 1, &nal[i] )
    1、加上startcode
    2、写入nal头部
    3、拷贝payload部分
    3.4 将m_pdata中数据拷入hout中
    write_nalu_bsf( hout, m_pData, i_size ,i_file,dec_out)
    dec_out为一块公共数据区域,存放一帧的解码结果,也就是说其中可能包含几个nal的数据
    4 调用解码器解码
    pdecoder->Decode_frame((char *)VideoCodeDest,inLen,(char *)VideoRGB);
    VideoCodeDest为一块公共数据区域,存放一帧的解码结果,也就是说其中可能包含几个nal的数据
    输出放到VideoRGB
    4.1 取出一个nal的数据去解码
    nalLen=GetNextNal(inLen);
    通过识别startcode取出一个nal的数据,存放在buf中

    consumed_bytes=avcodec_decode_video(avc, picture, &got_picture,(unsigned char*)Buf, nalLen);
    avc为编码器句柄
    picture存放解码结果
    got_picture:没有帧可以被解码则为0


    = 有个关键问题
    当一帧的原始图像被编码成几个nal:
    1.在test264的例子中看到,这几个nal被一块处理,可能会共同写入到结果缓冲区中
    2.那么是否这几个nal被解码的结果都是consumed_bytes>0?
    3.我的猜想是几个nal的解码结果只有其中一个consumed_bytes>0,其余只会提供参考信息给解码器。
    4.是要将nal以流形式还是包形式传输?
    第一帧编解码结果:
    + nal[0] {i_ref_idc=0 i_type=6 i_payload=368 ...} x264_nal_t 没有帧被解码
    + nal[1] {i_ref_idc=3 i_type=7 i_payload=19 ...} x264_nal_t 没有帧被解码
    + nal[2] {i_ref_idc=3 i_type=8 i_payload=3 ...} x264_nal_t 没有帧被解码
    + nal[3] {i_ref_idc=3 i_type=5 i_payload=2388 ...} x264_nal_t 被解码
    第二帧编解码结果:
    + nal[0] {i_ref_idc=2 i_type=1 i_payload=1278 ...} x264_nal_t 被解码
    第n帧编解码结果:
    + nal[0] {i_ref_idc=3 i_type=7 i_payload=19 ...} x264_nal_t 被解码
    + nal[1] {i_ref_idc=3 i_type=8 i_payload=3 ...} x264_nal_t 被解码
    + nal[2] {i_ref_idc=3 i_type=5 i_payload=2342 ...} x264_nal_t 被解码


    优先级i_ref_idc为:
    enum nal_priority_e
    {
    NAL_PRIORITY_DISPOSABLE = 0,
    NAL_PRIORITY_LOW = 1,
    NAL_PRIORITY_HIGH = 2,
    NAL_PRIORITY_HIGHEST = 3,
    };
    nal类型i_type为:
    enum nal_unit_type_e
    {
    NAL_UNKNOWN = 0,
    NAL_SLICE = 1,
    NAL_SLICE_DPA = 2,
    NAL_SLICE_DPB = 3,
    NAL_SLICE_DPC = 4,
    NAL_SLICE_IDR = 5,
    NAL_SEI = 6,
    NAL_SPS = 7,
    NAL_PPS = 8,
    NAL_AUD = 9,

    };



  • 相关阅读:
    Tomcat常用配置
    java开发规范总结_命名规范
    Android学习笔记(广播机制)
    Java Web 实现Mysql 数据库备份与还原
    interfaces
    windows phone 1
    正在写。。
    Exceptions
    类的非常简单的应用
    say hello
  • 原文地址:https://www.cnblogs.com/Windeal/p/4284675.html
Copyright © 2020-2023  润新知