原文:https://www.jianshu.com/p/69eede147229

#include <iostream>
using namespace std;
//引入头文件
extern "C"
{
#include "libavformat/avformat.h"//引入时间
#include "libavutil/time.h"
}
//引入库
#pragma comment(lib,"avformat.lib")
//工具库,包括获取错误信息等
#pragma comment(lib,"avutil.lib")
//编解码的库
#pragma comment(lib,"avcodec.lib")int avError(int errNum);static double r2d(AVRational r)
{return r.num == 0 || r.den == 0 ? 0. : (double)r.num / (double)r.den;
}
int main() {//所有代码执行之前要调用av_register_all和avformat_network_init//初始化所有的封装和解封装 flv mp4 mp3 mov。不包含编码和解码av_register_all();//初始化网络库avformat_network_init();//使用的相对路径,执行文件在bin目录下。test.mp4放到bin目录下即可const char *inUrl = "test.flv";//输出的地址const char *outUrl = "rtmp://192.168.136.131/live/test";////                   输入流处理部分///打开文件,解封装 avformat_open_input//AVFormatContext **ps  输入封装的上下文。包含所有的格式内容和所有的IO。如果是文件就是文件IO,网络就对应网络IO//const char *url  路径//AVInputFormt * fmt 封装器//AVDictionary ** options 参数设置AVFormatContext *ictx = NULL;//打开文件,解封文件头int ret = avformat_open_input(&ictx, inUrl, 0, NULL);if (ret < 0) {return avError(ret);}cout << "avformat_open_input success!" << endl;//获取音频视频的信息 .h264 flv 没有头信息ret = avformat_find_stream_info(ictx, 0);if (ret != 0) {return avError(ret);}//打印视频视频信息//0打印所有  inUrl 打印时候显示,av_dump_format(ictx, 0, inUrl, 0);////                   输出流处理部分/AVFormatContext * octx = NULL;//如果是输入文件 flv可以不传,可以从文件中判断。如果是流则必须传//创建输出上下文ret = avformat_alloc_output_context2(&octx, NULL, "flv", outUrl);if (ret < 0) {return avError(ret);}cout << "avformat_alloc_output_context2 success!" << endl;//配置输出流//AVIOcontext *pb  //IO上下文//AVStream **streams  指针数组,存放多个输出流  视频音频字幕流//int nb_streams;//duration ,bit_rate//AVStream//AVRational time_base//AVCodecParameters *codecpar 音视频参数//AVCodecContext *codec//遍历输入的AVStreamfor (int i = 0; i < ictx->nb_streams; i++) {//创建一个新的流到octx中AVStream *out = avformat_new_stream(octx, ictx->streams[i]->codec->codec);if (!out) {return avError(0);}//复制配置信息 用于mp4 过时的方法//ret=avcodec_copy_context(out->codec, ictx->streams[i]->codec);ret = avcodec_parameters_copy(out->codecpar, ictx->streams[i]->codecpar);if (ret < 0) {return avError(ret);}out->codec->codec_tag = 0;}av_dump_format(octx, 0, outUrl, 1);////                   准备推流///打开IOret = avio_open(&octx->pb, outUrl, AVIO_FLAG_WRITE);if (ret < 0) {avError(ret);}//写入头部信息ret = avformat_write_header(octx, 0);if (ret < 0) {avError(ret);}cout << "avformat_write_header Success!" << endl;//推流每一帧数据//int64_t pts  [ pts*(num/den)  第几秒显示]//int64_t dts  解码时间 [P帧(相对于上一帧的变化) I帧(关键帧,完整的数据) B帧(上一帧和下一帧的变化)]  有了B帧压缩率更高。//uint8_t *data    //int size//int stream_index//int flagAVPacket avPacket;//获取当前的时间戳  微妙long long startTime = av_gettime();while (true){ret = av_read_frame(ictx, &avPacket);if (ret < 0) {break;}cout << avPacket.pts << " " << flush;//计算转换时间戳 pts dts//获取时间基数AVRational itime = ictx->streams[avPacket.stream_index]->time_base;AVRational otime = octx->streams[avPacket.stream_index]->time_base;avPacket.pts = av_rescale_q_rnd(avPacket.pts, itime, otime, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_NEAR_INF));avPacket.dts = av_rescale_q_rnd(avPacket.pts, itime, otime, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_NEAR_INF));//到这一帧时候经历了多长时间avPacket.duration = av_rescale_q_rnd(avPacket.duration, itime, otime, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_NEAR_INF));avPacket.pos = -1;//视频帧推送速度if (ictx->streams[avPacket.stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {AVRational tb = ictx->streams[avPacket.stream_index]->time_base;//已经过去的时间long long now = av_gettime() - startTime;long long dts = 0;dts = avPacket.dts * (1000 * 1000 * r2d(tb));if (dts > now)av_usleep(dts - now);else {cout << "sss";}}//推送  会自动释放空间 不需要调用av_packet_unrefret = av_interleaved_write_frame(octx, &avPacket);if (ret < 0) {break;}//视频帧推送速度//if (avPacket.stream_index == 0)//  av_usleep(30 * 1000);//释放空间。内部指向的视频空间和音频空间//av_packet_unref(&avPacket);}return 0;
}int avError(int errNum) {char buf[1024];//获取错误信息av_strerror(errNum, buf, sizeof(buf));cout << " failed! " << buf << endl;return -1;
}

