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

FFMpeg rtmp 推送本地yuv文件

可以借鉴的:C++使用FFmpeg实现YUV数据编码转视频文件_C 语言_脚本之家

yuv文件下载地址:YUV Sequences

代码:

#include <stdio.h>
#include <unistd.h>
#include <iostream>
extern "C" {
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libswscale/swscale.h"
};
using namespace std;const char* input_file = "/mnt/hgfs/shareVM/BigBuckBunny_CIF_24fps.yuv";
const char* output_rtmp_url = "rtmp://10.10.18.94:1935/live/test";int main(int argc, char *argv[]) {AVFormatContext *pFormatCtx = nullptr;AVOutputFormat *fmt = nullptr;AVStream *video_st = nullptr;AVCodecContext *pCodecCtx = nullptr;AVCodec *pCodec = nullptr;uint8_t *picture_buf = nullptr;int size;//打开视频文件FILE *in_file = fopen(input_file, "rb");if (!in_file) {cout << "can not open file!" << endl;return -1;}//[1] --注册所有ffmpeg组件avcodec_register_all();av_register_all();//[2] --初始化AVFormatContext结构体,根据文件名获取到合适的封装格式avformat_alloc_output_context2(&pFormatCtx, NULL, "flv", output_rtmp_url);fmt = pFormatCtx->oformat;//[3] --打开文件if (avio_open(&pFormatCtx->pb, output_rtmp_url, AVIO_FLAG_READ_WRITE)) {cout << "output file open fail!";return -1;}//[3]//[4] --初始化视频码流video_st = avformat_new_stream(pFormatCtx, 0);if (video_st == NULL){printf("failed allocating output stram\n");return -1;}video_st->time_base.num = 1;video_st->time_base.den = 25;//[4]//[5] --编码器Context设置参数pCodecCtx = video_st->codec;pCodecCtx->codec_id = fmt->video_codec;pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO;pCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P;pCodecCtx->width = 352;pCodecCtx->height = 288;pCodecCtx->time_base = {1, 25};pCodecCtx->framerate = {25, 1};pCodecCtx->bit_rate = 400000;pCodecCtx->gop_size = 50;//[5]//[6] --寻找编码器并打开编码器pCodec = avcodec_find_encoder(AV_CODEC_ID_FLV1);if (!pCodec){cout << "no right encoder!" << endl;return -1;}if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0){cout << "open encoder fail!" << endl;return -1;}//[6]//输出格式信息av_dump_format(pFormatCtx, 0, output_rtmp_url, 1);//初始化帧AVFrame *picture = av_frame_alloc();picture->width = pCodecCtx->width;picture->height = pCodecCtx->height;picture->format = pCodecCtx->pix_fmt;av_frame_get_buffer(picture, 32);size = avpicture_get_size(pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height);picture_buf = (uint8_t*)av_malloc(size);avpicture_fill((AVPicture*)picture, picture_buf, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height);//[7] --写头文件avformat_write_header(pFormatCtx, NULL);//[7]//[8] --循环编码每一帧AVPacket pkt; //创建已编码帧int frame_count = 0;while (!feof(in_file)) {// 读取一帧 YUV 数据uint8_t yuv_buf[pCodecCtx->width * pCodecCtx->height * 3 / 2];size_t read_size = fread(yuv_buf, 1, pCodecCtx->width * pCodecCtx->height * 3 / 2, in_file);if (read_size <= 0) {break;}av_init_packet(&pkt);pkt.data = NULL;pkt.size = 0;// 将 YUV 数据编码为 H.264memcpy(picture->data[0], yuv_buf, pCodecCtx->width * pCodecCtx->height);memcpy(picture->data[1], yuv_buf + pCodecCtx->width * pCodecCtx->height, pCodecCtx->width * pCodecCtx->height / 4);memcpy(picture->data[2], yuv_buf + pCodecCtx->width * pCodecCtx->height * 5 / 4, pCodecCtx->width * pCodecCtx->height / 4);picture->pts = frame_count;int got_picture = 0;//编码int ret = avcodec_encode_video2(pCodecCtx, &pkt, picture, &got_picture);if (ret < 0){cout << "encoder fail!" << endl;return -1;}if (!got_picture){ret = 0;break;}cout << "encoder success! " <<picture->pts<< endl;// parpare packet for muxingpkt.stream_index = video_st->index;pkt.pts = frame_count * (pCodecCtx->time_base.den) / ((pCodecCtx->time_base.num) * 25);pkt.dts = pkt.pts;av_packet_rescale_ts(&pkt, pCodecCtx->time_base, video_st->time_base);pkt.pos = -1;ret = av_interleaved_write_frame(pFormatCtx, &pkt);if(ret < 0)break;av_free_packet(&pkt);frame_count++;usleep(30*1000);}//[8]//[9] --写文件尾av_write_trailer(pFormatCtx);//[9]//释放内存if (video_st){avcodec_close(video_st->codec);av_free(picture);av_free(picture_buf);}if (pFormatCtx){avio_close(pFormatCtx->pb);avformat_free_context(pFormatCtx);}fclose(in_file);return 0;
}

