一. 相关API说明

1. av_register_all
2. avformat_network_init 不管是流媒体发送还是流媒体接收, 需要先执行该函数.
3. avformat_alloc_context 初始化一个AVFormatContext.
4. avcodec_alloc_frame初始化1个AVFrame. **需要注意的是,新版的FFmpeg使用av_frame_alloc来初始化一个AVFrame.**
5. av_guess_format返回一个已经注册的最合适的匹配输入参数地输出格式.
6. avio_open打开FFmpeg的输入输出文件. **需要注意的是, 新版的Ffmpeg使用avio_open2来打开输入输出文件.**
7. avcodec_find_encoder通过code ID查找一个已经注册的音视频编码器.
8. avformat_new_stream初始化一个AVStream. **销毁函数使用销毁AVFormatContext的avformat_free_context()就可以了**
9. avcodec_get_context_defaults3用于设置该AVCodecContext的默认值.
10. av_opt_set设置一个AVOption的值.
11. avcodec_open2打开编码器.
12. avformat_write_header写文件头.
13. av_sdp_create打印sdp信息.
14. av_init_packet使用默认值初始化AVPacket.
15. avcodec_encode_video2编码一帧视频数据.
16. av_rescale_q用于计算Packet的PTS.
17. av_interleaved_write_frame写入一个AVPacket到输出文件.
18. av_free_packet销毁一个AVPacket.
19. av_frame_free销毁一个AVFrame.
20. avcodec_close关闭编码器.
21. av_freeav_free()简单的封装了free.
22. avformat_free_context销毁一个AVFormatContext.

二. 工作流程

