• 本程序ffmpeg版本是:ffmpeg version 3.2.4 Copyright © 2000-2017 the FFmpeg developers。
  • 不同ffmpeg版本会稍微有点不同,比如最明显ffmpeg 4.0和ffmpeg 3.0少了一些注册类函数(如:av_register_all())还有编解码函数方式等。
  • 本程序是经过ffmpeg 推流FLV文件,采用rtmp协议这个例子修改而来的。
  • 下面分二部分:
    一、和上面例子有那些区分;
    二、源代码分享
  • 一、和上面例子有那些区分;
    1、赋值配置信息:把avcodec_parameters_copy()替换成avcodec_copy_context()。
    2、时间基转换函数:把av_rescale_q_rnd()都替换成av_rescale_q()。
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
{av_rescale_q_rnd(a,bq,cq,AV_ROUND_NEAR_INF);
}
//av_rescale_q_rnd()和av_rescale_q()关系就是上面这段代码一样.

3、pts计算:pts = pkt.pts * (1000 * 1000 * r2d(otime));
otime是输出流,作为延迟推流使用。不延迟话,推流太快,会导致拉流播放有问题。
4、mp4的视频时间基为{1,25};flv的视频时间基为{1,1000}。因为输出推流就是使用flv,所以必须进行转换才可以正常播放和推流。
5、推流部分只是涉及到解协议、解封装的,然后一帧帧推流过去。想特殊处理比如加密,加入视频中特效等,就需要解码、过滤、编码、推流这部分的逻辑。

  • 二、源代码分享
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 = "D:/ghb/video_audio_dev/ffmpeg-udemy/FFMpeg实时美颜直播推流实战 ffmpeg,qt5,opencv/03 FFMpegSDK3529923553216442551227969/3.1第一个ffmpegVs2015项目代码包含库文件/src/3.6file_to_rtmp_控制推流速度/008_3.mp4";//char *inUrl = "D:/ghb/video_audio_dev/ffmpeg-udemy/FFMpeg实时美颜直播推流实战 ffmpeg,qt5,opencv/03 FFMpegSDK3529923553216442551227969/3.1第一个ffmpegVs2015项目代码包含库文件/src/3.6file_to_rtmp_控制推流速度/test.flv";char *outUrl = "rtmp://192.168.32.128/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);}//复制配置信息,同于MP4re = 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);printf("in code id = %d 。 out code id = %d\n", ictx->streams[0]->codecpar->codec_id, octx->streams[0]->codecpar->codec_id);printf("in code id = %d 。 out code id = %d\n", ictx->streams[1]->codecpar->codec_id, octx->streams[1]->codecpar->codec_id);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;}//计算转换pts dtsAVRational itime = ictx->streams[pkt.stream_index]->time_base;AVRational otime = octx->streams[pkt.stream_index]->time_base;       pkt.pts = av_rescale_q(pkt.pts, itime, otime);pkt.dts = av_rescale_q(pkt.dts, itime, otime);pkt.duration = av_rescale_q(pkt.duration, itime, otime);pkt.pos = -1;//视频帧推送速度if (ictx->streams[pkt.stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){//已经过去的时间long long now = av_gettime() - startTime;long long pts = 0;pts = pkt.pts * (1000 * 1000 * r2d(otime));if (pts > now){av_usleep(pts - now);cout << pts - now<<endl;}//cout << pkt.dts << "-----" << pkt.pts << endl;}re = av_interleaved_write_frame(octx, &pkt);if (re<0){return XError(re);}}cout << "file to rtmp test" << endl;getchar();return 0;
}