相关文章:

FFMpeg rtmp 推送本地yuv文件

可以借鉴的&#xff1a;C使用FFmpeg实现YUV数据编码转视频文件_C 语言_脚本之家 yuv文件下载地址&#xff1a;YUV Sequences 代码&#xff1a; #include <stdio.h> #include <unistd.h> #include <iostream> extern "C" { #include "libav…...

websocket使用,spring boot + vite + vue3

websocket使用&#xff0c;spring boot vite vue3 Websocket是什么WebSocket 服务端构建websocket 服务实现处理器pom文件 客户端仓库地址 Websocket是什么 WebSocket 是一种网络传输协议&#xff0c;可在单个 TCP 连接上进行全双工通信&#xff0c;位于 OSI 模型的应用层。…...

基础位运算

基础知识点&#xff1a; 1.判断2的幂 n&&#xff08;n-1&#xff09;0 2.每次减一处理 n&(n-1) 3.判断出现1次次数的数 x^0x&#xff0c;x^x0&#xff0c;a^bc则ab^c&#xff0c;ba^c 力扣练习题&#xff1a; 136.只出现一次的数字 class Solution { public:int si…...

性价比高真无线蓝牙耳机有哪些?性价比真无线蓝牙耳机推荐

目前真无线蓝牙耳机的音质和性能已经越来越接近甚至超越传统有线耳机。然而&#xff0c;市面上的TWS耳机品牌和型号繁多&#xff0c;价格也从几十元到几千元不等&#xff0c;性价比自然成了消费者选择时的重要考量因素&#xff0c;究竟哪些真无线蓝牙耳机既能够提供满意的音质和…...

Big Data Tools插件

一些介绍 在Jetbrains的产品中&#xff0c;均可以安装插件&#xff0c;其中&#xff1a;Big Data Tools插件可以帮助我们方便的操作HDFS&#xff0c;比如 IntelliJ IDEA&#xff08;Java IDE&#xff09; PyCharm&#xff08;Python IDE&#xff09; DataGrip&#xff08;SQL …...

两个li标签之间有空格这是什么原因

<li> 标签之间出现的空格可能由多种原因造成。以下是一些常见的原因&#xff1a; HTML源代码中的空格&#xff1a;如果你在HTML源代码中直接在两个 <li> 标签之间输入了空格或制表符&#xff08;Tab&#xff09;&#xff0c;这些空格可能会被浏览器渲染出来。不过&…...

使用Colly库进行高效的网络爬虫开发

引言 随着互联网技术的飞速发展&#xff0c;网络数据已成为信息获取的重要来源。网络爬虫作为自动获取网页内容的工具&#xff0c;在数据分析、市场研究、信息聚合等领域发挥着重要作用。本文将介绍如何使用Go语言中的Colly库来开发高效的网络爬虫。 什么是Colly库&#xff1…...

【C#】制作图集

如题目&#xff0c;用好几个图片拼在一个大图里&#xff0c;博主是用于Unity游戏开发使用的&#xff0c;话不多说&#xff0c;上代码&#xff01; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging;namespace EffectsPac…...

行列视报表系统制作的报表与厂级监控信息系统(SIS)系统中的报表有什么区别?

厂级监控信息系统是集过程实时监测、优化控制及生产过程管理为一体的厂级自动化信息系统&#xff0c;是处于DCS以及相关辅助程控系统与全厂管理信息系统之间的一套实时厂级监控信息系统&#xff0c;该产品也是本公司的一套独立产品。 SIS系统中的报表只是其中的一个模块&#…...

