自制系列第一季---打造全能视频直播平台(四)

        前段时间忙于工作,暂停了一段时间,最近偶尔空闲,尽量保证更新,上次介绍了基本的视频信息现在开始正式的音视频解码。相信通过对每一行代码的讲解各位可以学会这门技术。闲话不说,皮皮虾,我们走.........

 1      首先我们明确解码的基本过程和步骤

     1. 1   打开指定的文件

     1. 2   获取指定文件的信息,视频的名字,大小,各种通道等等信息

     1. 3   查找各种音视频对应的加码器(这一步非常坑....后面详细说) 

     1. 4  打开对应的解码器

     1.5 开始解码

     1. 6 音视频变换,比如放大,缩小等等变换

      1.7 音视频渲染,其实就是显示,这里我们用比较高端的OpenGL渲染视频,OpenES渲染音频,并达到音视频同步

 2     了解了基本知识那我们直接上代码以及对应的结果

     2.1  打开指定的文件

         

    这里有3个地方值得注意

   1  AVFormatContext     音视频上下文,它的意义类似于android 里面的 ApplicationContext

   2 av_strerror                  ffmpeg编解码所有的错误均会保存到指定的区域

   3 avformat_open_input   打开指定的文件,并初始化上下文

   注意!!!!!C++中 ret的返回值为0 才代表正确


   2.2  在打开文件成功以后就可以获取到文件的基本信息,注意在没有解码之前只能获取到基本信息,解码到AVFrame才可以拿到真正的音视频信息

      

          这段代码里面 ic->filename 代表文件的名字 ic->duration / AV_TIME_BASE / 60 代表文件的时间长度!!!!注意我会上传两部视频,这两部视频获取的时间一个正确一个错误,原因读者可以先自行解决。稍后答疑阶段给予说明,运行结果如下



  2,3  开始进入关键环节,一部音视频文件里面,关键部分依次为视频 音频 字幕 附加信息等共计7钟数据,ffmpeg为了方便管理将其以通道的方式进行保存,所谓通道就是数组。在解码之前我们必须明确有几个通道,每个通道是什么作用,以及是否有对应的解码器可以使用。



             2.3.1  videoStream  audioStream  subtitleStream 这3个数字是为了标示出指定的音视频文件中音频  视频  字幕这3个最重要的文件处于哪个通道中

             2.3.2 AVCodecContext *videoContext;    是ffmpeg提供的解码器,读者可以先不考虑是音频 还是视频解码器

             2.3.3 AVMEDIA_TYPE_VIDEO  AVMEDIA_TYPE_AUDIO  是判断我们的通道中数据是否为音频还是视频类型

             2.3.4 以上代码是八股文基本没什么发挥的余地,所以初级阶段大可以背下来,放心真的不难,至少难点不在这


      运行结果可以看到对应的视频我们可以找到解码器,而且此文件只有视频和音频,没有字幕,

3    以上为解码的准备工作,现在开始进行真正的解码,上代码

      

      关键点出现!!!!!!!!!

      3.1.1  AVPacket   AVFrame   前者保存了每一帧的信息,宝货时长,数据位置等,后者包含了真正的音视频文件也就是一大堆的二进制数据

      3.1.2 av_read_frame             此函数为读取每一帧音视频信息

      3.1.3  avcodec_decode_video2  次函数为调用对应的解码器进行解码解码后的结果保存在yuv也就是 AVFrame里

      3.1.4 pack.pts                         代表了每一帧的时间戳

     

     如果你的结果和我一样那说明已经解码成功了。下一步我们就对其进行各种变换,比如变成图片保存到硬盘什么的。是不是很简单啊


  先不要急着高兴,如果是你自己做有可能会遇到两个问题

  问题1 : 编译不通过,报一些稀奇古怪的问题,那是你的SDL没有设置。SDL是什么????少年你的问题真多

    

 问题2:是不是所有的视频都可以解码成功?

   

换个视频也许就是这样了,别担心,这是你的视频码率的问题。怎么搞呢?高级部分说吧

本课代码 http://pan.baidu.com/s/1gfxJhN9

本课书籍 http://pan.baidu.com/s/1bpxRtrp

如果还是不行,加我QQ,不保证随时回答问题,高手都是很忙的.......开玩笑的。一定尽量帮你啦