本文实现ffmpeg本地文件rtmp推流

ffmpeg本地文件推流主要流程

ffmpeg视频格式转换示例

#include <iostream>extern "C" {
#include "libavformat\avformat.h"
#include "libavutil\avutil.h"
#include "libavutil\time.h"
#include "libavcodec\avcodec.h"
}#pragma comment(lib, "avformat.lib")
#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avutil.lib")using std::cout;
using std::endl;void printErr(char *info, int ret)
{char err[1024] = { 0 };av_strerror(ret, err, sizeof(err));cout << info << ": " << err << endl;system("pause");
}double r2d(AVRational r)
{return r.den == 0 ? 0 : r.num * 1.0 / r.den;
}int main(int argv, char *argc[])
{//打开输入封装格式char *inPath = "D:/video/Bilby.mkv";AVFormatContext *inFormatCtx = nullptr;int ret = avformat_open_input(&inFormatCtx, inPath, NULL, NULL);if (ret != 0) {printErr("avformat_open_input failed", ret);return -1;}//读取packet,获取stream信息avformat_find_stream_info(inFormatCtx, NULL);av_dump_format(inFormatCtx, 0, NULL, 0);//创建输出的封装格式,输出为rtmp流char *outPath = "rtmp://xxx.xxx.xxx/livetv/chcatv";AVFormatContext *outFormatCtx = nullptr;ret = avformat_alloc_output_context2(&outFormatCtx, NULL, "flv", outPath);if (ret != 0) {printErr("avformat_alloc_output_context2 failed", ret);return -1;}int videoIndex = av_find_best_stream(inFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);int audioIndex = av_find_best_stream(inFormatCtx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);//为输出封装格式创建streamfor (int i = 0; i < inFormatCtx->nb_streams; i++) {AVStream *inStream = inFormatCtx->streams[i];AVStream *outStream = avformat_new_stream(outFormatCtx, NULL);ret = avcodec_parameters_copy(outStream->codecpar, inStream->codecpar);if (ret != 0) {printErr("avcodec_parameters_copy failed", ret);return -1;}//codec_tag=0 ffmpeg自动设置封装格式支持的数据流outStream->codecpar->codec_tag = 0;}av_dump_format(outFormatCtx, 0, NULL, 1);//打开io,进行rtmp链接ret = avio_open(&outFormatCtx->pb, outPath, AVIO_FLAG_WRITE);if (ret != 0) {printErr("avio_open failed", ret);return -1;}//写入stream头,会改变输出stream中的time_baseret = avformat_write_header(outFormatCtx, NULL);if (ret != 0) {printErr("avformat_write_header failed", ret);return -1;}AVPacket pkt;av_init_packet(&pkt);int64_t startTime = av_gettime();//遍历输入文件中的packetwhile (1) {//读取packetret = av_read_frame(inFormatCtx, &pkt);if (ret < 0) {break;}//pts,dts,duration以输出format的time_base转换AVRational srcTb = inFormatCtx->streams[pkt.stream_index]->time_base;AVRational dstTb = outFormatCtx->streams[pkt.stream_index]->time_base;pkt.pts = av_rescale_q_rnd(pkt.pts, srcTb, dstTb, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));pkt.dts = av_rescale_q_rnd(pkt.dts, srcTb, dstTb, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));pkt.duration = av_rescale_q(pkt.duration, srcTb, dstTb);//使用视频的pts与实际时间进行同步if (pkt.stream_index == videoIndex) {int64_t now = av_gettime() - startTime;int64_t pts = pkt.pts * 1000 * 1000 * r2d(dstTb);if (pts > now) {av_usleep(pts - now);}}//发送packetav_interleaved_write_frame(outFormatCtx, &pkt);}av_write_trailer(outFormatCtx);//关闭输入输出avformat_close_input(&inFormatCtx);avio_close(outFormatCtx->pb);avformat_free_context(outFormatCtx);system("pause");return 0;
}

推流和转封装代码基本一致,需要注意以下几点

1.avformat_alloc_output_context2创建输出封装格式,输出路径就是指定推流地址。

2.ffmpeg可能无法从推流地址分析出封装格式,在调用avformat_alloc_output_context2时,需要手动指定一下,本文指定的是flv格式。

