1.命令方式
ffmpeg -f gdigrab -i desktop -vcodec libx264 -s 1280x720 -r 30 -b 1m -f flv rtmp://192.168.20.50:1935/live/desktop
2.代码方式

int video_capture()
{
AVFormatContext* m_fmt_ctx = NULL;
AVInputFormat* m_input_fmt = NULL;
int video_stream = -1;
avdevice_register_all();
avcodec_register_all();
const char* deviceName = “desktop”;
const char* inputformat = “gdigrab”;
int FPS = 15;
m_fmt_ctx = avformat_alloc_context();
m_input_fmt = av_find_input_format(inputformat);
AVDictionary* deoptions = NULL;
av_dict_set_int(&deoptions, “framerate”, FPS, AV_DICT_MATCH_CASE);
av_dict_set_int(&deoptions, “rtbufsize”, 3041280 * 100 *5, 0);
int ret = avformat_open_input(&m_fmt_ctx, deviceName, m_input_fmt, &deoptions);
if (ret != 0) {
return XError(ret);
}
av_dict_free(&deoptions);
ret = avformat_find_stream_info(m_fmt_ctx, NULL);
if (ret < 0) {
return XError(ret);
}
av_dump_format(m_fmt_ctx, 0, deviceName, 0);
video_stream = av_find_best_stream(m_fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);
if (video_stream < 0) {
return -1;
}

AVCodecContext * _codec_ctx = m_fmt_ctx->streams[video_stream]->codec;
AVCodec* _codec = avcodec_find_decoder(_codec_ctx->codec_id);
if (_codec == NULL) {
return -1;
}
ret = avcodec_open2(_codec_ctx, _codec, NULL);
if (ret != 0) {
return -1;
}
int width = m_fmt_ctx->streams[video_stream]->codec->width;
int height = m_fmt_ctx->streams[video_stream]->codec->height;
int fps = m_fmt_ctx->streams[video_stream]->codec->framerate.num > 0 ? m_fmt_ctx->streams[video_stream]->codec->framerate.num : 25;
AVPixelFormat videoType = m_fmt_ctx->streams[video_stream]->codec->pix_fmt;
std::cout << “avstream timebase : " << m_fmt_ctx->streams[video_stream]->time_base.num << " / " << m_fmt_ctx->streams[video_stream]->time_base.den << endl;
AVDictionary* enoptions = 0;
av_dict_set(&enoptions, “preset”, “superfast”, 0);
av_dict_set(&enoptions, “tune”, “zerolatency”, 0);
AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_H264);
if (!codec)
{
std::cout << “avcodec_find_encoder failed!” << endl;
return NULL;
}
AVCodecContext* vc = avcodec_alloc_context3(codec);
if (!vc)
{
std::cout << “avcodec_alloc_context3 failed!” << endl;
return NULL;
}
std::cout << “avcodec_alloc_context3 success!” << endl;
vc->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
vc->codec_id = AV_CODEC_ID_H264;
vc->codec_type = AVMEDIA_TYPE_VIDEO;
vc->pix_fmt = AV_PIX_FMT_YUV420P;
vc->width = width;
vc->height = height;
vc->time_base.num = 1;
vc->time_base.den = FPS;
vc->framerate = { FPS,1 };
vc->bit_rate = 10241000;
vc->gop_size = 120;
vc->qmin = 10;
vc->qmax = 51;
vc->max_b_frames = 0;
vc->profile = FF_PROFILE_H264_MAIN;
ret = avcodec_open2(vc, codec, &enoptions);
if (ret != 0)
{
return XError(ret);
}
std::cout << “avcodec_open2 success!” << endl;
av_dict_free(&enoptions);
SwsContext
vsc = NULL;
vsc = sws_getCachedContext(vsc,
width, height, (AVPixelFormat)videoType, //源宽、高、像素格式
width, height, AV_PIX_FMT_YUV420P,//目标宽、高、像素格式
SWS_BICUBIC, // 尺寸变化使用算法
0, 0, 0
);
if (!vsc)
{
cout << “sws_getCachedContext failed!”;
return false;
}
AVFrame* yuv = av_frame_alloc();
yuv->format = AV_PIX_FMT_YUV420P;
yuv->width = width;
yuv->height = height;
yuv->pts = 0;
ret = av_frame_get_buffer(yuv, 32);
if (ret != 0)
{
return XError(ret);
}
const char* rtmpurl = “rtmp://192.168.20.50:1355/live/test”;
AVFormatContext* ic = NULL;
ret = avformat_alloc_output_context2(&ic, 0, “flv”, rtmpurl);
if (ret < 0)
{
return XError(ret);
}
AVStream* st = avformat_new_stream(ic, NULL);
if (!st)
{
return -1;
}
st->codecpar->codec_tag = 0;
avcodec_parameters_from_context(st->codecpar, vc);
av_dump_format(ic, 0, rtmpurl, 1);
ret = avio_open(&ic->pb, rtmpurl, AVIO_FLAG_WRITE);
if (ret != 0)
{
return XError(ret);
}
ret = avformat_write_header(ic, NULL);
if (ret != 0)
{
return XError(ret);
}
AVPacket* packet = av_packet_alloc();
AVPacket* Encodepacket = av_packet_alloc();
int frameIndex = 0;
int EncodeIndex = 0;
AVFrame* rgb = av_frame_alloc();
AVBitStreamFilterContext* h264bsfc = av_bitstream_filter_init(“h264_mp4toannexb”);
long long startpts = m_fmt_ctx->start_time;
long long lastpts = 0;
long long duration = av_rescale_q(1, { 1,FPS }, { 1,AV_TIME_BASE });
int got_picture = 0;
while (frameIndex < 200)
{
ret = av_read_frame(m_fmt_ctx, packet);
if (ret < 0) {
break;
}
if (packet->stream_index == video_stream)
{
ret = avcodec_decode_video2(_codec_ctx, rgb, &got_picture, packet);
if (ret < 0) {
printf(“Decode Error.\n”);
return ret;
}
if (got_picture) {
int h = sws_scale(vsc, rgb->data, rgb->linesize, 0, height, //源数据
yuv->data, yuv->linesize);
int guesspts = frameIndex * duration;
yuv->pts = guesspts;
frameIndex++;
ret = avcodec_encode_video2(vc, Encodepacket, yuv, &got_picture);
if (ret < 0) {
printf(“Failed to encode! \n”);
break;
}
if (got_picture == 1) {
Encodepacket->pts = av_rescale_q(EncodeIndex, vc->time_base, st->time_base);
Encodepacket->dts = Encodepacket->pts;
std::cout << “frameindex : " << EncodeIndex << " pts:” << Encodepacket->pts << " dts: " << Encodepacket->dts << " encodeSize:” << Encodepacket->size << " curtime - lasttime " << Encodepacket->pts - lastpts << endl;
lastpts = Encodepacket->pts;
ret = av_interleaved_write_frame(ic, Encodepacket);
EncodeIndex++;
av_packet_unref(Encodepacket);
}
}
}
av_packet_unref(packet);
}
ret = avcodec_send_frame(vc, NULL);
while (ret >= 0) {
ret = avcodec_receive_packet(vc, Encodepacket);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
break;
}
if (ret < 0) {
break;
}
ret = av_interleaved_write_frame(ic, Encodepacket);
EncodeIndex++;
}
av_write_trailer(ic);
av_packet_free(&packet);
av_packet_free(&Encodepacket);
av_frame_free(&rgb);
av_frame_free(&yuv);
av_bitstream_filter_close(h264bsfc);
h264bsfc = NULL;
if (vsc)
{
sws_freeContext(vsc);
vsc = NULL;
}
if (_codec_ctx)
avcodec_close(_codec_ctx);
_codec_ctx = NULL;
_codec = NULL;
if (vc)
avcodec_free_context(&vc);
if (m_fmt_ctx)
avformat_close_input(&m_fmt_ctx);
if (ic && !(ic->flags & AVFMT_NOFILE))
avio_closep(&ic->pb);
if (ic) {
avformat_free_context(ic);
ic = NULL;
}
m_input_fmt = NULL;
return 0;
}

