FFmpeg 开发(13):Android FFmpeg 流媒体边播放边录制功能

该文章首发于微信群众号:字节活动

FFmpeg 开发系列连载:

  • FFmpeg 开发(01):FFmpeg 编译和集成

  • FFmpeg 开发(02):FFmpeg + ANativeWindow 结束视频解码播映

  • FFmpeg 开发(03):FFmpeg + OpenSLES 结束音频解码播映

  • FFFmpegFmpeg 开发(04):FFmpeg + OpenGLES 结束音频可视化播映

  • FFmpeg 开发(05):FFmpeg + OpenGLES 结束视频解码播映和视频滤镜

  • FFmffmpeg羞耻柱事情peg 开发(06):FFmpeg 播映器结束音视频同步的三种方法

  • FFmpeg 开发(07):FFmpeg + OpenGLES 结束 3D 全景播映器

  • FFmpeg 开发(08):FFmpeg 播映器视频烘托优化

  • FFmpeg 开发(09):FFmpeg、x264 以及 fdk-aac 编译整合https域名

  • FFmpeg 开发(10):FFmandroid/yunospeg 视频录制 – 视频增加滤镜和编码

  • FFmpeg 开发(11):FFmpeg + Android AudioRecorder 音频录制编码

  • FFmpeg 开发(12):Android FFmpeg 结束带滤镜的微信小视频录制功用

前面 FFmpffmpeg装置eg 系列https域名的文章中,现已结束了音视频的播映、录制现已增加滤镜等功用,本文将用 FFmpeg 结束流媒体的边播映边录制功用。

FFmpeg 开发(13):Android FFmpeg 流媒体边播映边录制功用

流媒体

流媒体(英语:Streaming media)是指将一连串的多媒体资料紧缩后,通过互联网分段发送资料,在互联网上即时传输影音Android以供欣赏的一种技能与过程,此技能使得资料数据包得以像流水相同发送,假如不运用此技能,就必须在运https安全问题用前下载整个媒体文件。

流媒体在httpclient播映前并不下载整个文件,只将初步部分内容存入https和http的差异内存,流式媒体的数据流ffmpeg羞耻柱事情随时传送随时播映,只是在初步时https和http的差异有一些延迟。

流媒体结束的要害技能就是流式传输,HTTP流式传输分为:实时流和次序流。

次序流传输是次序下载,不才载文件的一起用户可观看在线媒体,在给定时刻,用户只能观看已下载的那部分,而不能跳到还未下载的前头部分,在传输期间不依据用户联接的速度对下载次序做调整。

实时流传输指确保媒体信号带宽与网络联接匹配,使媒体可被实时观看到,实时流式传输依据网络情况调整输出音视频的质量然后结束媒http://www.baidu.com体的持续的实时传送,用户可快进或撤退以观看前面或后边的内容。

FFmpeg 播映流媒体

FFmpeg 中对影音数据的处理,能够划分为协议层、容器层、编码层与原始数据层四ffmpeg兼并视频个层次:

协议层:供给网络协议收发功用android下载装置,能够接收或推送含封装格局的媒体流。

协议层由 libavformat 库及第三方库(如 librtmp)供给支撑。

容器层:处理各种封装格局 (MP4,FLV 等)。容器层由 libavformat 库供给支撑。

编码层:处理音视频编码及解码。 编码层由各种丰富的编解码器(libavcodec 库及第三方编解码库(如 libx264))供给支撑。

原始数据层:处理未编码的原始音视频帧。

FFmpeg 中 libahttps和http的差异vformat 库供给了丰富的协议处理及封装格局处理功用,在翻开输入/输出时,FFmpeg 会依据 输入 URL / 输出 URL 探测输入/输出格局,选择适宜的协议和封装格局。

例如,假如输出 URL 是 “rtmp://1https和http的差异22.125.10.22/live”,那么 FFmpeg 翻开输出时,会确认运用httpclient rtmp 协议,封装格ffmpeg从入门到通晓式为 flv。

FFmpeg 中翻开输入/输出的内部处理细节用户不用重视,不同之处首要在于输ffmpeg教程入/输出 URL 方法不android是什么手机牌子同,若 URL 带着 “rtmp://”、”rpt://”、”udffmpeg兼并视频p://”等前缀,则标明触及流处理;否则,处理的是本地http 500文件。

因为 FFmpeg 对不同的传输协议进行了封装,运android手机用 FFmpeg 播映流媒体和播映本地文件,流程上没有差异(针对 FFmpeg 4.2.2 以上版别)。

FFmpeg 开发(13):Android FFmpeg 流媒体边播映边录制功用

FFmpeg 边播映边录制

FFgithub下载mpeg 边播映边录制有两种结束方法:

  • 在解复用时获取到编码数据包,然后从头复用打包httpwatch;
  • 在解码后获取到原始数据,然后对原始数据处理(如增加滤镜),终究对处理后的数据进行编码打包。