1. 初始化, 依次完成以下工作av_register_all();//使用RTSP网络流时必须先执行avformat_network_init();                                                             pFrame = avcodec_alloc_frame();                                              fmtctx = avformat_alloc_context();         //设置流格式为RTP                                   fmtctx->oformat = av_guess_format("rtp", NULL, NULL);         //用指定IP和端口构造输出流地址sprintf(fmtctx->filename,"rtp://%s:%d",SendIp.toLatin1().data(),SendPort);//打开输出流avio_open(&fmtctx->pb,fmtctx->filename, AVIO_FLAG_WRITE);//查找编码器*codec = avcodec_find_encoder(codec_id);//初始化AVStreamst = avformat_new_stream(oc, *codec);//设置AVCodecContext编码参数    avcodec_get_context_defaults3(c, *codec);c->codec_id = codec_id;c->codec_type = AVMEDIA_TYPE_VIDEO;c->width = capWidth;c->height = capHeight;c->time_base.den = frameRate;c->time_base.num = 1;c->pix_fmt = AV_PIX_FMT_YUV420P;   //PIX_FMT_YUV420P;if(oc->oformat->flags & AVFMT_GLOBALHEADER)c->flags|= CODEC_FLAG_GLOBAL_HEADER;av_opt_set(c->priv_data, "preset", "slow", 0);av_opt_set(c->priv_data, "tune","zerolatency",0);av_opt_set(c->priv_data, "x264opts","crf=26:vbv-maxrate=728:vbv-bufsize=3640:keyint=25",0);//打开编码器avcodec_open2(video_st->codec, video_codec, NULL);//写文件头avformat_write_header(fmtctx, NULL);//打印SDP信息, 该信息可用于Rtp流接收解码av_sdp_create(&fmtctx,1, sdp, sizeof(sdp));
2. 视频编码, rtp传输.  该处使用一个单独的线程完成.while (1) {//退出线程, 略//获取RGB图像cap>>srcMat;//格式转换, BGR->YUV420PconvertMatBGR2YUV420(dstMat ,yMat,uMat,vMat);//构造AVPacket.av_init_packet(&pkt);pFrame->pts = video_st->codec->frame_number;//视频编码avcodec_encode_video2(c, &pkt,pFrame, &got_output);if (got_output) {if (c->coded_frame->key_frame)pkt.flags |= AV_PKT_FLAG_KEY;pkt.stream_index = st->index;//计算PTSif (pkt.pts != AV_NOPTS_VALUE ) {pkt.pts = av_rescale_q(pkt.pts,video_st->codec->time_base, video_st->time_base);}if(pkt.dts !=AV_NOPTS_VALUE ) {pkt.dts = av_rescale_q(pkt.dts,video_st->codec->time_base, video_st->time_base);}//写入一个AVPacket到输出文件, 这里是一个输出流av_interleaved_write_frame(oc,&pkt);}//销毁AVPacket.av_free_packet(&pkt);}//销毁资源av_frame_free(&pFrame);avcodec_close(video_st->codec);av_free(video_st->codec);avformat_free_context(fmtctx);3. 其他, 略.

三. 运行

点击”打开”按纽, 启动RTP传输.

RTP接收

ffmpeg摄像头采集h264编码RTP发送相关推荐

  1. Qt实现摄像头视频h264编码和拍照功能

    Buildroot+Qt实现摄像头视频h264编码和拍照功能 https://gitee.com/zy853728579/video_test_app.git 实现h264硬编码+拍照功能,以下为关健 ...

  2. webrtc 视频的采集,编码,发送流程详细分析(希望对底层深入了解的朋友有所帮助)

    ---------------------------------------------------------------------------------------------------- ...

  3. FFmpeg 开发记录---H264编码,avi封装,暴风影音,qq影音播放有声无画

    使用ffmpeg编码视频文件时,视频编码为H264,音频编码为MP3,封装格式为avi,发现输出的文件用vlc,mkplayer等能正常播放,但是用暴风影音或者QQ影音等无法正常播放,有声音无画面.后 ...

  4. 利用ffmpeg进行摄像头提取视频编码为h264通过RTP发送数据到指定的rtp地址

    话不多说命令如下: ffmpeg -f dshow -i video="Logitech QuickCam Easy/Cool" -vcodec libx264 -preset:v ...

  5. FFMPEG只编译H264编码

    1.ffmpeg 编译 ./configure --prefix=/usr/local/ --enable-shared --disable-everything --enable-encoder=l ...

  6. iOS 使用FFmpeg实现视频H264编码

    本文借鉴:https://www.jianshu.com/p/70b0af4d0ec7   以及 https://www.jianshu.com/p/31d1ca4999c6 ffmpeg 相关命令行 ...

  7. linux FFMPEG 摄像头采集数据推流

    环境vmware14    Ubuntu14 1)搭建推流服务器Nginx-rtmp(主要参考:https://www.cnblogs.com/cocoajin/p/4353767.html) 下载源 ...

  8. ffmpeg的H264编码 视频逐渐模糊

    万能的互联网,又一次在临危之时解决了我的问题 最近在看ffmpeg里的H264编码,然后试着去做了一下.但是目前发现一个问题,就是编码写入的.264文件,用播放器(VLC,暴风都试过)播放后,发现编码 ...

  9. linux下使用ffmpeg采集摄像头数据并编码成h264文件

    本文讲述如何在linux下,使用ffmpeg采集视频数据,并编码成h264文件. 打算分成3部分讲解: 需要具备的软硬件环境 ffmpeg命令采集摄像头数据并编码成h264文件 ffmpeg代码采集摄 ...

  10. ffmpeg实现摄像头拉流_利用ffmpeg一步一步编程实现摄像头采集编码推流直播系统...

    了解过ffmpeg的人都知道,利用ffmpeg命令即可实现将电脑中摄像头的画面发布出去,例如发布为UDP,RTP,RTMP等,甚至可以发布为HLS,将m3u8文件和视频ts片段保存至Web服务器,普通 ...

最新文章

  1. R语言使用yardstick包的roc_curve函数评估多分类(Multiclass)模型、并使用autoplot函数可视化模型在每个交叉验证(或者重采样)的每一折fold在每个分类上的ROC曲线
  2. WAT中Security选项卡无法连接到数据库解决办法
  3. BigDecimal相除异常
  4. 阿里开源的那个牛X的问题排查工具——Arthas,推出IDEA插件了!
  5. ES-Hadoop学习之ES和HDFS数据交换
  6. WebSocket的简单实现
  7. 统治世界的十大算法(转)
  8. 在ASP.NET页面中实现数据饼图(转载)
  9. 下载喜马拉雅工具 洪校长音频
  10. Vue-cli3更改项目logo图标
  11. android图片点击全屏显示,Android浏览图片,点击放大至全屏效果
  12. 海康威视视频对接--rtsp测试地址--vlc测试地址
  13. linux内核中linux中readl()和writel()函数---用于读写寄存器
  14. linux上卸载php,linux怎么卸载软件?
  15. 国内国际期货,外汇,现货跟单、量化交易系统
  16. 【HTML期末作业】大学生抗疫感动专题网页设计作业 抗疫最美逆行者网页 致敬疫情感动人物网页设计制作
  17. PCB板故障查找方法有哪些?
  18. 习题 5.7 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小(也可能没有鞍点)。
  19. 【java反射】简单说说静态代理和动态代理
  20. libjpeg的使用

热门文章

  1. java繁体_Java-汉字繁体拼音转换
  2. Task03基于鸢尾花iris数据集的逻辑回归分类实践
  3. moment系列一:add() 方法和subtract() 方法的使用
  4. vue中用canvas 画一个六边形 类似蜂窝形的功能导航主菜单
  5. sqlserver加密隐私字段(不侵入程序)-Always Encrypted
  6. JetPack中的Room
  7. 浅夏,盈一眸清凉,捻一指馨香
  8. 计算机网络技术-Mooc
  9. Linux修改只读文件(Read-Only)的方法
  10. 增强现实(AR)智能眼镜的关键技术:标定、跟踪与交互