经过这几天的验证,终于走通了FFmpeg读取USB摄像头H264帧,然后用rtmp推流。使用的版本是4.0.2,网上的示例要么是命令形式的,要么是读取YUV格式的数据,然后在编码的,所以只能自己摸索了。 FFmpeg的源码在ubuntu16.04上的编译就不说了,这个网上的文章很多,这里我要说的是,好像FFmpeg对v4l2的封装,不能从摄像头多种输出...
ffmpeg打开rtsp的url,从in_stream的码流中,复制所需要的h264编码信息;然后 写入对应的rtmp流(out_stream)中,结果发现写入函数av_interleaved_write_frame一直异常,无法写入?并且错误信息为“ Broke Pipe"? AVStream *in_stream = ifmt_ctx->streams[videoindex]; AVStream *out_stream = avformat_new_stream(ofm...
video_stream->codecpar->codec_id=AV_CODEC_ID_H264; video_stream->codecpar->codec_type=AVMEDIA_TYPE_VIDEO; video_stream->codecpar->width=640; video_stream->codecpar->height=480; video_stream->codecpar->format=AV_PIX_FMT_YUV420P; video_stream->codecpar->bit_rate=400000; video_stream...
用大白话讲,推流就是把本地音视频数据通过网络上传到云端/后台服务器,所谓“采集阶段封包好”,笔者认为是未解码的H264的NALU。 推流的整个阶段如下图,(读者请先忽略“拉流”这个名词,姑且替换为客户端用户在视频门户网站,如腾讯视频、B站等看网络在线的视频,自然也包括看直播。): 上图从“推流端”到“源站”(...
RTMP Streamer是一个安卓手机端的开源RTMP直播推流框架,可用于RTMP直播和RTSP直播,其升级版还支持SRT直播(腾讯视频云就采用SRT协议)。RTMP Streamer支持的视频编码包括H264、H265、AV1等等,支持的音频编码包括AAC、G711、OPUS等等,可谓功能强大的APP直播框架。
也就是说,对视频数据来说,就是H264码流。解码工作是在播放端进行的。 推流的工作可想而知,最多的应用就是直播;而在大多数视频门户网站,笔者目前也很疑惑,是否存在步骤1,从效率上来说,视频数据直接存放在“源站”,通过CDN根据客户端请求下发,应该就可以了。至于具体做法,有待考证,笔者在这里姑且记一笔吧。
// fmt->video_codec = AV_CODEC_ID_H264; // fmt->audio_codec = AV_CODEC_ID_AAC; for (int i = 0; i < m_inputAVFormatCxt->nb_streams; i++) { AVStream *in_stream = m_inputAVFormatCxt->streams[i]; if(in_stream->codec->codec_type!= AVMEDIA_TYPE_VIDEO && in_stream->codec...
以下是使用FFmpeg在C++中进行RTMP推流的示例代码,假设已经有H264视频和对应的PTS和DTS时间戳: #include<iostream> #include<string> #include<chrono> extern"C" { #include<libavcodec/avcodec.h> #include<libavformat/avformat.h> #include<libavutil/timestamp.h> ...
avcodec_find_encoder(AV_CODEC_ID_H264) 获取H264的编码器 设置编码器参数 pix_fmt 像素的格式这里我们使用的AV_PIX_FMT_YUV420P,也就是YUV平面格式,三个平面分别存放Y、U、V数据。 codec_type 编码器编码的数据类型 framerate 帧率 time_base 帧率的基本单位 ...