算法08 广/宽度优先搜索及相关问题详解

这是《C算法宝典》算法篇的第08节文章啦~ 如果你之前没有太多C基础&#xff0c;请点击&#x1f449;专栏&#xff1a;C语法入门&#xff0c;如果你C语法基础已经炉火纯青&#xff0c;则可以进阶算法&#x1f449;专栏&#xff1a;算法知识和数据结构&#x1f449;专栏&#xff…...

PyTorch 版本与 CUDA 版本的兼容性示例

PyTorch 1.9.0 及以上版本支持 CUDA 11.1。PyTorch 1.8.0 支持 CUDA 11.0。PyTorch 1.7.0 支持 CUDA 10.2。PyTorch 1.6.0 支持 CUDA 10.1。PyTorch 1.5.0 支持 CUDA 10.1。PyTorch 1.4.0 支持 CUDA 10.1。PyTorch 1.3.0 支持 CUDA 10.0。PyTorch 1.2.0 支持 CUDA 9.2。PyTorch…...

Selenium进行Web自动化滚动

在使用Selenium进行Web自动化时&#xff0c;计算页面内的滚动条位置或执行滚动操作通常涉及JavaScript执行。Selenium的WebDriver提供了执行JavaScript代码的功能&#xff0c;这可以用来获取滚动条的位置或滚动到页面上的特定位置。 获取滚动条位置 你可以使用JavaScript的wi…...

机器学习模型训练过程和预测过程 用孩子来生动的比喻 --九五小庞

训练过程&#xff1a;孩子在学习知识 想象一下&#xff0c;一个年幼的孩子刚开始学习新知识&#xff0c;这就像是机器学习的模型训练过程。 收集教材&#xff1a;孩子首先得到了一本教科书或一系列学习材料&#xff0c;这些材料就像机器学习中的数据集&#xff0c;包含了各种…...

【爱上C++】详解string类2:模拟实现、深浅拷贝

在上一篇文章中我们介绍了string类的基本使用&#xff0c;本篇文章我们将讲解string类一些常用的模拟实现&#xff0c;其中有很多细小的知识点值得我们深入学习。Let’s go&#xff01; 文章目录 类声明默认成员函数构造函数析构函数拷贝构造函数深浅拷贝问题传统写法现代写法…...

狄克斯特拉算法

狄克斯特拉算法&#xff08;Dijkstra’s algorithm&#xff09;是一种用于在带权图中找到从单一源点到所有其他顶点的最短路径的算法。它适用于处理带有非负权值的图。 下面将详细解释算法的工作原理、时间复杂度以及如何通过优化数据结构来改进其性能。 狄克斯特拉算法的工作…...

2024推荐整理几个磁力导航网站可提供海量资源的

都2024现在网上找资源像流水得鱼一样&#xff0c;抓一大把结果很难吃&#xff0c;我通宵特意整理的网站&#xff0c;网上有许多磁力导航网站可以提供海量的磁力链接资源&#xff0c;以下是一些有效的磁力导航网站推荐&#xff1a; 磁力搜索 链接&#xff1a; 资源类型&#x…...

链式访问:C语言中的函数调用技巧

链式访问&#xff1a;C语言中的函数调用技巧 在C语言编程中&#xff0c;链式访问&#xff08;chained calls&#xff09;是一个常见的编程技巧&#xff0c;它允许你在一行代码中连续调用多个函数或方法。这种技巧不仅能够让代码更加简洁和易读&#xff0c;还能减少临时变量的使…...

数据库设计(实战项目)-1个手机号多用户身份

一. 背景&#xff1a; 该需求是一个互联网医院的预约单场景&#xff0c;护士在小程序上申请患者查房预约单&#xff0c;医生在小程序上对预约单进行接单&#xff0c;护士开始查房后填写查房小结&#xff0c;客户需要对用户信息进行授权&#xff0c;医生查房后进行签字&#xff…...

vue+fineReport 使用前端搜索+报表显示数据

--fineReprot 将需要搜索的参数添加到模版参数 sql&#xff1a; --前端传递参数 注&#xff1a;因为每次点击搜索的结果需要不一样&#xff0c;还要传递一个时间戳的参数&#xff1a; let timesamp new Date().getTime()...

高阶面试-存储系统的设计

