1.javaCV入门指南:序章2.JavaCV入门指南:帧抓取器(FrameGrabber)的原理与应用3.JavaCV入门指南:帧录制器/推流器(FrameRecorder)的原理与应用4.javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?5.JavaCV入门指南:调用opencv原生API和JavaCV是如何封装了opencv的图像处理操作?6.JavaCV入门指南:FrameConverter转换工具类及CanvasFrame图像预览工具类(javaCV教程完结篇)7.JavaCV入门指南之快速上手篇:快速上手视频拉流、推流、录制文件、录屏、截图和编解码复用解复用等常用音视频处理操作8.javacv开发详解之1:调用本机摄像头视频(建议使用javaCV最新版本)9.javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)10.javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG)11.javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)12.javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV-FFMPEG)13.javaCV开发详解之6:本地音频(话筒设备)和视频(摄像头)抓取、混合并推送(录制)到服务器(本地)14.javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)15.javaCV开发详解之8:转封装在rtsp转rtmp流中的应用(无须转码,更低的资源消耗)16.javaCV开发详解之9:基于gdigrab的windows屏幕画面抓取/采集(基于javacv的屏幕截屏、录屏功能)17.javaCV开发详解之10:基于dshow调用windows摄像头视频和音频,想要获取屏幕画面首选gdigrab18.javaCV开发详解之11:视频文件转gif动态图片实现,也支持摄像机、桌面屏幕、流媒体等视频源转gif19.javaCV开发详解之12:视频转apng动态图片实现,支持透明通道,也支持摄像机、桌面屏幕、流媒体等视频源转apng动态图20.javaCV开发详解之13:简单使用FFmpeg-Filter过滤器处理音视频,添加特殊效果21.javaCV开发详解之14:音频重采样22.javaCV开发详解之15:视频帧像素格式转换23.javaCV开发详解之16:使用一张图片推流和一张图片录制成视频文件24.javaCV开发详解之17:GIF和APNG动态图片推流和录制成视频文件(以gif转mp4和apng转mp4为例)25.javaCV开发详解之18:音视频转码(音频编解码和视频编解码)26.JavaCV开发详解之19:如何开启GPU硬件加速,使用JavaCV进行音视频的硬解码和硬编码(支持intel、amd和nvidia)27.JavaCV开发详解之20:如何使用JavaCV制作ico图标,图片和视频生成ico图标,视频流录制ico图标28.JavaCV开发详解之21:如何使用JavaCV接入gb28181的ps流并推流到流媒体服务和接入海康大华sdk回调h264/hevc裸流29.JavaCV开发详解之22:http-flv拉流和http-flv推流及rtmp拉流和rtmp推流实例和flv推流和flv录制,关于rtmp/flv支持h265补充说明30.JavaCV开发详解之23:hls视频录制,m3u8切片录制和fmp4切片录制详解31.JavaCV开发详解之24:使用javacv录制dash视频分片,mpeg-dash视频录制,mpd视频录制32.JavaCV开发详解之25:使用javacv保存raw视频像素格式(yuv或者rgb),并使用ffplay播放raw33.JavaCV开发详解之26:使用javacv对视频进行连续截图和覆盖截图,支持png,jpg,bmp等格式快速连续截图,适用于rtsp/rtmp/flv/hls等流媒体和本地视频快照34.JavaCV开发详解之26补充篇:视频连续截图并按日期格式生成图片文件名称,支持png,jpg,bmp等格式快速连续截图35.JavaCV开发详解之27:使用javacv把视频切割成多个视频分片文件,以mp4为例,把视频切割成MP4分片文件36.JavaCV开发详解之28:如何使用javacv进行多图推流和多图合成视频文件,以批量jpg图片推流rtmp和jpg合成flv视频文件为例37.JavaCV开发详解之29:使用javacv将多个视频拼接合成单个视频,多个音频拼接合成单个音频,以多个mp4视频合成一个mp4为例38.JavaCV开发详解之30:使用javacv拉取rtsp视频流,rtsp解复用器详解。如何把rtsp调教的服服帖帖,让rtsp拉流不再丢包39.JavaCV开发详解之31:如何计算pts/dts时间戳,在视频转码和转复用中如何自行计算pts/dts时间戳40.JavaCV开发详解之32:使用filter滤镜实现中文字符叠加41.JavaCV开发详解之33:使用filter滤镜实现动态日期时间叠加42.JavaCV开发详解之34:使用filter滤镜实现字符滚动和无限循环滚动字符叠加,跑马灯特效制作43.JavaCV开发详解之36:使用delogo滤镜实现去除和屏蔽视频水印44.JavaCV开发详解之35:使用filter滤镜实现画中画,以屏幕画面叠加摄像头画面为例45.javaCV开发详解之GIF动态图片录制补充篇:windows桌面屏幕画面录制成gif动态图片,支持桌面屏幕任意区域生成gif,可扩展支持MacOS/安卓/linux等平台,可扩展支持apng动态图片46.如何在龙芯架构和国产化操作系统平台上运行javacv47.聊聊视频中的编解码器,你所不知道的h264、h265、vp8、vp9和av1编解码库48.JavaCV音视频开发宝典:vb8和vp9编码的webm格式视频文件转成mp4文件49.JavaCV升级1.5.6之后遇到h265/hevc编码的视频无法打开编解码器avcodec_open2() error -1:Could not open video codec异常解决办法50.JavaCV更新到1.5.x版本后的依赖问题说明以及如何精简依赖包大小51.JavaCV音视频开发宝典:使用JavaCV和springBoot实现websocket-flv直播服务,无需流媒体服务,浏览器网页flv.js播放器直接播放rtsp,rtmp等实时视频52.JavaCV音视频开发宝典:无需流媒体服务也无需转码(低资源消耗),使用JavaCV和springBoot实现http-flv转封装直播服务,浏览器网页flv.js直接播放rtp、rtsp、rtmp实时视频53.JavaCV音视频开发宝典:使用JavaCV和springBoot实现http-flv直播服务,无需流媒体服务,浏览器网页flv.js转封装方式播放rtsp,rtmp和桌面投屏实时画面54.javacv开发详解补充篇:如何将rgb/bgr像素数据优雅高效的转换为BufferedImage55.javaCV开发详解之技术杂烩:javaCV能帮我们做什么?能实现什么功能?ffmpeg和openCV能实现功能,javaCV如何做到更快、更简单的实现相应的功能?等等一堆实用话题56.JavaCV音视频开发宝典:录制vp8和vp9编码的webm格式视频,以mp4转webm为例57.音视频处理、图像处理、图像识别和字符识别全能库JavaCV完整教程(包含完整JavaCV入门、JavaCV实战、ffmpeg、opencv和tesserac教程)58.JavaCV音视频开发宝典:使用JavaCV实现webm直播服务,无需流媒体服务,无需mse转封装插件(flv.js,hls.js),浏览器原生video标签直接播放rtsp,rtmp和桌面投屏直播59.JavaCV音视频开发宝典:实现Base64编码图片转换成图片文件通用转换器,以base64转png图片文件为例,其他图片格式也全部支持60.JavaCV音视频开发宝典:JavaCV读取Base64编码图片并解析预览图片61.JavaCV音视频开发宝典:使用JavaCV采集windows桌面屏幕画面并录屏mp4视频文件(FFmpeg基于dshow方式采集windows系统桌面画面)62.JavaCV音视频开发宝典:使用JavaCV采集windows系统声音并录制成mp3音频文件(FFmpeg采集windows系统声音)63.JavaCV音视频开发宝典:视频转码和转封装有什么区别?使用rtsp拉流转推到rtmp案例来讲一下转码和转封装实现的区别64.JavaCV的gpl v2许可协议排雷,写在TikTok违反GPLv2许可使用OBS源码的当下65.JavaCV音视频开发宝典:使用javacv读取GB28181、海康大华平台和网络摄像头sdk回调视频码流并转码推流rtmp流媒体服务66.JavaCV音视频开发宝典:rtsp拉流转码方式转推到rtmp67.javacv开发详解补充篇:解决转流后视频画面快进慢放,时间跳动过大,监控视频时间戳重新计算pts和dts68.JavaCV音视频开发宝典:使用JavaCV读取海康平台或海康网络摄像头sdk回调视频TS码流并解析预览图像69.JavaCV进阶opencv图像检测识别:ffmpeg视频图像画面人脸检测70.JavaCV进阶opencv图像检测识别:摄像头图像人脸检测71.javaCV文字识别之2:视频文字识别和视频提取字幕文字字符72.javaCV文字识别之1:基于google的tesserac ocr识别图片中的文字,跨平台支持英文中文简体繁体等各种字符识别73.javaCV开发详解之补充篇:根据视频时间戳同步播放图像画面以及视频倍速播放实现74.javaCV开发详解补充篇:基于avfoundation的苹果Mac和ios获取屏幕画面及录屏/截屏以及摄像头画面和音频采样获取实现75.javacpp-FFmpeg系列补充:FFmpeg拉流截图实现在线演示demo(视频截图并返回base64图像,支持jpg/png/gif/bmp等多种格式)76.javacpp-FFmpeg系列之3: 像素图像数据转换(BGR与BufferdImage互转,RGB与BufferdImage互转,BufferdImage转Base64编码)77.javacpp-FFmpeg系列补充:FFmpeg解决avformat_find_stream_info检索时间过长问题78.javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据79.javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片80.javacpp-opencv图像处理系列:国内车辆牌照检测识别系统(万份测试车牌识别准确率99.7%以上,单次平均耗时39ms)81.javacpp-opencv图像处理3:使用opencv原生方法遍历摄像头设备及调用(增加实时帧率计算方法)82.javacpp-opencv图像处理之2:实时视频添加图片水印,实现不同大小图片叠加,图像透明度控制,文字和图片双水印83.javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作84.javaCV图像处理之Frame、Mat和IplImage三者相互转换(使用openCV进行Mat和IplImage转换)85.java音视频编解码问题:16/24/32位位音频byte[]转换为小端序short[],int[],以byte[]转short[]为例86.音视频编解码问题:javaCV如何快速进行音频预处理和解复用编解码(基于javaCV-FFMPEG)
87.JavaCV实战专栏文章目录(JavaCV速查手册)88.JavaCV复杂滤镜filter特效处理入门教程和常用案例汇总89.javacv教程文档手册开发指南汇总篇90.javacv实现实时视频截图和录像服务easyCV91.JavaCV入门指南教程目录
前言:
前面我用了很多章实现了javaCV的基本操作,包括:音视频捕捉(摄像头视频捕捉和话筒音频捕捉),推流(本地音视频或者摄像头话筒混合推流到服务器),转流(rtsp->rtmp),收流(录制)。
序:
我们知道javaCV中编码需要先取到一帧采样的音频(即采样率x通道数,我们姑且把这个称为一帧采样数据)
其实我们在该篇文章http://blog.csdn.net/eguid_1/article/details/52804246中已经对音频进行转码了。
额。。这个真没看出来(PS:博主也没看出来 0_0 !)。。。。。。。。。
我们获取了本地的音频音频数据(具体啥编码博主也不晓得,只知道是16位的, - -! ,不过这不要紧,FFMPEG能我们实现,下面将会讲到 );
其中我们做了大小端序的转换和byte[]转short[](双8位转单16位),音频编解码中这个操作我们会经常用;
然后我们使用了recoder.reacordSimples(采样率,通道数,一份采样);
对比一下音频捕获的文章:http://blog.csdn.net/eguid_1/article/details/52702385
发现了吗?没错,我们给recorder设置了一些属性:
// 不可变(固定)音频比特率
recorder.setAudioOption("crf", "0");
// 最高质量
recorder.setAudioQuality(0);
// 音频比特率
recorder.setAudioBitrate(192000);
// 音频采样率
recorder.setSampleRate(44100);
// 双通道(立体声)
recorder.setAudioChannels(2);
// 音频编/解码器
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
看到了吗?我们其实已经设置了编/解码格式aac,为什么呢?因为javaCV已经封装了解复用和编码这两个操作。
补充:
补充一下javaCV底层的ffmpeg解复用/编码流程:
我们在进行recoder.reacordSimples的时候javaCV底层调用ffmpeg的swr_convert()方法(详见javaCV的FFmpegFrameRecoder类974行)进行了解码操作,完成了对pcm16le编码的解复用;
解码完成之后又调用了recorder.record(Frame frame)(详见javaCV的FFmpegFrameRecoder类994行),在这个环节完成了调用了FFMPEG的avcodec_encode_audio2()方法(详见javaCV的FFmpegFrameRecoder类1006行)按照我们已经设定好的的aac格式完成了编
码操作,所以我们本身是不需要进行解复用/编码的操作的(视频也是一样,以后会讲到),因为javaCV已经帮我门做了!
到这里肯定有些小伙伴已经5脸懵bi的状态了。。。 - -!,最不幸的是,上面一堆的前言和补充知识,我们的主题还没开始。 0_0 !
eguid唯一技术博客是csdn,博主唯一交流群是群号:371249677
(点击这里进群),欢迎大家来埋汰群主
1、java音频预处理
既然javaCV已经帮我门做了解复用和编码,那么我们只需要将获得到的音频数据进行简单的预处理即可。
注:如果是文件或者服务器直播流,那么连预处理都省了,直接设置编码格式即可,不需要我们手动做任何处理。
这里讲一下特殊的byte[]流,也就是基于socket的IO流形式的音频数据处理,一般我们使用这种的情况是移动端通过socket推流到中转服务器,让中转服务器进行转码推送到流媒体服务器。
1.1、如何从byte[]流中获取一份完整的音频帧(即一帧采样数据)
就拿 8000采样率,16bit,双通道(立体声)的pcm16le编码来说吧举例说明吧
我们知道这个音频采样率是8000,位数是16bit,2个通道,那么我们就知道这个编码的一帧就是(8000x2 )个byte
1.2、音频原始数据转换
一个byte只能表示8bit数据,我们要表示16位的音频数据就需要装换为short,一个short等于2个byte,在转换的同时进行大小端序转换(大小端序问题详见http://blog.csdn.net/eguid_1/article/details/52790848),那么我们最后得到的数据应该是一个长度是8000的short数组(即short[8000])来表示一帧音频采样数据。
音频的预处理到此完毕,接下来该javaCV出场了
2、javaCV音频解复用及编码
通过上面一大堆的前言,已经知道:音频数据直接通过recorder设置音频编码参数即可自动进行解复用和编码
只需要调用recorder.recordSamples(采样率,通道数量,一份采样数据)即可。
我的天呐,这真真是用一行代码解决了C/C++好几百行的事情!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术