ffmpeg rtsp转 rtmp相关推荐

  1. 【FFmpeg】RTSP、RTMP相关命令及开源项目

    一.RTSP转RTMP 海康摄像头:抓取 rtsp 流然后转换成 rtmp 推流出去 主码流 ffmpeg -i "rtsp://[用户名]:[密码]@192.168.1.100/h265/ ...

  2. nodejs ffmpeg 超级工具 rtsp fmp4 rtmp

    1.为何使用nodejs作为测试工具 1 .nodejs作为一个非常棒的工具,启动http协议使用express或者koi这种工具非常方便 2 .性能卓越,单线程启动不用担心有访问加锁问题 3.在使用 ...

  3. RTSP 和 RTMP原理 通过ffmpeg实现将本地摄像头推流到RTSP服务器

    RTSP 和 RTMP原理 & 通过ffmpeg实现将本地摄像头推流到RTSP服务器 文章目录 RTSP 和 RTMP原理 & 通过ffmpeg实现将本地摄像头推流到RTSP服务器 一 ...

  4. ffmpeg推rtsp、rtmp音视频流命令

    ffmpeg推rtsp.rtmp音视频流命令 rtmp流 推流 播放 rtsp流 推流 播放 原创文章禁止转载 同步发布http://www.alom.com.cn/ ffmpeg推rtsp.rtmp ...

  5. NGINX+ffmpeg 实现 大华摄像头视屏转流RTSP转RTMP或M3U8

    一.准备 1.环境: windows 2.开发工具: ffmpeg.nginx(代理服务器)nginx-rmtp-module(nginx服务器的流媒体插件).vlc(兼容性播放器) 3.原理: ng ...

  6. android使用Ffmpeg JNI实时播放RTSP、RTMP等视频(主码流,子码流均能流畅播放)

    前言:最近 公司项目需要在电视上 播放摄像头视频,而且可以随时切换流,延时要求在500ms以内,网上试过了 各种开源库 ,都不能达到要求.于是自己找到公司C++开发人员请教,最后终于完成,在此记录,也 ...

  7. QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(一)

    QT软件开发-基于FFMPEG设计录屏与rtsp.rtmp推流软件(支持桌面与摄像头)(一) https://xiaolong.blog.csdn.net/article/details/126954 ...

  8. QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(四)

    QT软件开发-基于FFMPEG设计录屏与rtsp.rtmp推流软件(支持桌面与摄像头)(一) https://xiaolong.blog.csdn.net/article/details/126954 ...

  9. java中rtsp转m3u8_NGINX+ffmpeg 实现 大华摄像头视屏转流RTSP转RTMP或M3U8

    一.准备 1.环境: windows 2.开发工具: ffmpeg.nginx(代理服务器)nginx-rmtp-module(nginx服务器的流媒体插件).vlc(兼容性播放器) 3.原理: ng ...

最新文章

  1. 《从缺陷中学习C/C++》——6.15 试图产生的指针很可能不存在
  2. 【Harvest源码分析】GetF0CandidateContour函数
  3. 环球易购选品:既然选品绕不过,那就让我们好好研究
  4. CF453C:Little Pony and Summer Sun Celebration(dfs、构造)
  5. 周期均方根和有效值的区别_买羊肉,“羔羊肉”和“羊肉”有啥区别?口感差别大,别再乱买了...
  6. IAM页,IAM链表,分配单元
  7. SpringBoot配置@PropertySource、@ImportResource、@Bean注解
  8. 联想战略储备看创投,联想创投All in智能互联网
  9. ES6 推荐网络文档书籍
  10. (笔记总结)串行通信接口标准
  11. latex表格生成神器--教你如何将excel变成latex格式--教你如何做三线图
  12. 【励志】比风水厉害100倍的宇宙定律
  13. 亲自动手写爬虫系列三、爬取队列
  14. 一名大学生选择军哥的乾颐堂是如何顺利通过华为HCIE的,又如何应对HCIE面试呢?...
  15. numpy序列预处理dna序列_?12个很棒的Pandas和NumPy函数,让分析事半功倍
  16. 晶振PPM小参数,大作用
  17. 在百度上班也太太太太太太……还行吧!
  18. 贷前审批策略的6个搭建思路
  19. 微信读书调整“时长兑书币”规则
  20. 什么是反向链接,如何增加反向链接的数量

热门文章

  1. ubuntu c/c++ IDE编程环境
  2. android 自定义event,Android运用onTouchEvent自定义滑动布局
  3. 多线程中数据的并发访问与保护
  4. html求和按钮,使用模板标记在html模板中求和
  5. 邵阳计算机专业哪家最好,邵阳学院专业排名 最好的专业有哪些
  6. php private方法,PHP-private私有访问的操作方法
  7. mysql union 优化_mysql 5.7.3 对union all 的优化
  8. java之父求职_Java求职实战之继承和多态
  9. mysql中的表连接知识点_Mysql知识点总结
  10. linux进制转换的函数,Linux shell 进制转换