今天我们开始正式进入FFmpeg的篇章,FFmpeg作为著名的开源框架,可以生成用于处理多媒体框架的库和程序,是音视频界内的圣经,市面上直播开发99%都是基于FFmpeg来开发的,这足以证明FFmpeg的强大。关于FFmpeg的源码和官方文档可以去FFmpeg下载源码和编译好的库。
闲话不多说,下面就开始今天的主要内容,FFmpeg保存网络流到本地
直播不像点播,当我们看到想看的内容时,我们不能倒退回去,但是我们可以保存直播流为本地文件,这样我们想看随时都可以。
保存网络流的流程主要有以下步骤:
第一步:注册所有的组件(编解码、滤镜特效处理库、封装格式处理库、工具库、音频采样数据格式转换库、视频像素数据格式转换等等...)
第二步:获取视频流的封装信息,查找视频和音频流的位置
第三步:查找视频和音频解码器id,根据解码器id打开解码器
第四步:创建输出流并拷贝流上下文信息
第五步:循环读取网络流,解码packet并写入本地
第六步:关闭解码器释放内存
源码
#include "stdafx.h"
#include "pch.h"
#include <string>
#include <memory>
#include <thread>
#include <iostream>
using namespace std;
AVFormatContext *inputContext = nullptr;
AVFormatContext * outputContext;
int64_t lastReadPacktTime ;
static int interrupt_cb(void *ctx)
{
int timeout = 3;
if(av_gettime() - lastReadPacktTime > timeout *1000 *1000)
{
return -1;
}
return 0;
}
int OpenInput(string inputUrl)
{
inputContext = avformat_alloc_context();
lastReadPacktTi