• 想看懂这个代码需要掌握以下音视频基础知识

1、音视频时间基是什么?
FFMPEG之TimeBase成员理解
补充:封装/解封装、编码/解码、采集/显示这三个层面中的taimeBase是代表不同的意思的,需要通过转换才可以进行上下层的交互。

2、ffmpeg中对AVRational结构体理解
ffmpeg # AVRational
假如一秒25帧就是1/25;那么换算成每毫秒25帧就是1000* 1 /25 = 1000/25;换算成每微妙25帧话就是1000*1000/25(每一毫秒等于1000微妙)。

3、PTS和DTS是什么?
PTS:显示的时间;
DTS:编码/解码时间;
音频在时间轴是连续的,所以PTS和DTS是一样的;
视频中因为有I、B、P帧,I是关键帧,P是向前预测,B是向前向后预测所以当没有B帧时候PTS和DTS在时间轴是一样的,为什么有了B帧就就不一样的呢,因为B帧要等待其他帧解码出来后才知道这个B帧是 多少。
I、B、P帧主要是为了更拼命努力压缩空间的。

4、rtmp协议
rtmp协议详细内容
rtmp协议详细内容2
绝大多数的流媒体推流都会采用rtmp协议的。

5、flv格式
flv格式解析
文件推流时候有的格式不支持,是因为服务器那边解析不了这种格式。想推流特殊的格式可以在服务器里面添加特殊文件的解析。

extern "C"
{#include "libavformat/avformat.h"
#include "libavutil/time.h"
}
#include <iostream>
using namespace std;
#pragma comment(lib,"avformat.lib")
#pragma comment(lib,"avutil.lib")
#pragma comment(lib,"avcodec.lib")int XError(int errNum)
{char buf[1024] = { 0 };av_strerror(errNum, buf, sizeof(buf));cout << buf << endl;getchar();return -1;
}
static double r2d(AVRational r)
{return r.num == 0 || r.den == 0 ? 0. : (double)r.num / (double)r.den;
}int main(int argc, char *argv[])
{char *inUrl = "test.flv";char *outUrl = "rtmp://192.168.1.102/live";//初始化所有封装和解封装 flv mp4 mov mp3av_register_all();//初始化网络库avformat_network_init();////输入流 1 打开文件,解封装//输入封装上下文AVFormatContext *ictx = NULL;//打开文件,解封文件头int re = avformat_open_input(&ictx, inUrl, 0, 0);if (re != 0){return XError(re);}cout << "open file " << inUrl << " Success." << endl;//获取音频视频流信息 ,h264 flvre = avformat_find_stream_info(ictx, 0);if (re != 0){return XError(re);}av_dump_format(ictx, 0, inUrl, 0);//////输出流 //创建输出流上下文AVFormatContext *octx = NULL;re = avformat_alloc_output_context2(&octx, 0, "flv", outUrl);if (!octx){return XError(re);}cout << "octx create success!" << endl;//配置输出流//遍历输入的AVStreamfor (int i = 0; i < ictx->nb_streams; i++){//创建输出流AVStream *out = avformat_new_stream(octx, ictx->streams[i]->codec->codec);if (!out){return XError(0);}//复制配置信息,同于MP4//re = avcodec_copy_context(out->codec, ictx->streams[i]->codec);re = avcodec_parameters_copy(out->codecpar, ictx->streams[i]->codecpar);out->codec->codec_tag = 0;}av_dump_format(octx, 0, outUrl, 1);////rtmp推流//打开iore = avio_open(&octx->pb, outUrl, AVIO_FLAG_WRITE);if (!octx->pb){return XError(re);}//写入头信息re = avformat_write_header(octx, 0);if (re < 0){return XError(re);}cout << "avformat_write_header " << re << endl;AVPacket pkt;long long startTime = av_gettime();for (;;){re = av_read_frame(ictx, &pkt);if (re != 0){break;}cout << pkt.pts << " " << flush;//计算转换pts dtsAVRational itime = ictx->streams[pkt.stream_index]->time_base;AVRational otime = octx->streams[pkt.stream_index]->time_base;pkt.pts = av_rescale_q_rnd(pkt.pts, itime, otime, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_NEAR_INF));pkt.dts = av_rescale_q_rnd(pkt.dts, itime, otime, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_NEAR_INF));pkt.duration = av_rescale_q_rnd(pkt.duration, itime, otime, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_NEAR_INF));pkt.pos = -1;//视频帧推送速度if (ictx->streams[pkt.stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){AVRational tb = ictx->streams[pkt.stream_index]->time_base;//已经过去的时间long long now = av_gettime() - startTime;long long pts = 0;pts = pkt.pts * (1000 * 1000 * r2d(tb));if (pts > now)av_usleep(pts - now);}re = av_interleaved_write_frame(octx, &pkt);if (re<0){return XError(re);}}cout << "file to rtmp test" << endl;getchar();return 0;
}

