ffmpeg摄像头采集h264编码RTP发送
一. 相关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_free
av_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);
//初始化AVStream
st = 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->YUV420P
convertMatBGR2YUV420(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;
//计算PTS
if (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发送的更多相关文章
- FFMPEG:压缩之H264编码(YUV420P->H264)
720*576@25hz,550帧的yuv420p数据,编码时间13.3秒. void CTest0Dlg::OnButton5() { // TODO: Add your control notif ...
- [转载] ffmpeg摄像头视频采集-采集步骤概述并采集一帧视频
近期由于工作任务,需要开发一个跨平台视频聊天系统,其中就用到了ffmpeg进行采集与编码,网上找了一大堆的资料,虽然都有一些有用的东西,但实在太碎片化了,这几天一直在整理和实验这些资料,边整理,边做一 ...
- 如何用FFmpeg API采集摄像头视频和麦克风音频,并实现录制文件的功能
之前一直用Directshow技术采集摄像头数据,但是觉得涉及的细节比较多,要开发者比较了解Directshow的框架知识,学习起来有一点点难度.最近发现很多人问怎么用FFmpeg采集摄像头图像,事实 ...
- 利用ffmpeg一步一步编程实现摄像头采集编码推流直播系统
了解过ffmpeg的人都知道,利用ffmpeg命令即可实现将电脑中摄像头的画面发布出去,例如发布为UDP,RTP,RTMP等,甚至可以发布为HLS,将m3u8文件和视频ts片段保存至Web服务器,普通 ...
- 采集音频和摄像头视频并实时H264编码及AAC编码[转]
0. 前言 我在前两篇文章中写了DirectShow捕获音视频然后生成avi,再进行264编码的方法.那种方法有一些局限性,不适合实时性质的应用,如:视频会议.视频聊天.视频监控等.本文所使用的技术, ...
- 采集音频和摄像头视频并实时H264编码及AAC编码
转自:http://www.cnblogs.com/haibindev/archive/2011/11/10/2244442.html 0. 前言 我在前两篇文章中写了DirectShow捕获音视频然 ...
- JavaCV FFmpeg H264编码
上次成功通过FFmpeg采集摄像头的YUV数据,这次针对上一次的程序进行了改造,使用H264编码采集后的数据. (传送门) JavaCV FFmpeg采集摄像头YUV数据 采集摄像头数据是一个解码过程 ...
- 树莓派摄像头模块转成H264编码通过RTMP实现Html输出
官方原帖 http://www.raspberrypi.org/phpBB3/viewtopic.php?f=43&t=45368&sid=b81f6551e478f0f6e172aa ...
- H264编码 封装成MP4格式 视频流 RTP封包
H264编码 封装成MP4格式 视频流 RTP封包 分类: 多媒体编程 2013-02-20 21:31 3067人阅读 ...
随机推荐
- Spring -- spring结合aop 进行 tx&aspectj事务管理配置方法
1. tx 配置方法, 代码示例 javabean及其映射文件省略,和上篇的一样 CustomerDao.java, dao层接口 public interface CustomerDao { pub ...
- JDK_如何查看安装的jdk是32位还是64位?
1. 1.1.32位系统只能装 32位 jdk 1.2.64位系统,安装的 32位JDK 和 64位JDK 是不同的目录 1.2.1.32位的路径 类似:C:\Program Files (x86)\ ...
- MyBatis使用自定义TypeHandler转换类型
MyBatis虽然有很好的SQL执行性能,但毕竟不是完整的ORM框架,不同的数据库之间SQL执行还是有差异. 笔者最近在升级 Oracle 驱动至 ojdbc 7 ,就发现了处理DATE类型存在问题. ...
- LeetCode第[44]题(Java):Wildcard Matching
题目:通配符匹配 难度:hard 题目内容: Given an input string (s) and a pattern (p), implement wildcard pattern match ...
- respond.js第六行 SCRIPT5: 拒绝访问。跨域问题
问题描述:respond.js第六行 SCRIPT5: 拒绝访问.昨天为学弟学妹讲bootstrap,说到对ie78的兼容问题,解决办法中有引入html5shiv.js和respond.js两个文件夹 ...
- Could not publish server configuration for Tomcat v6.0 Server at localhost.错误问题解决
经常在使用tomcat服务器的时候 总会发生一些莫名其妙的错误. 就像下面这个错误: 在配置文件中存在多个/MyWeb的配置,导致不能发布服务. 错误信息: Could not publish ser ...
- LeetCode OJ:Binary Tree Postorder Traversal(后序遍历二叉树)
Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...
- 八行代码解决八皇后问题(c++)
说的有点夸装,实际上并不只是巴航代码,加上前面的变量声明之类的一共有40多行的样子吧,好像是在知乎上看到的,现在有时间再把它写下来: 其中用到了一些c++11特性,例如lambda 以及给予范围的 f ...
- DRF 用户频率限制
DRF 用户频率限制 为什么要限流 1 防爬虫 匿名用户 无法限制,代理 已登录,用户名限制:买代理 2 提供服务(接口--不同用户的访问次数不一样) vip 限制访问次数 BaseThrottle ...
- jsp中解决乱码问题
解决中文乱码 a) 第一种: String name=new String(name.getBytes("ISO-8859-1"),"UTF-8"); b) 第 ...