ffmpeg屏幕推流相关推荐

  1. 最简单的基于FFMPEG的推流器附件:收流器

    ===================================================== 最简单的基于FFmpeg的推流器系列文章列表: <最简单的基于FFmpeg的推流器(以 ...

  2. 最简单的基于FFmpeg的推流器(以推送RTMP为例)

    ===================================================== 最简单的基于FFmpeg的推流器系列文章列表: <最简单的基于FFmpeg的推流器(以 ...

  3. ZLMediaKit接收ffmpeg rtmp推流

    目录 一 关键类 二 推流缓冲 webrtc拉流篇,可参考 https://mp.csdn.net/mp_blog/creation/editor/122743325 RTMP采用的封装格式是FLV. ...

  4. 基于ffmpeg的推流示例

    基于ffmpeg的推流示例   流媒体(streaming media)是指将一连串的媒体数据压缩后,经过网上分段发送数据,在网上即时传输影音以供观赏的一种技术与过程,此技术使得数据包得以像流水一样发 ...

  5. ffmpeg api推流,谷歌浏览器播放大华、海康威视网络摄像头rtsp视频流方案(hls、m3u8、flv、webrtc、srs、nginx、nginx-rtmp、rtmp)比较

    ffmpeg api推流,谷歌浏览器播放大华.海康威视网络摄像头rtsp视频流方案(hls.m3u8.flv.webrtc.srs.nginx.nginx-rtmp.rtmp)比较 将网络摄像头视频流 ...

  6. linux ffmpeg自动推流,ffmpeg推流下载

    ffmpeg自动推流run是一款用ffmpeg制作推流工具,写这个工具自然是有特殊作用 ,并不适用所有人群本程序能做到的:守护推流进程 一旦推流断开 自动重启进程. 软件作用: 将m3u8推流到任意r ...

  7. 音视频开发---ffmpeg rtmp推流

    目录 推流介绍 FFmpeg推流 推流器函数流程图 代码 遗留问题 参考 推流介绍 推流是将输入视频数据推送至流媒体服务器, 输入视频数据可以是本地视频文件(avi,mp4,flv......),也可 ...

  8. ffmpeg udp推流bind failed: Address already in use

    报错: [udp @ 0x7f63780079c0] bind failed: Address already in useB f=0/0 udp://127.0.0.1:6016: Input/ou ...

  9. FFmpeg —— 屏幕录像和录音并推流(命令行的方式)

    Windows Windows采集设备的主要方式是dshow.vfwcap.gdigrab. 其中dshow可以用来抓取摄像头.采集卡.麦克风等,vfwcap主要用来采集摄像头类设备,gdigrab则 ...

最新文章

  1. rabbitmq怎样确认是否已经消费了消息_【朝夕专刊】RabbitMQ生产者/消费者消息确认...
  2. springboot rabbitmq direct exchange和topic exchange 写法上关于路由键的区别
  3. python renames_Python os.renames() 方法
  4. PDF密码去除常用工具
  5. CRC16循环冗余校验 RTU-MODBUS标准 Linux C
  6. 优化mysql数据库_MySQL数据库十大优化技巧
  7. PAT 1003 Emergency
  8. ipv6 ripng配置
  9. Spring+Stomp+ActiveMq实现websocket长连接
  10. android超频闪退,显卡超频后玩游戏闪退 | 手游网游页游攻略大全
  11. PE格式文件修复过程
  12. ubuntu提示根目录存储空间不足的解决办法
  13. 地震了!最好直接砸死我!
  14. php幸运大抽奖,幸运大转盘-jQuery+PHP实现的抽奖程序-完善中
  15. mysql 文本 挖掘_GitHub - myseve/dianping_textmining: 大众点评评论文本挖掘,包括点评数据爬取、数据清洗入库、数据分析、评论情感分析等的完整挖掘项目...
  16. 服务器:php-fpm线程卡死导致网站无响应
  17. matlab网页视频流,使用Matlab读取视频流文件
  18. Java核心类库(一)
  19. 神评:为什么要放弃it之家
  20. 偏差与方差、梯度下降、交叉验证与归一化标准化

热门文章

  1. 开源人工智能技术将改变一切
  2. 干货 | 豆子科技首席架构师钟声:Java的纯真年代
  3. Nginx 限制单个IP的并发连接数及对每个连接速度(限速)
  4. 使用路由器配置DHCP
  5. 算法研发---对宏定义#define相关研究
  6. Linux/CentOS下的CST和UTC时间的区别以及不一致的解决方法
  7. 文件管理类函数(1)
  8. AutoCADDCL对话框设计示例八
  9. 修改Linux系统分区后挂载问题
  10. Apache Gobblin 分布式大数据集成框架