------ 上面例子使用版本是:ffmpeg version 3.2.4 Copyright © 2000-2017 the FFmpeg developers

ffmpeg 推流FLV文件,采用rtmp协议相关推荐

  1. 开源ckplayer 网页播放器, 跨平台 html5 mobile ,flv f4v mp4 rtmp协议

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 开源ck ...

  2. 开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !

    开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 ! 博客分类: Javascript /Jque ...

  3. ffmpeg 推流 flv

    //打开格式进行解封装 1.avformat_open_input( AVFormatContext **ps, //打开文件的上下文 const char *url,//文件的路径 AVInputF ...

  4. 开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !...

    CKplayer,其全称为超酷flv播放器,它是一款用于网页上播放视频的软件,支持的格式有:http协议上的flv,f4v,mp4格式,同时支持rtmp视频流格 式播放,此播放器的特点在于用户可以自己 ...

  5. Android 音视频深入 十五 FFmpeg 推流mp4文件(附源码下载)

    源码地址 https://github.com/979451341/Rtmp 1.配置RTMP服务器 这个我不多说贴两个博客分别是在mac和windows环境上的,大家跟着弄 MAC搭建RTMP服务器 ...

  6. 【流媒体服务】本地视频推流、转码、拉流、直播综合应用(五):【1】VLC+FFMPEG+Nginx实现RTSP到RTMP网页直播

    文章目录 前言 一.前几章节回顾 二.操作步骤 1.准备本地视频 2.VLC:获取RTSP视频流 3.FFMPEG:转码推流服务准备 4.Nginx:网站服务准备 5.FFMPEG推流:rtsp转rt ...

  7. RTMP协议深度解析:从原理到实践,掌握实时流媒体传输技术

    目录标题 1. 引言 1.1 流媒体传输技术的重要性 1.2 为什么选择RTMP协议 1.3 RTMP协议的发展与应用 2. RTMP协议基础 2.1 RTMP协议简介 2.2 RTMP协议与其他流媒 ...

  8. 流媒体-RTMP协议-rtmpdump-flv封装解析(一)

    流媒体-RTMP协议-rtmpdump-flv封装解析(一) 流媒体-RTMP协议-librtmp库学习(二) 流媒体-RTMP协议-librtmp库学习-c++多线程实现rtmp推流flv文件(三) ...

  9. HLS,HTTP,RTSP,RTMP协议的区别

    HLS,HTTP,RTSP,RTMP协议的区别: 用HTTP方式: 先通过服务器将FLV下载到本地缓存,然后再通过NetConnection的本地连接来播放这个FLV,这种方法是播放本地的视频,并不是 ...

  10. (保姆级)利用ffmpeg将flv批量转mp4

    文章目录 1. 下载ffmpeg 2. 安装ffmpeg 3. flv转mp4 4. 批量转换 1. 下载ffmpeg 进入ffmpeg官网,选择需要的版本进行下载: 以windows为例,点击下图红 ...

最新文章

  1. 决策树 随机森林 xgboost_决策树算法之随机森林
  2. HDU2041超级楼梯
  3. 变量four赋值数字python_跟老齐学Python之赋值,简单也不简单
  4. 分布式事务两阶段提交
  5. 训练过程acc_AI 深度学习训练tricks总结(均有实验支撑)
  6. ffmpeg 参数_使用FFMPEG进行视频转码
  7. centeros安装mysql_CenterOS上安装MySQL具体步骤
  8. AMD GPU 系列版本信息
  9. android provision apk 分析
  10. 【java实现控制台打印表格】
  11. 三点运算符(三点语法)
  12. android打开蓝牙设置界面,Android 点击跳转到蓝牙设置界面
  13. 26.gateway的IP 认证拦截,gateway做token验证 流程图(springcloud)
  14. 波兰式与逆波兰式的转换和表达式求值
  15. 获取token(/oauth/token)
  16. 华为机试:DNA序列
  17. 揭秘 Google 成长史:荒诞梦想的副产品
  18. Floyd算法的应用
  19. python脚本之批量查询网站权重2.0
  20. MQ消息队列的使用场景

热门文章

  1. windows下工具
  2. ubuntu下安装配置java8
  3. c语言必背的100代码
  4. python可视化编程软件下载_mPython-mPython(图形化编程软件)下载 v0.5.0官方版-下载啦...
  5. html5获取坐标高德,高德地图坐标的获取( JavaScript API )
  6. 猿编程python代码_猿编程怎么练习编程 让你提前熟悉代码
  7. KeyRaider:迄今最大规模的苹果账号泄露事件
  8. c语言 倒计时不清屏_c语言 清屏函数
  9. 88se9230 linux raid,Gen10磁盘控制器Marvell 88SE9230阵列RAID设置方法教程图文
  10. JS无限弹窗代码实现