![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
音视频
文章平均质量分 84
CodeOfCC
c++ 音视频开发
展开
-
Flutter 使用ffigen生成ffmpeg的dart接口
前面几章介绍了flutter各种视频渲染的方法,视频渲染前显然是需要先获取视频流并解码,这些操作就需要用到ffmpeg,前面的几章的解码都是通过c语言调用ffmpeg,再将数据传输到dart渲染的。本章将提供一种生成ffmpeg dart接口的方法,直接用dart就可以调用ffmpeg进行拉流并解码然后显示。原创 2024-06-08 12:09:39 · 1387 阅读 · 1 评论 -
安卓部署ffmpeg全平台so并实现命令行调用
前面的章节实现了ffmpeg全平台so的生成,接下来的步骤就是部署以及使用了,部署so还是比较简单的,用gradle和cmake都可以部署,部署好了就可以直接使用了,如果需要c++进行封装一层,则需要链接,对cmake熟悉的话链接也是比较简单的。以上就是今天讲述的内容,ffmpeg的so部署还是比较容易的,但是命令行的调用会麻烦一些,尤其是要解决ffmpeg退出问题,在c++中比较好解决,java理论上也比较好实现,如果在dart中则会比较麻烦,因为dart的方法通常不能跨线程调用,多线程的情况会出问题。原创 2024-05-17 10:56:58 · 1190 阅读 · 0 评论 -
Shell生成支持x264的ffmpeg安卓全平台so
前两张实现了ffmpeg全平台so的生成,但是ffmpeg依赖的第三方库是需要另外编译的,所以本章将提供编译x264库并加入ffmpeg的方法。本章提供的脚本在ubuntu以及windows的wsl、msys2都适用。以上就是今天讲述的内容,生成ffmpeg安卓so其实并不难,如果熟悉交叉编译以及shell,编译起来还是比较简单的,尤其是想生成最小或者完整依赖的包,最好还是自己生成。原创 2024-05-09 09:25:57 · 930 阅读 · 0 评论 -
C# 使用waveIn实现声音采集
之前实现了《C++ 使用waveIn实现声音采集》,后来C#项目也有此功能的需求,直接调用C++封装的dll是可以的。但是wimm这种基于win32 api的库,完全可以直接用C#去调用,将依赖减少到最小。原创 2023-10-24 12:18:14 · 1342 阅读 · 0 评论 -
C# 将音频PCM数据封装成wav文件
之前实现了《C++ 将音频PCM数据封装成wav文件》,最近将其改成了C#版本。使用C#实现录音功能时还是需要写wav文件的,直接用C#实现也是比较简单的,这样可以免去了不必要的依赖。原创 2023-10-09 20:00:00 · 834 阅读 · 0 评论 -
C# 通过winmm枚举音频设备
使用C#做音频录制时需要获取音频设备信息,比如使用ffmpeg进行录制需要先获取音频设备名称,再Windows上获取音频设备的方法有不少,其中比较简单的就是使用winmm,这是一套比较旧的api但是使用方法简单,当然有个缺陷就是音频名称不能超过32个字符,超过会被截断,当然如果作为winmm的采集或播放配套使用则不会有问题。需要定义声音格式/// 声道数get;/// 采样率get;/// 位深get;以及声音设备实体/// 设备Idget;/// 设备名称get;} = "";原创 2023-10-08 16:27:43 · 913 阅读 · 0 评论 -
使用eXosip+ffmpeg、ffplay命令行实现sip客户端
使用sip做视频通话时,会遇到需要使用ip摄像头作为视频源的情况,查了资料使用pjsip通常也需要改源码。pjsip包含的功能很完整,有点过于庞大,很多功能并不需要。而且笔者有一个想法,只要有个能处理sip交互的库+音视频这块另外实现,比如和先使用ffmpeg和ffplay命令行作为音视频测试,成功后再写代码实现。本文就是测试成功的方案,真正灵活的方式还是要写代码调ffmpeg,本文更多的是提供一种实现思路。//流类型 enum StreamType {原创 2023-08-07 00:48:53 · 1961 阅读 · 0 评论 -
Flutter 使用texture_rgba_renderer实现桌面端渲染视频
前面几章介绍了flutter使用texture渲染视频的方法,但是有个问题就是在每个平台都需要写一套原生代码去创建texture,这样对于代码的维护是比较不利的。最好的方法应该是一套代码每个平台都能运行,笔者最近刚好找到了pub上对texture封装的插件,直接提供dart代码调用texture进行rgba的渲染,当然只支持桌面端,即Windows、Linux、Macos,但依然是很方便了。本文实现了Windows、Linux的视频渲染。原创 2023-07-29 22:20:31 · 1447 阅读 · 5 评论 -
Flutter Windows通过嵌入Native窗口实现渲染视频
使用flutter在Windows上渲染视频,目前掌握的至少有2种方法(第二章、第四章),但是性能都不是最佳,而且需要将数据转换成rgba才能渲染。如果能使用win32窗口,直接通过句柄渲染,那就可以达到与原生Windows渲染使用一致的效果,可以使用sdl渲染yuv,以及dxva2解码后d3d9表面直接渲染到窗口全程在gpu上操作。本文将介绍如何在flutter程序嵌入win32窗口并且渲染视频。但是需要注意的是目前的实现只支持win10及以上版本。原创 2023-07-22 01:00:49 · 1359 阅读 · 0 评论 -
使用ffmpeg和sdl实现多路音频混合播放
音频的播放通常是单例的,在进程内通常一个播放设备只能打开一次,且只支持一个写入。写播放器的时候,会遇到需要实现多开同时播放多个视频,比如视频剪辑工具的多轨道播放。这个时候就需要采用一定的方法,比如音频混合。本文将提供一种基于ffmpeg和sdl实现的音频多路混合的方法。以上就是今天要的内容了,采用ffmpeg结合sdl实现音频多路播放还是比较容易的,都有相关的接口去调用,只要设计实现整体的上层逻辑即可。原创 2023-06-06 23:25:35 · 638 阅读 · 0 评论 -
ffmpeg 将视频帧转换成jpg、png等图片
有时播放实时流的时候有截图的需求,需要将解码出来的图片保存本地或上传服务器,这时就需要将avframe中的数据编码成png、jpg等格式的图片,我们使用ffmpeg的相关编码器就可以实现功能。//解码得到的视频数据 AVFrame * frame = allocFrame(frameData , 640 , 360 , AV_PIX_FMT_YUV420P);//此方法定义在示例1中 av_frame_free(& frame);原创 2023-03-28 12:15:14 · 6003 阅读 · 0 评论 -
sdl 渲染旋转视频的方法
一般情况下播放视频时不需要旋转,但是如果是移动端录制的视频有时会出现rotate参数,且视频宽高也是互换的,如果直接渲染则会出现视频90度倒转的问题。所以渲染视频时需要获取包的metadata中的rotate参数,计算出旋转角度,按照旋转角度渲染视频才能显示正常的画面。原创 2022-12-15 01:04:08 · 1475 阅读 · 2 评论 -
使用ffmpeg实现单线程异步的视频播放器
ffplay是一个不错的播放器,是基于多线程实现的,播放视频时一般至少有4个线程:读包线程、视频解码线程、音频解码线程、视频渲染线程。如果需要多路播放时,线程不可避免的有点多,比如需要播放8路视频时则需要32个线程,这样对性能的消耗还是比较大的。于是想到用单线程实现一个播放器,经过实践发现是可行的,播放本地文件时可以做到完全单线程、播放网络流时需要一个线程实原创 2022-12-12 23:53:27 · 1832 阅读 · 2 评论 -
Flutter 使用FFI+CustomPainter实现全平台渲染视频
前面几章介绍了flutter使用texture渲染视频的方法,但是有个问题就是在每个平台都需要写一套原生代码去创建texture,这样对于代码的维护是比较不利的。最好的方法应该是一套代码每个平台都能运行,于是有了一个设想,使用c++实现跨平台的视频采集,通过ffi将数据传到dart界面,通过画布控件将图像绘制出来。最终通过测试发现能用的方案就是ffi结合CustomPainter实现视频渲染,这种方式实现的视频渲染可以做到**一套代码所有平台(除web外)都可运行**。原创 2022-11-23 00:46:38 · 2589 阅读 · 2 评论 -
c语言 将音视频时钟同步封装成通用模块
编写视频播放器时需要实现音视频的时钟同步,这个功能是不太容易实现的。虽然理论通常是知道的,但是不同过实际的调试很难写出可用的时钟同步功能。其实也是有可以参考的代码,ffplay中实现了3种同步,但实现逻辑较为复杂,比较难直接提取出来使用。笔者通过参考ffplay在自己的播放器中实现了时钟同步,参考。在实现过程中发现此功能可以做成一个通用的模块,在任何音视频播放的场景都可以使用。原创 2022-09-21 23:12:38 · 1566 阅读 · 0 评论 -
使用ffmpeg和sdl播放视频实现时钟同步
使用ffmpeg和sdl实现播放视频后,需要再实现时钟同步才能正常的播放视频,尤其是有音频的情况,我们通常需要将视频同步到音频来确保音画同步。视频的时钟同步有时是很难理解的,甚至知道了理论并不能确保实现,需要通过实践获取各种参数以及具体的实现逻辑。本文将介绍一些视频时钟同步的具体实现方式。原创 2022-08-21 14:56:33 · 1925 阅读 · 1 评论 -
使用ffmpeg解码音频sdl(pull)播放
我们上一章讲了,ffmpeg解码sdl push的方式播放音频,调用流程简单,但是实现起来还是有点难度的。接下来讲的就是使用pull的方式播放音频,pull的方式即是使用回调的方式播放音频,在打开SDL音频设备的时候传入一个回调方法,SDL内部会按照一定频率回调这个方法,我们在回调方法中往音频缓冲写数据就能够播放声音了。............原创 2022-08-11 00:12:09 · 1129 阅读 · 0 评论 -
使用ffmpeg解码音频sdl(push)播放
使用ffmpeg解码音频并使用sdl播放,网上还是有一些例子的,大多都不是特别完善,比如打开音频设备、音频重采样、使用push的方式播放音频等,都是有不少细节需要注意处理。尤其是使用push的方式播放音频,流程很简单完全可以使用单线程实现,但是队列数据长度比较难控制控制。而且有时想要快速搭建一个demo时,总是要重新编写不少代码,比较不方便,所以在这里提供一个完善的例子,可以直接拷贝拿来使用。.........原创 2022-08-07 01:17:46 · 2002 阅读 · 0 评论 -
C# wpf使用ffmpeg命令行实现录屏
上一章我们实现了截屏界面与功能,接下来可以在此基础上实现录屏功能,录屏采用ffmpeg命令行实现会方便一些,效果也是不错的,当然前提是要对Windows子进程的控制比较熟悉,做出来之后完全可以满足项目使用。........................原创 2022-08-01 21:52:40 · 3253 阅读 · 0 评论 -
使用ffmpeg解码视频渲染到sdl窗口
使用ffmpeg解码视频并渲染视频到窗口,网上是有不少例子的,但是大部分例子的细节都不是很完善,比如资源释放、flush解码缓存、多线程优化等都没有。特别是想要快速搭建一个demo时,总是要重新编写不少代码,比较不方便,所以在这里提供一个完善的例子,可以直接拷贝拿来使用。.................................原创 2022-07-22 00:04:27 · 1595 阅读 · 25 评论 -
Windows 简单渲染rgb到窗口上
有时候做音视频开发,测试一段解码程序需要渲染视频看效果,在Windows上配置sdl或者使用d3d显示视频都是比较麻烦,需要花时间实现。其实只是想快速的实现一段渲染逻辑,这时候就需要一种简单的视频渲染方法,简单易用易于拷贝。...........................原创 2022-07-18 20:33:18 · 563 阅读 · 0 评论 -
C# wpf 实现截屏框实时截屏功能
在《C# wpf 使用DockPanel实现截屏框》中我们实现了一个截屏框,接下来就要实现相应的截屏功能了。获取截屏区域然后使用GDI+截屏,在这里有些细节需要处理,比如要隐藏截屏框上的控件避免遮挡,处理不同dpi下的坐标位置。...............原创 2022-07-01 23:56:26 · 2864 阅读 · 9 评论 -
Flutter 使用Texture实现Android渲染视频
flutter渲染视频的方法有多种,比如texture、platformview、ffi,其中texture是通过flutter自己提供的一个texture对象与dart界面关联后进行渲染,很容易搜索到android和ios的相关资料,但是大部分资料不够详细,尤其是jni渲染部分基本都略过了,对于使用flutter但不熟悉安卓的情况下,是比较难搞清楚拿到通过texure拿到surface之后该怎么渲染。所以本文将说明整体的渲染流程。......原创 2022-06-29 22:34:54 · 2919 阅读 · 0 评论 -
Flutter 使用Texture实现Linux渲染视频
flutter渲染视频的方法有多种,比如texture、platformview、ffi,其中texture是通过flutter自己提供的一个texture对象与dart界面关联后进行渲染,很容易搜索到android和ios的相关资料,但是Linux上却几乎找不到任何资料。通过查看一些开源库的代码,才找到Linux上使用flutter texture的方法,在这里做一个简单的介绍。............原创 2022-06-28 21:32:26 · 2459 阅读 · 0 评论 -
Flutter 使用Texture实现Windows渲染视频
flutter渲染视频的方法有多种,比如texture、platformview、ffi,其中texture是通过flutter自己提供的一个texture对象与dart界面关联后进行渲染,很容易搜索到android和ios的相关资料,但是windows却几乎找不到。通过查看一些开源库的代码,找出了再windows使用texture渲染的方法,在这里做一个简单的介绍。..................原创 2022-06-27 22:31:15 · 3762 阅读 · 20 评论 -
Ubuntu 生成ffmpeg安卓全平台so
做安卓开发的时候,需要实现拉流渲染视频之类的功能,使用ffmpeg比较方便。但是要生成ffmpeg的安卓库是有点麻烦的,需要使用ndk的工具链以及shell。但其实如果了解Linux上编译程序库以及bash,整个生成过程还是相对容易的。............原创 2022-06-24 21:16:13 · 1039 阅读 · 0 评论 -
Windows 生成ffmpeg安卓全平台so
做安卓开发的时候,需要实现拉流渲染视频之类的功能,使用ffmpeg比较方便。但是要生成ffmpeg的安卓库是有点麻烦的,需要使用ndk的工具链以及shell。相对来说在Linux上操作是比较容易的,其实Windows上生成也不是很难,shell是基本一致的。........................原创 2022-06-23 23:42:26 · 1621 阅读 · 6 评论 -
ffplay实现自定义输入流播放
使用ffplay播放视频,有时我们只能获取到byte数据,比如Windows的嵌入资源只能拿到在内存中的视频文件数据,或者是自定义协议网络传输的视频,这个时候我们就需要实现一个流数据输入接口来进行播放了,ffmpeg的AVIOContext就支持这一功能,我们只需要对ffplay进行简单的拓展即可。.........原创 2022-06-19 22:46:29 · 539 阅读 · 0 评论 -
使用gdi实现多路视频流合并
以前用ffmpeg的滤镜实现过多路视频流合并,后来想到其实只要是图形处理库应该都能实现图像的合并,于是尝试了一下用使用gdi来实现视频流的合并,实际发现效果还可以,可以支持rgb格式的图像数据的合并,对于1080p的数据合并2路流的耗时也在可接受范围内。本文将介绍gdi如何实现视频流的合并,以及封装成对象使用。...........................原创 2022-06-10 00:06:07 · 770 阅读 · 1 评论 -
ffplay使用dxva2实现硬解渲染
ffplay本身是支持设置解码器的,比如设置h264_qsv、hevc_cuvid等就可以使用硬解功能,实际测试确实是有效的,cpu使用率也是有所下降。但是这并不是最佳的方案,在Windows上更好的方案是使用dxva2解码然后使用d3d9渲染,这种方法不仅极大降低cpu使用率、gpu使用率也有所下降、同时解码速度也比较快。但是ffplay本身是不支持使用dxva2的,所以这个时候就要我们进行拓展了。原创 2022-05-14 21:06:00 · 1854 阅读 · 0 评论 -
ffplay自定义播放器封装C#接口
因为曾经的wpf项目涉及到多种播放功能,拉流、点播、摄像头预览、音频测试、视频剪辑等,将ffplay的接口封装给C#调用实现了那些功能。最近自己新版本的播放模块也做了C#的封装,虽然现在不做C#项目了,但是留着以备不时之需。下面将对dll的接口和功能以及使用方法做一些说明。.........原创 2022-05-13 23:12:06 · 3066 阅读 · 12 评论 -
ffplay使用sonic实现倍速播放
现在的播放器通常都需要倍速播放功能,而且声音要求变速不变调。一般来说视频可以通过修改pts加速播放,音频如果通过修改采样率加速播放则会出现变调的现象,所以视频变速功能主要是实现音频的变速。音频要做到变速不变调,就要对音频数据进行一定的压缩或者拓展,我们可以使用一些音频处理库来达这种效果,比如谷歌的sonic。原创 2022-05-12 23:57:09 · 1056 阅读 · 3 评论 -
C# wpf 使用d3d渲染dxva2解码数据
使用dxva2解码渲染的方案是有的,通过句柄关联d3d对象的方式直接渲染,性能相当好,但是在wpf中显然不太合适,嵌入hwnd窗口与wpf绘制不兼容,而且对于键盘事件也会有影响,最好的方式还是使用d3d渲染,本文主要讲述如何将dxva2解码的数据不经过转换,直接渲染到wpf的image上。原创 2022-04-17 01:07:47 · 4317 阅读 · 28 评论 -
C# wpf 使用ffplay实现视频播放器
有了前面几章的视频渲染方法,再结合笔者已有的一个定制化ffplay播放器《基于ffplay改造成自定义多开播放器》,我们可以很容易的在wpf中实现一个播放器,这个播放器可以支持本地播放、摄像头播放、网络点播、rtmp和rtsp拉流。原创 2022-04-01 23:02:55 · 10595 阅读 · 17 评论 -
使用librtmp推h264、aac实时流
librtmp可以用于推rtmp流,有时候我们需要将采集的摄像头或桌面的视频数据以及麦克风的音频数据推流出去,这时候就需要使用librtmp的推流功能了,其推流流程比较简单,只是一些细节需要注意即可。原创 2022-03-06 00:45:09 · 4706 阅读 · 1 评论 -
使用mp4v2将h264和aac封装成mp4
我们通过编码得到的h264和aac数据通常需要封装成mp4文件,可以使用mp4v2实现这样的封装,封装的时候需要注意一些细节,比如读取sps、pps,判断idr、音频固定时间戳等。原创 2022-02-28 17:03:58 · 7747 阅读 · 21 评论 -
C++ 解析aac-adts的头部信息
aac的adts封装格式的音频文件是可以直接播放的,因为其内部的数据中每一帧都带有adts头部,头部包含了解码的必要信息。不像wav文件其头部的字段都是基于byte为单位,直接使用内存结构相同的实体即可直接读取,adts的头部字段是以bit为单位的,这就给解析其头部带来了一定的难度,几乎获取每个字段都需要进行位操作,一些跨byte的位还需要进行字节序的转换。本文将提供解析adts头的具体方法及实现。原创 2022-02-25 22:24:19 · 4420 阅读 · 4 评论 -
C++ 读取h264中的nalu
h264帧通常包含多个nalu,当我们需要封装为mp4的时候,就需要获取这些nalu,读取其中的sps和pps信息,以及视频帧。h264的打包格式有2种,一种是Annex-B,另一种是AVCC,本文提供Annex-B的解析方法。原创 2022-02-24 16:46:46 · 2949 阅读 · 2 评论 -
Windows使用Media Foundation采集摄像头数据
在Windows上采集摄像头的数据的方法有几种,vfw、directshow、mf。vfw过于老旧,directshow使用比较复杂,mf就是今天要讲的Media Foundation,其使用方法相对容易些,但是官方的例子略微复杂,对于想要实现简单的摄像头数据采集,并不需要那么多个对象及方法耦合在一起变成一个错综复杂的流程。本文将提供Media Foundation最简单的摄像头采集实现,在此基础上根据自己的需求慢慢添加功能显然是比改造一堆复杂的代码要容易的。原创 2022-02-16 00:41:30 · 6366 阅读 · 8 评论 -
使用mp4v2录制视频实现时钟同步
录制视频的时候,需要保证视频的声音和画面同步,通常是记录视频和音频的时间戳,让它们时间关系匹配上。而h264和aac本身不包含时间戳,只有写入mp4时才需要时间戳,本文将通过使用mp4v2作为mp4的封装工具,来说明如何实现时钟同步。原创 2022-02-10 00:04:04 · 3224 阅读 · 0 评论