【孙彤 源码资本】【xrun源码】【evexpress源码】rtsp录制源码

1.ZLMediaKit 服务器源码解读---RTSP推流拉流
2.FFMPEG音视频同步-音频实时采集编码封装成MP4
3.从零开始写一个RTSP服务器(五)RTP传输AAC
4.音视频开源项目ZLMediaKit 的录制安装及使用介绍
5.2024年 C++音视频开发学习路线(ffmpeg/rtsp/srs/webrtc/hls)
6.解决FFmpeg播放RTSP推送的H265码流报错问题

rtsp录制源码

ZLMediaKit 服务器源码解读---RTSP推流拉流

       RTSP推流与拉流在ZLMediaKit服务器源码中有着清晰的解析过程和处理逻辑。数据解析通过回调到达RtspSession类的源码onRecv函数,进而进行分包处理,录制头部数据与内容分离。源码根据头部信息判断数据包类型,录制rtp包与rtsp包分别由onRtpPacket和onWholeRtspPacket函数处理。源码孙彤 源码资本

       RTSP处理过程中,录制解析出的源码交互命令被分发至不同的处理函数。对于rtp包处理,录制数据封装成rtp包后,源码执行onBeforeRtpSorted函数进行排序,录制排序后的源码数据放入缓存map,最终回调到RtspSession的录制onRtpSorted函数。这里,源码回调数据进入RtspMediaSourceImp成员变量,录制该变量指向RtspDemuxer解复用器,用于H等视频格式的解复用。

       在H解复用器中,rtp包经过一系列处理后,由HRtpDecoder类的decodeRtp函数转化为H帧数据,最终通过RtpCodec::inputFrame函数分发至代理类。代理类在处理H帧数据时,分包并添加必要参数(如pps、sps信息),xrun源码然后通过map对象将数据传递给多个接收者。

       处理完H帧后,数据将流转至编码阶段。在RtspMediaSourceImp中,H帧数据被传递至MultiMediaSourceMuxer编码类。在编码过程中,数据通过RtspMuxer的inputFrame接口进入编码器HRtpEncoder,最后被打包成rtp包,准备分发。

       总结而言,RTSP推流过程主要包含数据解析、视频解复用与编码三个关键步骤。在拉流阶段,通过鉴权成功后获取推流媒体源,利用play reader从缓存中取出rtp包并发送给客户端。