(上面有错误,有问题话,请多多指教,谢谢。一起学习,一起进步,加油!)

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

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

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

  2. 解决ffmpeg生成mp4文件不能正常预览的问题

    框架的使用极大的提高了开发效率,让我们能够有更多的精力去关注系统的整体架构和业务需求,而不需要过多的关注一些具体的实现细节,但任何事情都有两面性,如果某个细节出了问题,由于对具体的实现不了解,那么会给 ...

  3. 转: FFMpeg 封装MP4 文件

    FFmpeg 封装MP4文件的一个例子    项目中用到FFmpeg 将IP摄像头的视频流的保存MP4文件的.之前的大哥将它先存成了H264文件,然后又调用FFMpeg的命令行去实现转码为MP4.感觉 ...

  4. 使用ffmpeg从mp4文件中提取视频流到h264文件中

    注释: -i 2018.mp4:  是输入的MP4文件 -codec copy: 从mp4中拷贝 -bsf: h264_mp4toannexb: 从mp4拷贝到annexB封装 -f h264: 采用 ...

  5. windows使用ffmpeg将mp4文件转变成h264视频文件

    我是直接使用ffmpeg的安装包,win10下 首先下载ffmpeg http://www.ffmpeg.org/download.htmlhttp://www.ffmpeg.org/download ...

  6. FFMpeg写MP4文件例子分析

    这段时间看了FFMpeg提供的例子muxing.c,我略微修改了下源代码,使其生成一个MP4文件,音频使用AAC编码,视频使用H.264编码.代码很简单,我就不做说明了,代码如下.以后我们继续写如何将 ...

  7. LiveRTMP之MP4文件进行rtmp点播直播推送(三)

    前面已经介绍过LiveRTMP,这里不再多说,可以网上搜索相关内容. 本文讲述下基于libLiveRTMP推送库实现的MP4文件的直播推送.Demo中LiveRTMP_FILE的工程是将MP4文件进行 ...

  8. 服务器php将视频转为m3u8,php应用ffmpeg对mp4文件转换并生成m3u8视频流文件

    生成m3u8视频流,如果没有做视频流文件,播放视频的时候,一个大视频直接加载,会增加服务器巨大压力,并且视频太大加载慢,显示视频也慢,都不利于观看.那么视频流的好处是,将大视频分成一小段一小段的ts分 ...

  9. ffmpeg提取mp4文件中的音频,保存为wav文件

    如题,一个命令行即可: ffmpeg -i 123.mp4 -acodec pcm_s16le -f s16le -ac 1 -ar 16000 -f wav 123.wav 这样就生成了一个wav文 ...

  10. 利用ffmpeg转换mp4文件

    这个是我今天整理项目的时候无意发现的,当时主要是用它来转换flv文件在手机上使用,后来买了psp之后就没有用了,记录一下,以后写这种类似的程序可以参考. class VideoConverter : ...

最新文章

  1. 关于布地奈德的副作用
  2. 工作篇-佛山三水恒大-2020.10.23
  3. Spring MVC DispatcherServlet介绍
  4. SAXBuilder的介绍和使用细节
  5. JavaScript 系列笔记(一)数据类型
  6. 单片机用C语言锯齿波,试用c语言编写一个能输出锯齿波信号的单片机c51程序
  7. keytool 使用
  8. CDR插件开发之GMS插件003 - 编写你的第一个GMS插件
  9. sob攻略超详细攻略_超详细西安旅游攻略
  10. html想实现文字环绕图片,HTML/CSS实现文字环绕图片布局
  11. MAVEN工具篇——maven打包跳过测试
  12. 能够正常加入域但无法实施域策略
  13. 西安长安茶馆/金领女子书院环境怎么样?路线怎么走?
  14. 是德科技34901A支持的量程
  15. m3u8 视频提取工具(下载web中的ts文件)
  16. 在产品中,我们常说的A端/B端/C端是什么?
  17. 通信应用中数字上变频DUC与数字下变频DDC详细原理(带图)
  18. 计算机无法共享的原因,不能共享的原因
  19. SEO解析:seo优化网站外链建设的方法! ! !
  20. 【监控施工项目必备】

热门文章

  1. sqlserver 修改表字段长度
  2. android6.0 Activity(四) Surface创建
  3. Linux c/c++开发常用头文件
  4. nxlog windows安装部署
  5. 招商银行/招银网络科技面经、答案
  6. php 调用redfish,Huawei iBMC 通过redfish接口设置KVM key登录html5远程控制台操作记录
  7. 九九乘法表java代码_java怎么实现九九乘法表
  8. QT 6.3和Visual Studio 2022详细安装及配置教程
  9. 无法访问局域网的文件服务器,局域网共享文件夹不能访问
  10. python利用pyhive 连接hive