飞道的博客

ffmpeg实现H264压缩并且推流至RTSP

699人阅读  评论(0)

------------------------------------------------------------------------------------------------------

ffmpeg rtsp推流、解码   课程教学:

ffmpeg实现H264编、解码,RTSP推流,RTSP解码​​​​​​​

里面提供源码可以直接下载运行!

-----------------------------------------------------------------------------------------------------------------------

一、整体思路

    1 利用ffmpeg读取出视频的一帧图像   存储在pFrame中

    2 利用ffmpeg进行格式转换    sws_scale

    3 利用ffmpeg编码存在pFrame中的图像   H264压缩

    4 利用ffmpeg的 av_interleaved_write_frame( )  写入到rtsp端

    5 辅助部分:解码、编码初始化,QT线程创建

二、编解码初始化

    1 解码初始化

        参考http://blog.csdn.net/yunge812/article/details/79342089

    2 编码初始化           


  
  1. fmtctx = avformat_alloc_context();
  2. video_codec = avcodec_find_encoder(AV_CODEC_ID_H264);
  3. if(video_codec == NULL )
  4. {
  5. qDebug() << "video_codec == NULL"<< endl;
  6. }

        这里需要根据需要自行设置


  
  1.    //打开编码器
  2.     avcodec_open2(c, video_codec, NULL);
  3.     /*写入数据流的头部*/
  4.     avformat_write_header(fmtctx, NULL);
  5.     //打印SDP信息, 该信息可用于Rtp流接收解码
  6.     char sdp[2048];
  7.     int tmp = av_sdp_create(&fmtctx,1, sdp, sizeof(sdp));
  8.     qDebug() << sdp <<endl;
  9.     if(tmp != 0)
  10.     {
  11.         qDebug() << "av_sdp_create error " <<endl;
  12.     }

        打印信息可以打印出当前的RTSP流的信息   用于另一端捕获用。具体用法后文会有介绍

三、读取视频

     3.1 视频读取   

  av_read_frame(pFormatCtx_decode, packet)

    3.2  视频解码

 avcodec_decode_video2(pCodecCtx_decode, pFrame, &got_picture, packet)

    3.3  格式转换


  
  1. sws_scale(img_convert_ctx,pFrame->data, pFrame->linesize, 0, pCodecCtx_decode->height, //源
  2. pFrameYUV->data, pFrameYUV->linesize); //目的

 

    此时 经过解码的视频存储在pFrameYUV中

 

四、编码视频        

 avcodec_encode_video2(c, &pkt, pFrameYUV, &got_output)

五 推流至RTSP

  av_interleaved_write_frame(fmtctx,&pkt);

六 利用VLC播放器接受压缩之后的视频

    6.1 识别打印信息

        第二步留下打印信息很有用   例如我的打印信息是


  
  1. v= 0
  2. o=- 0 0 IN IP4 127.0 .0 .1
  3. s=No Name
  4. c=IN IP4 127.0 .0 .1
  5. t= 0 0
  6. a=tool:libavformat 57.71 .100
  7. m=video 5678 RTP/AVP 96
  8. a=rtpmap: 96 H264/ 90000
  9. a=fmtp: 96 packetization-mode= 1

        将上述打印信息直接copy到记事本,另存为 test.sdp的文件

    6.2 再次运行程序  同时将 test.sdp文件拖到VLC播放器中进行播放

    6.3 播放效果     

参考资料

课程教学视频:https://edu.csdn.net/course/detail/27795

课件里面提供源码

 


参考连接:http://blog.csdn.net/czc1009/article/details/12913759

         http://blog.csdn.net/ytaosky/article/details/72820329

=======================================================================

最近新开的公众号,文章正在一篇篇的更新,

公众号名称:玩转电子世界

各位朋友有什么问题了可以直接在上面提问,我会一一进行解答的。

跟着阳光非宅男,一步步走进电子的世界。

关注之后回复  资料下载 可以获得免费海量视频学习资料下载~~!

已共享的学习视频资料,共享资料正在不断更新中。

共享ffmpeg视频学习资料:

=======================================================================

 

转载:https://blog.csdn.net/yunge812/article/details/79345584
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场