FFMPEG音视频同步-音频实时采集编码封装成MP4

       音视频同步录制相关文章

       1、 ffmpeg-摄像头采集保存

       2、 ffmpeg音视频同步-摄像头采集编码封装

       3、 ffmpeg-音频正弦产生并编码封装

       4、 ffmpeg-音频实时采集保存

       5、 ffmpeg音视频同步-音频实时采集编码封装

       6、 ffmpeg音视频同步-音视频实时采集编码封装

       7、 ffmpeg音视频同步-音视频实时采集编码推流

       8、evexpress源码 ffmpeg音视频同步-音视频实时采集编码推流-优化版本

       系统环境:

       系统版本:lubuntu .

       Ffmpge版本:ffmpeg version N--g

       摄像头:1.3M HD WebCan

       虚拟机:Oracle VM VirtualBox 5.2.

       指令查看设备 ffmpeg -devices

       指令播放实时音频 ffplay -f alsa -showmode 1 -ac 2 -i default -ar

       Linux使用ffplay实时采集音频并实时播放_唐传林的博客-CSDN博客

       指令录制实时音频ffmpeg -f alsa -ar -i hw:0,0 audio.wav

       ffmpeg -f alsa -ar -i default ffmpeg_record_audio.wav

       ubuntu下用ffmpeg录制音频文件_ubuntu使用指令录制mp3音频_dingjianfeng的博客-CSDN博客

       指令分离音视频:ffmpeg -i test.mp4 -vn -y -acodec copy test.aac

       ffmpeg -i test.mp4 -vn -y -avcodec copy test.h

       本章文档基于ubuntu alsa格式。实时采集音频一帧数据并将其转化为pcm,编码成AAC,封装成mp4保存下来

       1.简介

       FFmpeg中有一个和多媒体设备交互的类库:Libavdevice。使用这个库可以读取电脑(或者其他设备上)的多媒体设备的数据,或者输出数据到指定的多媒体设备上。

       ffmpeg中的音频相关内容

       ffmpeg中AVPacket中可能会含有多个音频帧(AVFrame),一个音频帧含有多个采样,采样率决定了1s有多少个采样(或者说一个音频帧可以播放多久)。对于aac,一帧有个采样,mp3一帧则固定为个字节。

       对于音频,由于有多声道的音频,那么音频解码出来的数据不同声道也储存在不同的指针,如data[0]是左声道,data[1]是右声道,由于各个声道的数据长度是一样的,所以linesize[0]就代表了所有声道数据的长度。

       成员extended_data则指向了data,是一个拓展,上面可以看到data 是包含8个指针的数组,也就是说对于音频,最多只支持8个声道

       如果是以下格式:

       只能保存再AVFrame的uint8_t *data[0]; 音频保持格式如下: LRLRLR。。。。

       如果是哈勃源码以下格式

       plane 0: LLLLLLLLLLLLLLLLLLLLLLLLLL…

       plane 1: RRRRRRRRRRRRRRRRRRRR…

       plane 0对于uint8_t *data[0];

       plane 1对于uint8_t *data[1];

       相关学习资料推荐,点击下方链接免费报名,先码住不迷路~

       音视频免费学习地址:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

       免费分享音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击 加群免费领取~

       2.源码

       最简单的基于Libavdevice的摄像头数据读取一帧帧pcm数据,经过音频重采样获取目标AAC的音频源数据参数,保存成MP4文件

       3.验证

       3.1编译

       3.2结果

       使用软件mp4打开test.mp4,可以听到实时采集的音频

       3.3存在的问题

       1、本文档源码,采集ALSA获取的源数据是K,stereo声道,采样大小,经转换成pcm的格式,同样是K,stereo声道大小;不同的采样率会出现部分声音数据丢失,具体原因,在 《ffmpeg-音频实时采集保存》具体分析 ,涉及其他分辨率转换,不在本文讨论范围里。

       2、由于本例程没有没有对ALSA音频进行重采样,(采样率,个采样点,双声道,源码要钱bit),故若保存成ts,flv等封装格式是,默认采用的音频编码格式分别是mpga,mp3,其采样点为。所以运行此程序会有问题,数据无法写入。而且目前暂不探讨音频重采样问题。故想到一种解决方法是,指定AAC音频编码格式(ts,mp4等都支持AAC音频编码,参考《ffmpeg-摄像头采集编码封装》的表格)。

       4.附件

       无

       5.参考链接

       [1] ffmpeg之PCM转AAC

       FFmpeg()PCM编码AAC_pkt.data 就是pcm吗_mengzhengjie的博客-CSDN博客

       [2]官方Encode pcm file to aac

       [FFmpeg-user] Encode pcm file to aac

       [3]PCM编码AAC,参考其普通PCM格式与AAC转格式差异 FFmpeg()PCM编码AAC_pkt.data 就是pcm吗_mengzhengjie的博客-CSDN博客

       [4] 音频编码(一)--FFmpeg编码-腾讯云开发者社区-腾讯云

       原文链接: FFMPEG音视频同步-音频实时采集编码封装成MP4_qinyi_style的博客-CSDN博客

从零开始写一个RTSP服务器(五)RTP传输AAC

       本文目标:实现通过VLC播放SDP文件并听到AAC音频。

       1. RTP封装与发送

       虽然前面已介绍过,但为了回顾,这里再次提及。RTP数据包由头部和载荷组成,我们构建了一个结构体来代表RTP头部,并创建了发送包的函数。RTP头部的细节请参考之前关于RTSP协议的文章。

       下面是RTP包和发送函数的实现,其中使用htons函数来确保网络字节序(大端模式)的正确性:

       rtp.h 和 rtp.c 文件在此部分频繁使用。

       2. AAC RTP打包

       AAC音频以ADTS帧的形式存在,每个ADTS帧有特定的7字节头部,包含了帧大小信息。将AAC帧的头部和数据分开,仅保留AAC数据部分,每帧打包成一个RTP包。RTP载荷前四个字节有特殊含义,后面是AAC数据,大小在第三个和第四个字节中用位表示。

       3. AAC SDP媒体描述

       媒体描述的SDP格式包括"M="行,指定音频类型、端口、传输协议和负载类型。例如,`m=audio RTP/AVP `,表示音频流使用号负载类型(AAC)。详细SDP内容可参考RTSP协议讲解。

       4. 测试与操作

       将源代码(rtp.c、rtp.h 和 rtp_aac.c)与sdp文件(rtp_aac.sdp) 保存,使用test.aac作为音频源。编译并运行程序,确保运行时的IP地址与SDP中指定的目标地址一致,然后通过VLC加载SDP文件,即可听到音频。后续文章将介绍如何构建完整的AAC RTSP发送服务器。

