当前位置: 首页 > news >正文

第7课 利用FFmpeg将摄像头画面与麦克风数据合成后推送到rtmp服务器

上节课我们已经拿到了摄像头数据和麦克风数据,这节课我们来看一下如何将二者合并起来推送到rtmp服务器。推送音视频合成流到rtmp服务器地址的流程如下:

1.创建输出流

//初始化输出流上下文
avformat_alloc_output_context2(&outFormatCtx, NULL, "flv", outFileName);
outFormat = outFormatCtx->oformat;
outFormat->video_codec = AV_CODEC_ID_H264;
outFormat->audio_codec = AV_CODEC_ID_AAC;

2.创建视频编码器

vEncodec = avcodec_find_encoder(AV_CODEC_ID_H264);
vEncodeCtx = avcodec_alloc_context3(vEncodec);
vEncodeCtx->codec_id = vEncodec->id;
vEncodeCtx->codec_type = AVMEDIA_TYPE_VIDEO;
vEncodeCtx->bit_rate = 1000000;
vEncodeCtx->width = backWidth;
vEncodeCtx->height = backHeight;
vEncodeCtx->time_base = { 1, 25 };
vEncodeCtx->framerate = { 25, 1 };
vEncodeCtx->gop_size = 25 * 10;
vEncodeCtx->pix_fmt = *vEncodec->pix_fmts;
vEncodeCtx->max_b_frames = 0;
vEncodeCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
av_dict_set(&vEncodeOpts, "profile", "baseline", 0);
av_dict_set(&vEncodeOpts, "preset", "ultrafast", 0);
av_dict_set(&vEncodeOpts, "tune", "zerolatency", 0);
avcodec_open2(vEncodeCtx, vEncodec, &vEncodeOpts);

3.创建音频编码器

//音频编码器
aEncodec = avcodec_find_encoder(AV_CODEC_ID_AAC);;
aEncodeCtx = avcodec_alloc_context3(aEncodec);
aEncodeCtx->bit_rate = 64000;
aEncodeCtx->sample_rate = 44100;
aEncodeCtx->block_align = 0;
aEncodeCtx->sample_fmt = AV_SAMPLE_FMT_FLTP;
aEncodeCtx->channel_layout = AV_CH_LAYOUT_STEREO;
aEncodeCtx->channels = 2;
aEncodeCtx->time_base.num = 1;
aEncodeCtx->time_base.den = aEncodeCtx->sample_rate;aEncodeCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
avcodec_open2(aEncodeCtx, aEncodec, NULL);

4.创建输出视频流

//创建输出视频流
videoStream = avformat_new_stream(outFormatCtx, vEncodec);
videoStream->id = outFormatCtx->nb_streams - 1;
videoStream->codecpar->codec_tag = 0;
avcodec_parameters_from_context(videoStream->codecpar, vEncodeCtx);

5.创建输出音频流

//创建输出音频流
audioStream = avformat_new_stream(outFormatCtx, NULL);
audioStream->codecpar->codec_tag = 0;
audioStream->id = outFormatCtx->nb_streams - 1;
avcodec_parameters_from_context(audioStream->codecpar, aEncodeCtx);

6.打开输出流并写入文件头

//打开输出流
av_dump_format(outFormatCtx, 0, outFileName, 1);
ret = avio_open2(&outFormatCtx->pb, outFileName, AVIO_FLAG_READ_WRITE, nullptr, nullptr);//写文件头
ret = avformat_write_header(outFormatCtx, NULL);

7.分别封装音视频帧并送入编码器

ret = avcodec_send_frame(vEncodeCtx, deVideoFrame);
ret = avcodec_receive_packet(vEncodeCtx, &enVideoPacket);ret = avcodec_send_frame(aEncodeCtx, deAudioFrame);
ret = avcodec_receive_packet(aEncodeCtx, &enAudioPacket);

8.分别推送音视频流

if (enVideoPacket.size > 0){ret = av_interleaved_write_frame(outFormatCtx, &enVideoPacket);				
}if (enAudioPacket.size > 0){ret = av_interleaved_write_frame(outFormatCtx, &enAudioPacket);				
}

9.播放测试rtmp流

打开vlc或第一章写好的rtmp播放器测试,对着麦克风说话如果能从播放器听到声音并看到图像说明成功。

http://www.lryc.cn/news/272083.html

相关文章:

  • Microsoft Visual Studio 2022 install Project 下载慢
  • uniapp---安卓真机调试提示检测不到手机【解决办法】
  • Nginx(十四) 配置文件详解 - 负载均衡(超详细)
  • 大数据应用安全策略包括什么
  • Ubuntu软件和vmware下载
  • 如何修改Anaconda的Jupyter notebook的默认启动路径
  • 密码学:带密钥的消息摘要算法一数字签名算法
  • JVM中部分主要垃圾回收器的特点、使用的算法以及适用场景
  • vue保姆级教程----深入了解Vuex的工作原理
  • (JAVA)-(网络编程)-InetAddress(ip)
  • 手把手带你死磕ORBSLAM3源代码(二十二)Tracking.cc PrintTimeStats介绍
  • 【操作系统xv6】学习记录3-Wsl2 Ubuntu18.04图形化界面
  • CCNP课程实验-03-Route_Path_Control_CFG
  • STM32 学习(二)GPIO
  • 安卓作业001 - 显示学生信息
  • ARM CCA机密计算硬件架构之内存管理
  • MySQL--安装与配置与向日葵的基本操作使用
  • Vue - 多行文本“展开、收起”功能
  • Linux操作系统基础(6):Linux的文件颜色
  • LeetCode 1758. 生成交替二进制字符串的最少操作数【字符串,模拟】1353
  • Spring-IOC-xml方式
  • HUAWEI华为荣耀MagicBook X 15酷睿i5-10210U处理器集显(BBR-WAH9)笔记本电脑原装出厂Windows10系统
  • React使用动态标签名称
  • Java异常篇----第二篇
  • 微服务(1)
  • 195.【2023年华为OD机试真题(C卷)】5G 网络建设(最小生成树—JavaPythonC++JS实现)
  • 2024年1月1日答案
  • 【算法】dp题单
  • Verilog视频信号图形显示 FPGA(iCE40)
  • 【LeetCode 面试经典150题】26. Remove Duplicates from Sorted Array 在有序数组中移除重复元素