美文网首页
音视频相关问题

音视频相关问题

作者: Johnny_Wu | 来源:发表于2020-04-04 17:36 被阅读0次

    视频相关的问与答:

    一、YUV的内存存储格式
    YUV格式有很多种,比如YUV420,YUV422,YUV444等。比较常用的就是YUV420。下面是说下YUV420的存储格式:
    1、交叉的(调系统摄像头采集到的是交叉的)
    Y(wh)+交叉的U(wh/4)、V(w*h/4)数据
    2、非交叉的(ffmpeg的AVFrame中的是非交叉的)
    同上,只是UV不是交叉的

    二、在ffmpeg中的YUV420的格式
    AVFrame
    AVFrame->data[0]:Y
    AVFrame->data[1]:U
    AVFrame->data[2]:V

    分别对应一个linesize,这个linesize不是每一个data的大小,而是对应data中没一行的大小,这个值可能比图片的width要大。但我们取的时候,是通过height来遍历,每一行取width的大小

    三、谈谈H264与H265的区别
    H265编码效率更高。同样质量的一张图片,编码后,H265的大小基本为H264的一半。所以H265的出现,为2K实时传输奠定了基础。
    H265编码效率高,那么编码和解码时候都会比较耗CPU和内存。H264基本全部手机都兼容,H265不兼容一些配置较差的手机,对应iphone,也要IOS11才可使用系统对应的H265的api。

    四、简单谈谈OpenCL es
    简单说就是直接操作GPU进行图片的渲染。OpenGL有自己的渲染管线,提供给外部修改的有顶点处理和片元处理。
    顶点处理:我们可以为OpenGL提供顶点,相当于构建了图片的外部框架
    片元处理:提供图片纹理填充刚才构建的外部框架的内容
    然后OpenGL就帮我们写入到帧缓冲区。

    所以我们在代码中主要做了:
    1、创建一个渲染缓冲区,主要是关联帧缓冲区,最终展示OpenGL渲染的效果
    2、提供顶点数据
    3、提供图片纹理,这里可以通过纹理坐标操作图片的方向
    4、进行OpenGL渲染glDrawArrays

    五、简单讲下ffmpeg解码流程
    1、创建解码器,AVCodec
    2、构建解码上下文AVCodecContext
    3、封装AVPacket
    4、avcodec_send_packet与avcodec_receive_frame

    流程不是特别难。主要得注意几点:
    解码的视频帧编码格式,比如H264。就有Annex-B与AVCC
    Annex-B通过00000001分割nal,所以解码器可以拆出来sps,pps,和帧内容
    AVCC是通过长度进行分割,因为我们不知道它存储长度的字节等信息。所以还得要一个extraData,这里包含了解码的一些信息

    六、ffmpeg的编码流程
    过程与解码的差不多。就是在构建编码上下文AVCodecContext需要传更多的参数
    //得到编码器
    AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);
    //得到编码上下文
    c = avcodec_alloc_context3(codec);
    //设置码流
    c->bit_rate = 900000;
    //设置分辨率
    c->width = frame->width;
    c->height = frame->height;
    //设置timebase
    c->time_base = (AVRational){1, 15};
    //设置编码前的格式
    c->pix_fmt = frame->format;
    //打开编码器
    ret = avcodec_open2(c, codec, NULL);

    其中同时配置了bit_rate与time_base,你才可以准确控制编码后的大小

    七、硬解与软件的区别
    假如视频流格式为H264
    硬解需要自己去配置sps,pps信息
    ffmpeg软解不需要

    硬解占用的cpu和内存比软解低
    硬解如果发现一个gop里面一帧有问题,可能gop剩下的帧都不会去解析,等待下一个gop到来。软解发现gop里面其中一帧有问题,还是会去尝试解析gop剩下的帧,有可能会导致花屏

    八、说说做视频实时播放遇到什么难点

    我觉得做视频播放,开发功能可能不是特别难。
    难点在于解决Bug与优化
    bug,比如说花屏,蓝屏,音视频不同步,串流
    就拿花屏来说,怎么解决呢?
    1、p2p过来的包,一个比较大的视频帧可能会分几包过来。这时候就需要拼包成完整的一帧
    2、等主帧过来了再开始解码,进行了丢帧操作,需要等下一个主帧过来。
    3、用硬解,可以减少花屏
    4、通过唯一标志位,避免串流
    如果上面都做了,还是花屏,这时候就得分析下源视频流是否就有问题
    可以把视频流采集下来。然后通过ffmpeg指令转为mp4格式,如果你实时播放的时间点的花屏与ffmpeg转的mp4对应的点都是花屏的,那很有可能流本来就有问题。

    优化部分,比如说要减少卡顿,减少延迟
    1、方法,需要大量实验,才能得出如何动态变码流,如何动态变帧率才是最优的。
    2、如何去衡量结果
    你统计的方法有说服力,那么你上报的相关视频播放数据才能让老板信服。

    音频相关的问与答:

    一、简单谈谈AudioUnit的原理
    与其他音频播放控件不同的是,audioUnit中的每一个unit可以代表独立的一个功能,比如输入输出功能,转换音频功能,混合音频功能等。然后把它们connect起来,所以自由度很高。

    刚才说的输入输出audioUnit。又可以分出两个模块,输入(element1)与输出(element0)。每一个element又包含inScope outScope

    二、aac音频解码你用过多少种方法
    1、直接用ffmpeg封装
    2、直接调用aac SDK api进行操作
    3、用系统api AudioConverterRef

    相关文章

      网友评论

          本文标题:音视频相关问题

          本文链接:https://www.haomeiwen.com/subject/vegjphtx.html