【音视频】
文章平均质量分 81
音视频muxer复用、demuxer解复用、decoder解码、encoder编码、推流拉流、滤镜、混音等底层实现分析
小白兔LHao
当你的才华还撑不起你的野心时,就应该静下心来学习 - Brave Rabbit.
敢于创新,敢于迎接挑战,敢于承担责任 能够承受压力.
展开
-
Android MediaCodec加快解码和渲染处理方案及其源码分析
此处直接根据NDK实现来源码分析描述问题问题描述和原理分析:在我们直接使用MediaCodec进行解码和渲染时,一般情况下大家可以都习惯性在同一个线程中完成MediaCodec的解码和渲染,其实际我们应该拆分成两部分来处理,将解码和渲染放入不同线程完成,如此就会加快解码和渲染,其实现原理是,同一个线程中,解码和渲染将会被互相影响,而渲染是有一个Fence栅栏Buffer标记,可以简单理解为VSync屏幕刷新周期信号,若是60fps则VSync将会在16.67ms通知屏幕刷新信号一次,因此若在调用Medi原创 2021-07-31 15:05:57 · 3470 阅读 · 0 评论 -
【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】【01】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 3】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号将重新排列】onConfigure(format)实现分析:解码器配置工作,创建MediaCodec处理流程。// [frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp]...原创 2021-05-14 20:14:21 · 1367 阅读 · 2 评论 -
Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 7】【02】
承接上一章节分析:Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 7】【01】本系列文章分析的安卓源码版本:【Android 10.0 版本】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现源码分析Binder异常关闭监听:Android n原创 2021-04-22 23:38:19 · 1001 阅读 · 0 评论 -
Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 8】
承接上一章节分析:Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 7】本系列文章分析的安卓源码版本:【Android 10.0 版本】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现源码分析Binder异常关闭监听:Android nativ原创 2021-04-22 22:52:42 · 889 阅读 · 1 评论 -
Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 7】【01】
承接上一章节分析:Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 6】本系列文章分析的安卓源码版本:【Android 10.0 版本】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现源码分析Binder异常关闭监听:Android nativ原创 2021-04-21 21:26:36 · 1074 阅读 · 1 评论 -
Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 6】
承接上一章节分析:Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 1】本系列文章分析的安卓源码版本:【Android 10.0 版本】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现源码分析Binder异常关闭监听:Android nativ原创 2021-04-20 23:30:15 · 1515 阅读 · 0 评论 -
Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 2-B】
承接上一章节分析:Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 2-A】本系列文章分析的安卓源码版本:【Android 10.0 版本】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现源码分析Binder异常关闭监听:Android nat原创 2021-04-19 17:48:55 · 2498 阅读 · 1 评论 -
Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 5】
分析sCodec2InfoBuilder的buildMediaCodecList(&writer)实现分析:读取编解码器配置信息并存入writer中返回。根据前面流程中的分析可知,它的实现是在Codec2InfoBuilder.cpp中,如下其实根据下面的实现,可以看到它的实现和前面已分析的另一个Builder实现类似的处理。// [frameworks/av/media/codec2/sfplugin/Codec2InfoBuilder.cpp]status_t Codec2InfoBu原创 2021-04-19 17:11:09 · 1243 阅读 · 3 评论 -
Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 3】
OMX框架层插件化创建、注册和实现处理流程源码分析承接上一章节分析:Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 2】 TODO本系列文章分析的安卓源码版本:【Android 10.0 版本】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现原创 2021-04-18 23:36:35 · 870 阅读 · 2 评论 -
Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 2-A】
承接上一章节分析:Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 1】 TODO本系列文章分析的安卓源码版本:【Android 10.0 版本】推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析总结【通俗易懂】ALooper机制实现原理:Android native层媒体通信架构AHandler/ALooper机制实现源码分析Binder异常关闭监听:Android原创 2021-04-18 23:33:09 · 1205 阅读 · 0 评论 -
Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 1】
Android native MediaCodec编解码器模块化注册和创建处理流程本系列文章分析的安卓源码版本:【Android 10.0 版本】从【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 4】章节分析中涉及到了MediaCodec编解码器创建处理流程,因此有必要此章节单独分析编解码器创建流程,主要会涉及到OpenMAX框架的实现和交互。推荐涉及到的知识点:Binder机制实现原理:Android C++底层Binder通信机制原理分析原创 2021-04-18 23:28:51 · 2789 阅读 · 5 评论 -
【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 3】【01】
承接上一章节分析:[【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 2】](https://blog.csdn.net/u012430727/article/details/115700060)本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】6.2、mMediaClock->setPlaybackRate(mPlaybackRate)实现分析:设置播放速率(默认为1)给MediaClock原创 2021-04-15 22:24:06 · 1369 阅读 · 0 评论 -
【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 2】
承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 1】本系列文章分析的安卓源码版本:【Android 10.0 版本】【TODO 未完成】【此章节小节编号就接着上一章节排列】5、canOffloadStream(audioMeta, hasVideo, mSource->isStreaming(), streamType)实现分析:先分析mSource->isStreaming()实现:其实返回是 mIsStr原创 2021-04-14 15:33:39 · 1280 阅读 · 0 评论 -
【五】Android MediaPlayer整体架构源码分析 -【prepareAsync/prepare数据准备处理流程】【Part 4】
承接上一章节分析:【五】Android MediaPlayer整体架构源码分析 -【prepareAsync/prepare数据准备处理流程】【Part 3】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】readBuffer(trackType)方法定义实现:// [frameworks/av/media/libmediaplayerservice/nuplayer/GenericSource.cpp]void NuPlayer::Generi原创 2021-04-11 23:09:51 · 1137 阅读 · 1 评论 -
【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 1】
**start请求播放处理流程**示例代码:```cppmMediaPlayer.start();```该方法推荐在前面prepare处理流程分析中,使用异步prepareAsync执行监听prepared完成事件,然后该事件中执行start()方法即可请求开始播放。start()方法实现:由方法英文注释可知,该方法其实会执行开始播放和恢复播放两个流程,即若此前已经stopped或从未start过,那么将会从头开始播放,而若此前是paused状态,那么将会恢复上次暂停位置开始播放。原创 2021-04-11 22:56:03 · 1520 阅读 · 0 评论 -
【五】Android MediaPlayer整体架构源码分析 -【prepareAsync/prepare数据准备处理流程】【Part 3】
承接上一章节分析:【五】Android MediaPlayer整体架构源码分析 -【prepareAsync/prepare数据准备处理流程】【Part 2】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】3.5、getFormatMeta_l(false /* audio */)实现分析:获取video track信息的元数据。其实也就是通过video track对象(source)的getFormat()方法来获取video track信息的原创 2021-04-09 13:57:10 · 1257 阅读 · 7 评论 -
【五】Android MediaPlayer整体架构源码分析 -【prepareAsync/prepare数据准备处理流程】【Part 2】
承接上一章节分析:【五】Android MediaPlayer整体架构源码分析 -【prepareAsync/prepare数据准备处理流程】【Part 1】本系列文章分析的安卓源码版本:【Android 10.0 版本】【此章节小节编号就接着上一章节排列】3.2、CreateDataSourceFromIDataSource(source)实现分析:将IDataSource(BpBinder)类型数据对象封装成客户端需要的代理类对象DataSource类型// [frameworks/av/me原创 2021-04-08 23:19:28 · 1297 阅读 · 3 评论 -
Android底层音视频播放媒体提取器【MediaExtractor】的解复用模块demuxers模块化加载和注册流程实现源码分析【Part 2】
承接上一章节分析:【四】Android MediaPlayer整体架构源码分析 -【设置视频显示surface】本系列文章分析的安卓源码版本:【Android 10.0 版本】关于每个so库提取器具体如何实现GetExtractorDef方法指针,这里只列举一下高通该功能的实现,其他so库实现方式都是类似的。首先我们可以找到高通模块so库名称【libmmparserextractor】的声明mk文件:动态库创建的mk文件声明。【省略部分代码】// [vendor/qcom/proprietary/原创 2021-04-08 12:02:09 · 1527 阅读 · 2 评论 -
【五】Android MediaPlayer整体架构源码分析 -【prepareAsync/prepare数据准备处理流程】【Part 1】
承接上一章节分析:【四】Android MediaPlayer整体架构源码分析 -【设置视频显示surface】完整系列章节分析:【一】Android MediaPlayer整体架构源码分析 -【初始化和创建】本系列文章分析的安卓源码版本:【Android 10.0 版本】prepareAsync/prepare方法实现流程分析MediaPlayer提供了两个prepare处理流程:同步和异步执行。异步执行prepareAsync示例:// 推荐都使用异步进行,然后在【mPreparedList原创 2021-04-07 23:18:36 · 2052 阅读 · 6 评论 -
Android底层音视频播放媒体提取器【MediaExtractor】的解复用模块demuxers模块化加载和注册流程实现源码分析【Part 1】
承接第五章中内容的延续:【五】Android MediaPlayer整体架构源码分析 -【prepareAsync/prepare处理流程】【Part 1】 TODO 后续给出链接本系列文章分析的安卓源码版本:【Android 10.0 版本】在第五章节第3.1小节分析mediaExService->makeIDataSource(mFd, mOffset, mLength)过程中可知,该方法通过Binder机制调用Bn实现端BnMediaExtractorService子类实现者MediaEx原创 2021-04-07 14:52:33 · 1580 阅读 · 2 评论 -
【四】Android MediaPlayer整体架构源码分析 -【设置视频显示surface】
承接上一章节分析:【三】Android MediaPlayer整体架构源码分析 -【设置数据源】【Part 1】完整系列章节分析:【一】Android MediaPlayer整体架构源码分析 -【初始化和创建】本系列文章分析的安卓源码版本:【Android 10.0 版本】setDisplay方法实现流程分析设置视频显示surface示例:// 先获取SurfaceHoldermSurfaceView = findViewById(R.id.surface_view);mSurfaceHold原创 2021-04-06 15:15:10 · 1657 阅读 · 3 评论 -
【三】Android MediaPlayer整体架构源码分析 -【设置数据源】【Part 3】
承接上一章节分析:[【三】Android MediaPlayer整体架构源码分析 -【设置数据源】【Part 2】](https://blog.csdn.net/u012430727/article/details/115066103)本系列文章分析的安卓源码版本:【Android 10.0 版本】关于彻底理解掌握AMessage消息循环机制实现原理,推荐先看下系列内容:[Android native层媒体通信架构AHandler/ALooper机制实现源码分析]原创 2021-04-01 23:26:47 · 736 阅读 · 0 评论 -
Android native层媒体通信架构AHandler/ALooper机制实现源码分析【Part 3】
承接上一章节分析:【若前一章节没看过,建议先看上一章节】Android native层媒体通信架构AHandler/ALooper机制实现源码分析【Part 2】本系列文章分析的安卓源码版本:【Android 10.0 版本】3.3、AMessage post发送事件消息实现分析其实在AMessage中可以有三种post方式,如下声明:// [frameworks/av/media/libstagefright/foundation/include/media/stagefright/founda原创 2021-04-01 16:37:47 · 647 阅读 · 1 评论 -
Android native层媒体通信架构AHandler/ALooper机制实现源码分析【Part 2】
[Android native层媒体通信架构AHandler/ALooper机制实现源码分析【Part 1】]本系列文章分析的安卓源码版本:【Android 10.0 版本】3、发送消息:ALooper内部线程或其他线程中均可发送消息。【以MediaClock为例】```cpp// [frameworks/av/media/libstagefright/MediaClock.原创 2021-03-31 23:12:43 · 515 阅读 · 0 评论 -
Android native层媒体通信架构AHandler/ALooper机制实现源码分析【Part 1】
彻底理解掌握native层媒体通信架构AHandler/ALooper消息循环机制实现源码分析很久前分析过android java端Handler机制实现源码分析,并手写了该Handler机制的简单实现——【[教你手写android底层Handler消息机制实现框架]】此章节的AHandler机制实现原理和java端大同小异,当然还有另外对应于java层Handler的native层对应实现,以后有时间可以考虑分析下,但实现原理都类似的。[Android native/C++层Thread线程实现源码原创 2021-03-31 22:26:00 · 1141 阅读 · 0 评论 -
【三】Android MediaPlayer整体架构源码分析 -【设置数据源】【Part 2】
承接上一章节分析:【三】Android MediaPlayer整体架构源码分析 -【设置数据源】【Part 1】setDataSource(fd, offset, length)实现分析:// [frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp]status_t MediaPlayerService::Client::setDataSource(int fd, int64_t offset, int64_t length)原创 2021-03-24 15:51:34 · 968 阅读 · 0 评论 -
【三】Android MediaPlayer整体架构源码分析 -【设置数据源】【Part 1】
本系列文章分析的安卓源码版本:【Android 10.0 版本】setDataSource方法实现流程分析设置数据源示例:mMediaPlayer.setDataSource(mPath);通过java层MediaPlayer的源码分析可知,setDataSource有多个重载方法,但最终只对应有3个native方法,如下:多个java重载方法,但目前暂时只先分析传递string URL参数的方法(数据流可为本地文件或网络传输)处理流程:【后续有时间再分析】有注释可知,该path可传入http原创 2021-03-22 14:53:07 · 1548 阅读 · 5 评论 -
Android MediaPlayer整体架构源码分析 -【MediaPlayer多种类型播放器注册和获取创建流程】
MediaPlayer多种类型播放器注册和获取流程本章内容承接的是本系列第三章中涉及到的获取和创建播放器的功能。1、获取播放器类型代码:MediaPlayerFactory::getPlayerType()实现分析:// [frameworks/av/media/libmediaplayerservice/MediaPlayerFactory.cpp]player_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>原创 2021-03-19 17:10:25 · 1002 阅读 · 4 评论 -
【二】Android MediaPlayer整体架构源码分析 -【Listeners监听事件回调】
MediaPlayer设置各种Listener的事件回调处理流程示例代码如下: mMediaPlayer.setOnPreparedListener(mPreparedListener); mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener); mMediaPlayer.setOnCompletionListener(mCompletionListener); mMe原创 2021-03-18 17:12:29 · 1081 阅读 · 3 评论 -
【一】Android MediaPlayer整体架构源码分析 -【初始化和创建】
本系列文章分析的安卓源码版本:【Android 10.0 版本】一、MediaPlayer的简单调用关键流程【这只是一个简单使用过程示例】// 此处变量声明省略 private void play() { // 先获取SurfaceHolder mSurfaceView = findViewById(R.id.surface_view); mSurfaceHolder = mSurfaceView.getHolder(); mSurfac原创 2021-03-18 14:06:14 · 3604 阅读 · 5 评论 -
Android MediaPlayer在seek视频时可能会黑屏卡顿好几秒且进度条不动但有声音播放的问题源码解析
根本原因:个别视频格式播放器【特别是video decoder软解码器】解码速度较慢导致的。从源码分析原因就是:一、当前视频支持seek到非关键帧,导致其seek位置前最近的一个关键帧开始到seek位置的视频帧数据将会被drop掉,并且延迟通知notifySeekCompleted事件给APP,直到解码数据到seek位置时才通知,但此时seek位置的视频帧播放时间已经错过了音频播放时间,延迟太长而被丢弃,一直解码出来的视频数据直到丢弃到当前音频播放时间点的4毫秒范围内,才认为是音视频同步播放数据,才可进原创 2021-02-26 12:11:36 · 4022 阅读 · 2 评论 -
【十五】【vlc-android】vlc-sout流媒体输出端源码实现分析【Part 3】【02】
此章节分析承接上一章分析:【十五】vlc-sout流媒体输出端源码实现分析【Part 3】【01】1.1.2.1、net_ListenSingle实现分析:【本地IP地址和端口号】// [vlc/src/network/udp.c]static int net_ListenSingle (vlc_object_t *obj, const char *host, int port, int protocol){ // 网络地址信息原创 2021-01-26 10:08:33 · 424 阅读 · 2 评论 -
【十五】【vlc-android】vlc-sout流媒体输出端源码实现分析【Part 3】【01】
接着第十五章节【Part 1】小节分析:本章分析【不需要加载流复用器模块功能】时的媒体流处理承接上一章节:【十五】【vlc-android】vlc-sout流媒体输出端源码实现分析【Part 1】1、Add实现分析:// 【vlc/modules/stream_output/rtp.c】// 注译:添加一个ES流数据作为一个新的RTP流数据/** Add an ES as a new RTP stream */static sout_stream_id_sys_t *Add( sout_str原创 2021-01-26 10:03:22 · 358 阅读 · 0 评论 -
【十五】【vlc-android】vlc-sout流媒体输出端源码实现分析【Part 2】【04】
此章节分析承接上一章分析:【十五】【vlc-android】vlc-sout流媒体输出端源码实现分析【Part 2】【03】10.6.1、block_ChainGather实现分析:注意:根据全项目搜索查找实现,block数据块结构体中的该字段【p_block->i_length】代表的意思大致为,当前block数据显示的时长。如若是视频block数据块,则表示当前视频图像应该显示的时长//【vlc/inlcude/vlc_block.h】static inline block_t *blo原创 2021-01-26 09:48:41 · 360 阅读 · 0 评论 -
【十五】【vlc-android】vlc-sout流媒体输出端源码实现分析【Part 2】【03】
此章节分析承接上一章分析:【十五】【vlc-android】vlc-sout流媒体输出端源码实现分析【Part 2】【02】10.1.5、bs_read_ue实现分析:// 【vlc/include/vlc_bits.h】// 读取指数哥伦布编码,其实就是哥伦布解码过程得到真实的int数值/* Read unsigned Exp-Golomb code */static inline uint_fast32_t bs_read_ue( bs_t * bs ){ unsigned i =原创 2021-01-26 09:41:05 · 778 阅读 · 0 评论 -
【十五】【vlc-android】vlc-sout流媒体输出端源码实现分析【Part 2】【02】
此章节分析承接上一章分析:【十五】【vlc-android】vlc-sout流媒体输出端源码实现分析【Part 2】【01】9、block_SkipBytes实现分析:// 【vlc/include/vlc_block_helper.h】static inline int block_SkipBytes( block_bytestream_t *p_bytestream, size_t i_data ){ return原创 2021-01-26 09:30:15 · 423 阅读 · 0 评论 -
【十五】【vlc-android】vlc-sout流媒体输出端源码实现分析【Part 2】【01】
【备注:当前章节由于篇幅内容长度问题,因此再次拆分成小章节分析组成】接着第十五章节【Part 1】小节分析,可知有如下packetizer模块加载:若sout不为空时在【vlc/src/input/decoder.c】的【LoadDecoder】方法中会加载【module_need( p_dec, “packetizer”, “$packetizer”, false );】模块。整个项目中全局查找packetizer模块a52.c (vlc\modules\packetizer) line 52 :原创 2021-01-26 09:23:42 · 504 阅读 · 0 评论 -
【十五】【vlc-android】vlc-sout流媒体输出端源码实现分析【Part 1】
由前第5章节分析第【1.2.1.1】小节(EsCreateDecoder实现分析:【vlc/src/input/es_out.c】中)分析可知sout媒体流输出端对象初始化大致流程概述:// sout对象为【sout_instance_t】结构体信息(可能为空当设置了renderer时),// 该信息定义为流输出实例即Stream Output,初始化流程:InitSout方法【vlc/src/input/input.c】-->// input_resource_RequestSout方法【vl原创 2021-01-26 09:11:27 · 874 阅读 · 0 评论 -
Android MediaPlayer播放器暂停3秒后恢复播放时视频会倒退几秒才开始播放问题源码分析和解决方案
先写结论:是安卓高版本上视频在暂停播放处理时加上了audio offload超时机制【降低系统功耗】优化功能导致的,offload该处理是使用音频硬解码,不是软解,其音频解码速度更快,而在PAUSE暂停时设置超时是为了降低功耗提升系统性能。跳帧【回退几秒】原因:是重新执行了seek操作,而该操作在安卓原生播放器中不支持seek到非关键帧。而之所以只有某些视频会出现比较明显的回退几秒现象,是由于该视频中视频数据GOP时长问题即视频编码问题,如若该视频在10秒时是一个关键帧,而之后是25秒后才是关键帧,因此原创 2021-01-06 10:04:59 · 3404 阅读 · 9 评论 -
【十四】【vlc-android】aout音频输出模块源码实现分析【Part 1】
接着第九章节分析aout输出组件模块的加载和实现分析。有第九章节第2小节中可知,加载的模块名为【“audio output”】通过全局搜索有如下android端支持组件模块:// 第1种方式audiotrack.c (vlc\modules\audio_output) line 183 : set_capability( "audio output", 180 )// 第2种方式// 将pcm源数据保存到文件中file.c (vlc\modules\audio_output) lin原创 2020-12-18 15:18:47 · 966 阅读 · 0 评论