本文采用对解码后的原始数据进行从头编码的方法,完ffmpeg是什么意思结边播映边录制。

视频录制,这里咱们能够直接运用在前文 FFmpeg 视频录制中界说的类,发起录制之后,只需要不断往ffmpeg陈述输出mp4时出现问题里边塞视频帧即可。

class SingleVideoRecorder {
public:
SingleVideoRecorder(cHTTPSonst char* outUrl, int frameWffmpeg安卓版本下载idth, int framgithub中文社区eHeight, lhttps协议ong bitRate, int fps);
~SingleVideoRecorder();
//初步录制
int StartRecord();
//接https域名收视频数据
int OnFrame2Encode(VideoFrame *inpuhttps安全问题tFrame);
//间断录制
iandroid手机nt StopRecord();
private:
...
};

然后在解码http 404类中进行录制。

/**
*
* Created by 群众号:字节活动 on 2021ffmpeg是什么意思/3/16.
* https://github.com/githubhagithub下载ohao/LearnFFmpeg
* 最新文章首发于群众号:字节活动,有疑问或许技能交流能够增加微信 Byte-Flow ,收取视频教程, 拉你进技能交流群
*
* */
#include "VideoDecoder.h"
void VideohttpclientDecoder::OnDecodhttpclienterReady() {
LOGCATE("VideoDecoder::OnDAndroidecogithub永久回家地址derReady");
m_VideoWidth = GetCodecContext()->width;
m_VideoHeight = GetCodecContext()-&https和http的差异gt;height;
ifHTTPS(m_VideoRender != nullptr) {
int dstSize[2] = {0};
m_VideoRender-&gthttp://192.168.1.1登录;Init(m_VideoWidth, m_VideoHeight, dstSize);
m_RenderWidth = dstSizhttp 500e[0];
m_Rffmpeg羞耻柱事情enderHeight = dstSize[1];
//初始化
int fps = 25android平板电脑价格;
long videoBiandroid平板电脑价格tRate = m_RenderWidth * m_RenderHeight * fps * 0.2;
m_pVideoRecorder = new SingleVideoRecorder("/sdcard/learnffmpeg_output.mp4", m_RenderWidth, m_RenderHeight, videoBitRate, fps);
//github直播渠道永久回家初步录制
m_pVideoRecorder-android下载装置>StartRecord();
} else {
LOGCATE("VideoDecoder::OnDecoderReady m_VideoRender == null");
}
}
void VideoDecoder:ffmpeg教程:OnDecoderDone() {
LOGCATE("Viandroid的drawable类deoDecodHTTPSer::OnDecoffmpeg教程derDone");
if(m_VideoRender)
m_VideoRender->UnInit();
//视频播映结束,间断录制
if(m_pVideoRecorder != nullptr) {
m_pVideoRecorder->StopRecord();
delete mgithub永久回家地址_pVideoRecffmpeg陈述输出mp4时出现问题order;
m_pVideoRecorder = nullptr;
}
}
void VideoDecoder::github中文社区OnFrameAvaHTTPilable(AVFrame *frame) {
LOhttps域名GCATE("VideoDecoder::OnFrameAvailable frame=%httpwatchp", frame);
if(m_VideoRender != nullptr && frame != nullptr) {
NativeImage image;
sws_scale(m_SwsContext, frandroidstudio装置教程ame->data, frame->android是什么手机牌子linesize, 0,
m_VideoHeight, m_RGBAFrame-&gtandroid什么意思;data, m_RGBAFrame->linesize);
image.format = IMAGE_FORMAT_RGBA;
image.width = m_RenderWidth;
image.hFFmpegeight = m_RenderHeight;
image.pphttps协议Plffmpeg教程ane[0] = m_RGBAFrame->dataFFmpeg[0];
image.pLineSize[0] = image.width * 4HTTPS;
m_VideoRender->RenderViffmpeg是什么意思deoFffmpeg是什么意思rame(&image);github怎么下载文件
//不断塞视频帧
if(m_pVideoRecorder != nullptr) {
m_pVideoRecorder->OnFragithub永久回家地址me2https和http的差异EncFFmpegode(&image);
}
}
}

完好的结束代码能够参看项目:

htandroid下载装置tps://github.com/githubhaohao/Leagithub永久回家地址rnFFmpeg

参看文章

zh.wikipedia.org/wiki/%E6%B5…

zhuanlan.zhihu.com/p/29567587

wwffmpeg兼并视频w.cnbFFmpeglogs.com/leisurgithub直播渠道永久回家e_chn…

结束代码途径

LearnFFmpeg

技能交流

技能交流/获取视频教程能够增加我的微信:Byte-Flow