概述 分类 块存储 block storage文件存储 file storage对象存储 object storage 区别&#xff1a; 块存储 概述 位于最底层&#xff0c;块&#xff0c;是物理存储设备上数据存储的最小单位。硬盘(Hard Disk Drive&#xff0c;HDD)就属于块存储。常见的还有固态硬盘(SSD)、…...

避坑指南:S-Function参数传递中mxArray操作的3个典型错误

S-Function开发实战&#xff1a;mxArray参数传递的3大陷阱与防御性编程技巧 在Simulink的S-Function开发中&#xff0c;mxArray作为MATLAB与C/C之间的数据桥梁&#xff0c;其正确操作直接关系到模块的稳定性和可靠性。许多开发者在参数传递环节频繁遭遇段错误、内存泄漏和类型误…...

gte-base-zh场景应用:电商搜索与客服问答的语义匹配实战

gte-base-zh场景应用&#xff1a;电商搜索与客服问答的语义匹配实战 1. 电商场景中的语义匹配挑战 1.1 搜索不精准的痛点分析 在电商平台上&#xff0c;用户搜索"苹果手机"却看到水果苹果的图片&#xff0c;或者输入"轻薄笔记本"却返回游戏本&#xff0…...

告别拉伸变形!保姆级教程:为你的Unity Windows应用添加自定义窗口比例限制器

Unity Windows应用窗口比例锁定全攻略&#xff1a;从原理到避坑指南 你是否遇到过这样的尴尬场景——精心设计的UI在用户随意拉伸窗口后变得面目全非&#xff1f;作为Unity开发者&#xff0c;我们常常需要为Windows平台构建专业级应用&#xff0c;而窗口比例控制正是提升用户体…...

探索粗糙表面波动模型生成:打造不规则之美

粗糙表面&#xff0c;波动模型生成&#xff0c;用于在物体表面生成不规则的粗糙表面&#xff0c;或面表面的波动边界等&#xff0c;可自定义波动分布与赋值。在图形学和模拟领域&#xff0c;生成物体表面的粗糙质感或是波动边界常常是一个有趣又具有挑战性的任务。今天咱们就聊…...

量化模型精度补偿方案:百川2-13B-4bits在OpenClaw复杂推理中的表现提升

量化模型精度补偿方案&#xff1a;百川2-13B-4bits在OpenClaw复杂推理中的表现提升 1. 量化模型的精度挑战与补偿需求 当我第一次尝试将百川2-13B-4bits量化模型接入OpenClaw进行自动化任务处理时&#xff0c;遇到了一个典型问题&#xff1a;在简单的文件整理和网页操作任务中…...

7个高级配置技巧:打造极致Markdown预览体验

7个高级配置技巧&#xff1a;打造极致Markdown预览体验 【免费下载链接】vscode-markdown-preview-enhanced One of the "BEST" markdown preview extensions for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-markdown-preview-enhanc…...

【FastAPI 2.0流式AI响应核心机密】:3大异步协程调度陷阱、2处EventSource底层劫持点、1个未公开的StreamingResponse状态机设计缺陷

第一章&#xff1a;FastAPI 2.0流式AI响应的架构演进与设计哲学FastAPI 2.0 将流式响应能力从实验性支持提升为核心原语&#xff0c;其底层重构了 Starlette 的响应生命周期与事件循环集成机制&#xff0c;使 Server-Sent Events&#xff08;SSE&#xff09;、text/event-strea…...

Day25(高阶篇):RAG检索与重排序算法精研|从原理到参数调优,彻底攻克检索瓶颈

Day25&#xff08;高阶篇&#xff09;&#xff1a;RAG检索与重排序算法精研&#xff5c;从原理到参数调优&#xff0c;彻底攻克检索瓶颈 引言&#xff1a; 进阶篇我们搞定了RAG系统的生产级落地&#xff0c;能满足常规项目的精准问答需求&#xff0c;但如果想让系统达到极致准确…...

4步实现Android Studio本地化配置:从语言障碍到高效开发

4步实现Android Studio本地化配置&#xff1a;从语言障碍到高效开发 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 问题诊断&…...

3步解决HEIC预览难题:面向Windows用户的高效缩略图工具

3步解决HEIC预览难题&#xff1a;面向Windows用户的高效缩略图工具 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 在数字影像管理中&…...