3.在读取packet推流时需要与当前时间进行同步。因为ffmpeg本地读取文件速度很快,而播放速度相对较慢。如果不同步有可能出现40分钟的文件10分钟就读取发送完成,造成一些问题。

ffmpeg rtmp推流相关推荐

  1. ZLMediaKit接收ffmpeg rtmp推流

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

  2. ffmpeg+rtmp推流/拉流(十)

    一.搭建rtmp服务器 1.下载nginx https://github.com/nginx/nginx/archive/release-1.19.6.zip2.下载nginx-rtmp-module ...

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

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

  4. ffmpeg rtmp推流代码示例

    rtmp推流,得有rtmp服务器,可以参考这篇博客搭建rtmp服务器  ===>>>ubuntu搭建rtmp服务器,如果自己有rtmp服务器,可以不用看. rtmp推流需要用flv格 ...

  5. ffmpeg rtmp 推流错误WriteN, RTMP send error 10053 10038

    利用ffmepg推264流到rtmp服务端出现错误WriteN, RTMP send error 10053,具体如下图所示. 图1推流到rtmp服务错误 原因是视频流缺少SPS,PPS信息,加上这两 ...

  6. python利用ffmpeg进行rtmp推流直播

    思路: opencv读取视频 -> 将视频分割为帧 -> 将每一帧进行需求加工后 -> 将此帧写入pipe管道 -> 利用ffmpeg进行推流直播 pipe管道: 啥是pipe ...

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

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

  8. Windows远程桌面实现之五(FFMPEG实现桌面屏幕RTSP,RTMP推流及本地保存)

    by fanxiushu 2018-07-10 转载或引用请注明原始作者. 前面文章分别阐述了,如何抓取电脑屏幕数据,如何采集电脑声音, 如何实现在现代浏览器中通过HTML5和WebSocket直接进 ...

  9. 利用ffmpeg实现rtmp推流直播

    我们这次利用ffmpeg实现rtmp推流(最终推流地址统一为rtmp://127.0.0.1:1935/live/123) 1.首先下载ffmpeg和ffplay 官方下载链接为:FFmpeg 下载后 ...

最新文章

  1. JDBC中驱动加载的过程分析
  2. php是独立服务吗,在LNMP服务器中,PHP是作为一个独立的服务存在的,这个服务叫做_______。...
  3. 设置UserAgent让电脑浏览器访问微信手机网站
  4. 应用程序窗口hwnd初始化_Golang OpenGL 跨平台图形程序开发(2)你好,窗口
  5. 公司承担的国家发改委高技术产业化示范工程
  6. 根据方法名执行方法的例子
  7. 2019北京理工大学计算机专硕经验分享
  8. Pycharm 相关使用方法
  9. github项目地址在哪里看_拍张照片求解数独,计算机如何从图中看懂题目,这个GitHub热榜项目告诉你...
  10. fortran调用mysql_Fortran过程
  11. 十大排序算法(Top 10 Sorting Algorithms)
  12. 库缇斯“走”向演讲台
  13. js柯里化的认识(本文转载自https://www.zhangxinxu.com/wordpress/2013/02/js-currying),觉得很有用就记下了
  14. win7的音量图标不见了
  15. 逻辑思维能力选择题30道
  16. 一个pdf怎么分成两个文件?怎样将一个pdf文件分成几个pdf文件或若干个?
  17. c# 判断路径是否存在
  18. 公众号自定义菜单指定客服的简单操作
  19. 常见邮件服务器 接收服务器和发送邮件服务器 地址
  20. java调用jasper_Java开源报表Jasper入门(2) -- 使用JasperSoft Studio创建一个简单报表

热门文章

  1. python websocket实时消息推送
  2. 租车新玩法 神州租车打造行业标杆
  3. 窗口看门狗和独立看门狗区别
  4. ps修改图片中的图片尺寸
  5. 哪些蓝牙耳机适合打游戏?适合打游戏的低延迟蓝牙耳机排行
  6. 鼠标的光标变成了下划线
  7. CVPR 2022 | Accuracy和F1-score真的能代表车道线检测网络性能吗?
  8. 停车场停车怎么找车?怎样查车停车什么停车场?
  9. 电脑dns服务器未响应啥意思,电脑诊断出DNS服务器未响应是什么意思
  10. IMP-00003 ORA-00942 IMP-00023 IMP-00000