1.FFMPEG音视频同步-音频实时采集编码封装成MP4
2.常见流媒体服务器方案对比分析
3.SRS流媒体服务器——单机环境搭建和源码目录介绍
4.unimrcpclient源码分析mrcp components
5.ffmpeg + cuda(cuvid) 硬解码+像素格式转换(cpu主导)实战
6.Miracast技术详解(四):Sink源码解析
FFMPEG音视频同步-音频实时采集编码封装成MP4
音视频同步录制相关文章
1、 ffmpeg-摄像头采集保存
2、 ffmpeg音视频同步-摄像头采集编码封装
3、 ffmpeg-音频正弦产生并编码封装
4、 ffmpeg-音频实时采集保存
5、 ffmpeg音视频同步-音频实时采集编码封装
6、linux tcp c 源码 ffmpeg音视频同步-音视频实时采集编码封装
7、 ffmpeg音视频同步-音视频实时采集编码推流
8、 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博客
常见流媒体服务器方案对比分析
SRS
功能和稳定性大幅提升,易于上手,提供丰富功能和集群支持。配置步骤:获取源码、编译、运行。
主要功能:集群、协议网关、CDN功能等。支持概念完整性和简单实现。提供接入方案、源码科技待遇流变换、集群特性、丰富接口、广泛应用。
EasyDarwin
由国内开源团队维护,Golang开发,支持快速构建流媒体服务平台。配置步骤:获取源码、运行。
主要功能:基于Golang、多系统平台部署、RTSP推流/拉流、服务端录像、关键帧缓存、Web后台管理、分布式负载均衡。
ZLMediaKit
高性能流媒体服务框架,支持多种协议,三大PC平台及iOS、Android两大移动端。配置步骤:获取源码、编译、运行。
主要功能:C++开发,多路复用/多线程/异步IO,海量客户端连接,全平台支持,秒开画面、极低延时,完善标准C API。
Monibuca
Go语言实现的流媒体服务器框架,采取引擎+插件方式,支持定制化功能。配置步骤:获取源码、安装monica、运行。
主要功能:优化Golang特性,控件psd源码利用goroutine合理分配资源,减少内存操作,功能强大仪表盘,直观服务器状态,纯Go编写,部署方便。
对比图表
SRS流媒体服务器——单机环境搭建和源码目录介绍
启动srs
2. 显示日志信息
3. 确认srs是否正常启动
4. 安全退出正在运行的srs
5. 默认后台启动,调试需修改配置文件为前台
相关视频推荐
SRS-RTMP-WebRTC流媒体服务器入门
全球Star第一的流媒体服务器SRS4.0 WebRTC音视频通话分析
SRS流媒体服务器架构设计及源码分析
免费FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发免费学习地址
纯干货免费分享C++音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击 加群免费领取哦~
源码目录介绍
1. trunk目录
2. src下的源码
3. app
4. core
5. kernel 音视频格式相关
6. libs
7. main
8. protocol 流媒体协议相关
9. service
. utest
. 八个目录,二百零三个文件
unimrcpclient源码分析mrcp components
配置样例包含六个部分。
函数unimrcp_client_components_load主要负责这六个组件的加载,下面详细解析各个组件的加载过程。
加载resource组件时,其结构体mrcp_resource_t定义在mrcp_resource.h,字符串使用apt_str_table_item_t(定义在mrcp_resource_loader.c),mrcp_resource_loader_t和mrcp_resource_factory_t分别位于mrcp_resource_loader.c和mrcp_resource_factory.c。构造mrcp_resource_loader内部是mrcp_resource_factory_t *factory,factory通过mrcp_resource_factory_create构建,参数为MRCP_RESOURCE_TYPE_COUNT的第5个值,整型值为4。
加载sip-uac组件时,mrcp_sofia_client_config_t结构体(mrcp_sofiasip_client_agent.c)应用于sofia sip协议栈。默认端口和名称设定如下:config->local_port = DEFAULT_SIP_PORT; 默认端口为,config->user_agent_name = DEFAULT_SOFIASIP_UA_NAME; 默认agent name为UniMRCP SofiaSIP,config->origin = DEFAULT_SDP_ORIGIN; 默认sdp origin为UniMRCPClient。IP地址配置通过unimrcp_client_ip_address_get(unimrcp_client.c)实现,可配置为“auto”或“iface”。然后使用mrcp_sofiasip_client_agent_create(mrcp_sofiasip_client_agent.c)创建sofiasip_client。
加载rtsp-uac组件时,指代MRCPv1版本的uac组件。rtsp_client_config_t结构体(mrcp_unirtsp_client_agent.h)用于配置。组件加载通过unimrcp_client_rtsp_uac_load函数完成。
加载media-engine组件时,手写源码技术配置项仅包含realtime_rate。unimrcp_client_media_engine_load函数负责加载此组件。mpf_engine_t结构体(mpf_engine.c)用于创建mpf_engine,使用mpf_engine_create函数。
加载rtp-factory组件时,mpf_rtp_config_t结构体(mpf_rtp_descriptor.h)包含可配置项。unimrcp_client_rtp_factory_load函数用于加载此组件,并通过mpf_rtp_termination_factory_create(mpf_rtp_termination_factory.c)创建相应的工厂。
ffmpeg + cuda(cuvid) 硬解码+像素格式转换(cpu主导)实战
理解并实践ffmpeg与cuda(cuvid)在硬解码及像素格式转换中的应用,需要细致地分析不同组件的功能与限制。首先,强调的是cuvid与VDPAU并非直接可相互替代的组件,其使用成本较高。
在使用cuvid进行硬解码时,需注意CUVID源代码不支持rtsp视频流数据的创建,因此无法通过rtsp地址获取视频流。相反,它支持视频文件的读取。
编译和运行过程涉及到生成raw.out文件,而文件生成的效率和CPU或GPU的使用率是评估解码性能的关键指标。在进行解码时,CPU和GPU的使用情况是衡量资源分配是否优化的重要因素。
在C++音视频开发的学习资源中,有免费分享的学习资料、视频以及路线图,内容涵盖了C/C++、Linux、FFmpeg、WebRTC、RTMP等技术,适合对音视频流媒体开发感兴趣的人士。如果对此感兴趣,可以加入相关的学习交流群以获取更多资源。
在面对具体问题时,例如GPU解码后帧的像素格式转换问题,直接在GPU中实现AV_PIX_FMT_CUDA->AV_PIX_FMT_BGR的转换面临限制。首先,尝试使用CPU进行转换(方式1),但遇到了"bad src img pointers"的问题,原因是GPU解码后的帧在系统内存中仍保持原始格式,这使得sws_scale无法直接完成转换。
接着,尝试直接在GPU上进行像素格式转换,但结果失败,原因是GPU硬件的转换限制,以及转换操作受制于特定的格式限制列表。通过GDB调试,发现目标帧的格式转换受到严格限制,不支持从AV_PIX_FMT_CUDA直接转换到AV_PIX_FMT_BGR。
最后,解决该问题的方法是通过CPU主导的方式进行像素格式转换。首先,从GPU解码得到的帧中转换为AV_PIX_FMT_NV格式,该格式支持YUV数据到RGB的转换,从而实现了从AV_PIX_FMT_CUDA到AV_PIX_FMT_BGR的完整转换过程。通过这种方式,不仅解决了GPU直接转换限制的问题,也优化了整体的解码和数据处理流程。
Miracast技术详解(四):Sink源码解析
Miracast Sink端源码最早出现在Android 4.2.2版本中,可通过android.googlesource.com查看。然而,在Android 4.3版本之后,Google移除了这部分源码,详细移除记录可在android.googlesource.com上查阅。尽管Sink端代码被移除,但Source端源码依然存在。通过使用Android手机的投射功能,仍可实现Miracast投屏发送端的功能。
为了查看源码,推荐使用Android Studio,以便利用IDE的代码提示和类/方法跳转功能。首先新建一个Native Project,将libstagefright相关源码拷贝至cpp目录,并导入必要的include头文件。在CMakeLists.txt中添加这部分源码后,同步环境,以此引用相关类与头文件,提升查看源码的效率。
Sink端核心类主要包括:WifiDisplaySink.cpp、RTPSink.cpp、TunnelRenderer.cpp。通过分析可得知,初始化操作主要在wfd.cpp中的main()方法内完成,重点关注sink->start()方法启动WifiDisplaySink,进而使用ip和端口参数执行相关操作。
RTSP通讯涉及关键步骤,包括创建RTSP TCP连接、处理连接状态与数据异步通知。当连接建立后,开始进行RTSP协商与会话建立,处理RTSP M1-M7指令。请求与响应流程需参考前面的RTSP协议分析文章,这里不详细展开。
处理RTSP消息时,首先判断消息类型,是Request还是Response。对于Request,主要处理Source端M1请求,并响应M2确认。对于Source端M3请求,处理相关属性及能力,如RTP端口号、支持的音频和视频编解码格式等。M4与M5请求则分别进行常规的响应处理。
在发送完Setup M6请求后,注册onReceiveSetupResponse()回调,用于完成RTSP最后一步,即发送PLAY M7请求。此时,Source端会按照Sink指定的UDP端口发送RTP数据包,包含音视频数据。
RTSP协商与会话建立完成后,数据流通过RTPSink处理,建立UDP连接并解析RTP数据包。在TunnelRenderer中接收并播放音视频流。流程包括消息处理、环境初始化、TS包解析、音视频裸流解码与播放等。
源码解析过程中,关键步骤包括初始化RTPSink、建立UDP连接、处理RTP与RTCP数据、解析TS包并获取音视频裸流等。移植Native Sink端难点在于隔离与处理Native相关依赖,如异步消息机制、网络连接实现等。建议在应用层实现RTSP连接、音视频解码与渲染功能,然后移植底层解析代码,以减少依赖,提高移植效率。
FFmpeg 流媒体处理 - 收流与推流
流媒体技术的定义与应用
流媒体,作为多媒体应用技术的一种,指的是通过网络进行分段传输的连续媒体数据,实现即时播放的一种技术与过程。这种技术使得数据包能像流水一样快速传输,避免了必须下载整个媒体文件的传统方式。关于流媒体的基础概念,可参考观止云的“流媒体|从入门到出家”系列文章,了解更多深入信息。
FFmpeg中的流媒体处理层次
FFmpeg在处理音视频数据时,划分了四个层次:协议层、容器层、编码层和原始数据层。协议层提供网络协议收发功能,包括libavformat库与第三方库的支持;容器层处理各种封装格式,由libavformat库提供;编码层负责音视频编码和解码,由libavcodec库与第三方编解码库支持;原始数据层处理未编码的原始音视频帧,由libavfilter库提供支持。本文提及的收流与推流功能,属于协议层的处理。
FFmpeg的协议与封装格式处理
在FFmpeg中,libavformat库提供了丰富的协议处理和封装格式处理功能。在打开输入/输出时,FFmpeg会根据URL来探测输入/输出格式,选择合适的协议和封装格式。例如,输出URL为"rtmp://..0./live"时,FFmpeg会确定使用rtmp协议,封装格式为flv。
流媒体系统中的角色
流媒体系统涉及三个主要角色:流媒体服务器、推流客户端和收流客户端。推流客户端是内容生产者,收流客户端是内容消费者。推流客户端将内容推送到流媒体服务器,收流客户端则从流媒体服务器获取内容。
收流与推流功能
当输入为网络流,输出为本地文件时,实现收流功能,即将网络流存储为本地文件;当输入为本地文件,输出为网络流时,实现推流功能,即将本地文件推送到网络;当输入和输出均为网络流时,实现转流功能,即将一个流媒体服务器上的流推送到另一个流媒体服务器。
相关视频推荐
相关视频推荐
免费学习地址
免费分享资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击加群免费领取哦~
源码与转封装例程
源码与转封装例程大部分相同,可视为转封装例程的增强版。收流代码与打开普通文件的代码无异,FFmpeg能识别流协议及封装格式,使用相应的协议层代码接收流,处理后的数据与普通文件内容一致。推流需要注意封装格式指定和流媒体服务器的处理速度。
测试与验证
测试需要搭建流媒体服务器,推荐使用nginx-rtmp服务器。搭建时,可使用docker镜像简化过程。通过配置docker服务、镜像加速、拉取nginx-rtmp镜像、打开容器、防火墙添加例外端口等步骤完成搭建。测试文件下载、ffmpeg推流、ffplay收流播放,验证服务器功能。
编译与测试
下载例程源码后,执行shell命令下载,并在源码目录执行./compile.sh生成streamer可执行文件。测试文件下载与推流、收流功能,确保系统正常运行。
遗留问题
推流和收流过程中,可能出现结束信息输出,提示程序退出。此类问题通常与系统资源或配置相关,需要根据实际情况进行排查和调整。
2024-11-29 13:181203人浏览
2024-11-29 13:172976人浏览
2024-11-29 12:24117人浏览
2024-11-29 12:032689人浏览
2024-11-29 11:501282人浏览
2024-11-29 11:391124人浏览
1.怎么查看网页源代码怎么查看网页源代码 网页源代码是指一个网页的HTML超文本标记语言)和CSS层叠样式表)代码,以及可能包含的JavaScript和其他相关的客户端代码。它是网页的原始代码,通
1.[3D游戏开发实践] Cocos Cyberpunk 源码解读-目录结构2.MMDetection3D之DETR3D源码解析:整体流程篇3.[3D游戏开发实践] Cocos Cyberpunk 源
1.idea格式化代码设置(idea的格式化)2.windows系统文件中各种扩展名分别是什么意思?3.深入分析redis之listpack,取代ziplist?idea格式化代码设置(idea的格式