音视频开源项目ZLMediaKit 的安装及使用介绍

       ZLMediaKit是一个功能强大的开源流媒体服务器,特别适合实时音视频传输和处理应用,如直播、视频会议和监控。它支持RTSP、RTMP、HLS和HTTP-FLV等协议,具有低延迟和高并发处理能力,且能动态转码,并跨平台运行。

       要开始使用,首先从GitHub地址github.com/xia-chu/ZLMe...下载源代码。编译安装步骤适用于Linux环境,运行时可通过其HTTP API进行管理。API接口包括控制流媒体播放、获取状态信息、统计信息,以及配置服务器参数等,如:

       启动/停止流媒体:通过发送HTTP请求来控制。

       查看状态和统计:获取服务器连接数、流状态和带宽使用情况等。

       配置参数:如设置网络端口、转码设置和录制选项。

       录制与截图:支持控制服务器的录制和截图功能。

       实时监控:通过HTTP API监控服务器运行和日志。

       此外,HTTP API还支持通过UDP或TCP进行推流,例如循环播放视频,对于点播,ZLMediaKit支持通过mp4文件实现,例如rtsp://.../record/test.mp4,通过HTTP访问文件进行点播。

       在Linux下,音频设备的管理也很关键,可以使用aplay、pactl等命令查看和配置音频设备。而服务的推拉流,包括设备向服务器推流和从服务器拉流,也是通过API和相应的命令来操作的。

       最后,当遇到端口占用问题时,可以使用lsof和netstat命令在Linux中查找占用情况,以便进行相应的操作。ZLMediaKit的详细文档和更多视频教程可以在mirrors/xia-chu/zlmediakit/GitCode中找到。

年 C++音视频开发学习路线(ffmpeg/rtsp/srs/webrtc/hls)

       音视频工作领域繁复多样,自学时易陷入迷茫。本文整理出九个前景不错的方向:直播、传输、算法、视频播放器、流媒体后端、短视频、音频播放、视频编辑、图像处理。以下为详细学习路线:

       音视频基础

音频基础知识

视频基础知识

解复用基础知识

FFmpeg开发环境搭建

音视频开发常用工具

       FFmpeg实战教程

FFmpeg命令

SDL跨平台

FFmpeg基石精讲

FFmpeg过滤器

FFmpeg音视频解复用+解码

ffplay播放器

FFmpeg音视频编码+复用合成视频

ffmpeg多媒体

FFmpeg+ QT播放器

       流媒体客户端

RTMP推拉流项目实战

RTSP流媒体实战

HLS拉流分析

       流媒体服务器

SRS源码剖析协程

ZLMediaKit源码剖析

       WebRTC项目实战

WebRTC中级开发实践指南

WebRTC高级开发-SRS 4.0/5.0源码分析

WebRTC高级开发-MESH模型多人通话

WebRTC高级开发-Janus SFU模型多人通话

       Android NDK

Android NDK开发基础

Android FFmpeg编译和应用

Android RTMP推拉流

Android Ijkplayer源码分析

       iOS音视频开发

iOS FFmpeg 6.0编译和应用

iOS FFmpeg RTMP推拉流

VideoToolbox硬件编解码

iOS jkplayer编译和应用

iOS ijkplayer编译和应用

       音视频项目实战

       相关开源网站与地址

       本文涵盖音视频全栈开发技术,适合各类技术人员。

解决FFmpeg播放RTSP推送的H码流报错问题

       RTSP,实时流传输协议,常用于传输视频流。许多流媒体平台,如B站的ijkplayer,都是基于FFmpeg的FFplay内核。我曾分享过关于使用RTSP推送H码流的文章,包括本地拉流和编码时的推流显示。然而,当尝试使用FFplay处理RTSP推送的H码流时,遇到了报错"illegaltemporal ID in RTP/HEVC packet"。

       这个错误提示指向了H的NALU Header中的temporal ID问题。FFmpeg的源码检查了这个值,如果为0,会报错。H标准规定temporal ID不能为0,因此这个检查是合理的。问题可能出在RTP封装过程,而非原始码流,因为本地H码流的NALU Header值并不是0。

       为了解决这个问题,我深入研究了RTP封装H裸流的原理,发现在HSource.cpp的HandleFrame函数中,处理NALU数据时忽略了起始码。修正这一逻辑后,成功用FFplay播放了RTSP推送的H视频,尽管与VLC的播放效果相比稍有卡顿。FFplay播放的命令行参数包括指定窗口名称和分辨率。

       总结来说,通过问题定位和源码解析,我解决了FFplay在处理RTSP H码流时的报错,实现了本地H视频的正确播放。这个过程对理解FFmpeg工作原理和RTSP封装有帮助。

更多内容请点击【时尚】专栏

精彩资讯