掌握了Android音视频开发让你在工作中如鱼得水

ffmpeg入门篇-滤镜的基本使用 现在我们保证了当前视频一定会按照300x500的比例输出且不会变形,但是请注意老板说的“所有输出视频”,也就是说输入视频的分辨率可能是200x300、544x960、500x400、200x800等等各种比例都要保证按照300x500输出,很显然,上面的写法不完全通用,怎么办?[out] 中括号是必须要的,out是自定义的一个别名,结合scale滤镜,表示的是把scale滤镜输出的结果命名为[out],但并非是最终输出的结果,只能作为中间过程输出的一个结果; 阅读详情

在日常生活中,视频类应用占据了我们越来越多的时间,各大公司也纷纷杀入这个战场,不管是抖音、快手等短视频类型,虎牙、斗鱼等直播类型,腾讯视频、爱奇艺、优酷等长视频类型,还是Vue、美拍等视频编辑美颜类型,总有一款适合你。

未来随着5G普及以及网络资费的下降,音视频的前景是非常广阔的。但是另一方面,无论是音视频的编解码和播放器、视频编辑和美颜的各种算法,还是视频与人工智能的结合(AI剪片、视频修复、超清化等),它们都涉及了方方面面的底层知识,学习曲线比较陡峭,门槛相对比较高,所以也造成了目前各大公司音视频相关人才的紧缺。如果你对音视频开发感兴趣,我也非常建议你去往这个方向尝试,我个人是非常看好音视频开发这个领域的。

当然音视频开发的经验是靠着一次又一次的“填坑”成长起来的,下面我们一起来看看俊杰同学关于音视频的认识和思考。

不管作为开发者还是用户,现在我们每天都会接触到各种各样的短视频、直播类的App,与之相关的音视频方向的开发也变得越来越重要。但是对于大多数Android开发者来说,从事Android音视频相关的开发可能目前还算是个小众领域,虽然可能目前深入这个领域的开发者还不是太多,但这个方向涉及的知识点可一点都不少。

音视频的基础知识

1. 音视频相关的概念

说到音视频,先从我们熟悉也陌生的视频格式说起。

对于我们来说,最常见的视频格式就MP4格式,这是一个通用的容器格式。所谓容器格式,就意味内部要有对应的数据流用来承载内容。而且既然是一个视频,那必然有音轨和视轨,而音轨、视轨本身也有对应的格式。常见的音轨、视轨格式包括:

  • 视轨:H.265(HEVC)。其中,目前大部分Android手机都支持H.264格式的直接硬件编码和解码;对于H.265来说,Android 5.0以上的机器就支持直接硬件解码了,但是对于硬件编码,目前只有一部分高端芯片可以支持,例如高通的8xx系列、华为的98x系列。对于视轨编码来说,分辨率越大性能消耗也就越大,编码所需的时间就越长。
  • 音轨:AAC。这是一种历史悠久音频编码格式,Android手机基本可以直接硬件编解码,几乎很少遇到兼容性问题。可以说作为视频的音轨格式,AAC已经非常成熟了。

对于编码本身,上面提到的这些格式都是有损编码,因此压缩编码本身还需要一个衡量压缩之后,数据量多少的指标,这个标准就是码率。同一个压缩格式下,码率越高质量也就越好。更多Android本身支持的编解码格式,你可以参考官方文档。

小结一下,要拍摄一个MP4视频,我们需要将视轨 + 音轨分别编码,然后作为MP4的数据流,再合成出一个MP4文件。

2. 音视频编码的流程

接下来,我们再来看看一个视频是怎么拍摄出来的。首先,既然是拍摄,少不了跟摄像头、麦克风打交道。从流程来说,以H.264/AAC编码为例,录制视频的总体流程是:

我们分别从摄像头/录音设备采集数据,将数据送入编码器,分别编码出视轨/音轨之后,再送入合成器(MediaRemuxer或者类似mp4v2、FFmpeg之类的处理库),最终输出MP4文件。接下来,我主要以视轨为例,来介绍下编码的流程。

首先,直接使用系统的MediaRecorder录制整个视频,这是最简单的方法,直接就能输出MP4文件。但是这个接口可定制化很差,比如我们想录制一个正方形的视频,除非摄像头本身支持宽高一致的分辨率,否则只能后期处理或者各种Hack。另外,在实际App中,除非对视频要求不是特别高,一般也不会直接使用MediaRecorder。

视轨的处理是录制视频中相对比较复杂的部分,输入源头是Camera的数据,最终输出是编码的H.264/H.265数据。下面我来介绍两种处理模型。

第一种方法是利用Camera获取摄像头输出的原始数据接口(例如onPreviewFrame),经过预处理,例如缩放、裁剪之后,送入编码器,输出H.264/H.265。

摄像头输出的原始数据格式为NV21,这是YUV颜色格式的一种。区别于RGB颜色,YUV数据格式占用空间更少,在视频编码领域使用十分广泛。

一般来说,因为摄像头直接输出的NV21格式大小跟最终视频不一定匹配,而且编码器往往也要求输入另外一种YUV格式(一般来说是YUV420P),因此在获取到NV21颜色格式之后,还需要进行各种缩放、裁剪之类的操作,一般会使用FFmpeg、libyuv这样的库处理YUV数据。

最后会将数据送入到编码器。在视频编码器的选择上,我们可以直接选择系统的MediaCodec,利用手机本身的硬件编码能力。但如果对最终输出的视频大小要求比较严格的话,使用的码率会偏低,这种情况下大部分手机的硬件编码器输出的画质可能会比较差。另外一种常见的选择是利用x264来进行编码,画质表现相对较好,但是比起硬件编码器,速度会慢很多,因此在实际使用时最好根据场景进行选择。

除了直接处理摄像头原始数据以外,还有一种常见的处理模型,利用Surface作为编码器的输入源。

​

对于Android摄像头的预览,需要设置一张Surface/SurfaceTexture来作为摄像头预览数据的输出,而MediaCodec在API 18+之后,可以通过createInputSurface来创建一张Surface作为编码器的输入。这里所说的另外一种方式就是,将摄像头预览Surface的内容,输出到MediaCodec的InputSurface上。

而在编码器的选择上,虽然InputSurface是通过MediaCodec来创建的,乍看之下似乎只能通过MediaCodec来进行编码,无法使用x264来编码,但利用PreviewSurface,我们可以创建一个OpenGL的上下文,这样所有绘制的内容,都可以通过glReadPixel来获取,然后再讲读取数据转换成YUV再输入到x264即可(另外,如果是在GLES 3.0的环境,我们还可以利用PBO来加速glReadPixles的速度)。

由于这里我们创建了一个OpenGL的上下文,对于目前的视频类App来说,还有各种各样的滤镜和美颜效果,实际上都可以基于OpenGL来实现。

而至于这种方式录制视频具体实现代码,你可以参考下grafika中示例。

视频处理

1. 视频编辑

在当下视频类App中,你可以见到各种视频裁剪、视频编辑的功能,例如:

  • 裁剪视频的一部分。
  • 多个视频进行拼接。

对于视频裁剪、拼接来说,Android直接提供了MediaExtractor的接口,结合seek以及对应读取帧数据readSampleData的接口,我们可以直接获取对应时间戳的帧的内容,这样读取出来的是已经编码好的数据,因此无需重新编码,直接可以输入合成器再次合成为MP4。

我们只需要seek到需要裁剪原视频的时间戳,然后一直读取sampleData,送入MediaMuxer即可,这是视频裁剪最简单的实现方式。

但在实践时会发现,seekTo并不会对所有时间戳都生效。比如说,一个4min左右的视频,我们想要seek到大概2min左右的位置,然后从这个位置读取数据,但实际调用seekTo到2min这个位置之后,再从MediaExtractor读取数据,你会发现实际获取的数据上可能是从2min这里前面一点或者后面一点位置的内容。这是因为MediaExtractor这个接口只能seek到视频关键帧的位置,而我们想要的位置并不一定有关键帧。这个问题还是要回到视频编码,在视频编码时两个关键帧之间是有一定间隔距离的。

如上图所示,关键帧被成为I帧,可以被认为是一帧没有被压缩的画面,解码的时候无需要依赖其他视频帧。但是在两个关键帧之间,还存在这B帧、P帧这样的压缩帧,需要依赖其他帧才能完整解码出一个画面。至于两个关键帧之间的间隔,被称为一个 GOP,在GOP内的帧,MediaExtractor是无法直接seek到的,因为这个类不负责解码,只能seek到前后的关键帧。但如果GOP过大,就会导致视频编辑非常不精准了(实际上部分手机的ROM有改动,实现的MediaExtractor也能精确seek)。

既然如此,那要实现精确裁剪也就只能去依赖解码器了。解码器本身能够解出所有帧的内容,在引入解帧之后,整个裁剪的流程就变成了下面的样子。

我们需要先seek到需要位置的前一I帧上,然后送入解码器,解码器解除一帧之后,判断当前帧的PTS是否在需要的时间戳范围内,如果是的话,再将数据送入编码器,重新编码再次得到H.264视轨数据,然后合成MP4文件。

上面是基础的视频裁剪流程,对于视频拼接,也是类似得到多段H.264数据之后,才一同送入合成器。

另外,在实际视频编辑中,我们还会添加不少视频特效和滤镜。前面在视频拍摄的场景下,我们利用Surface作为MediaCodec的输入源,并且利用Surface创建了OpenGL的上下文。而MediaCodec作为解码器的时候,也可以在configure的时候,指定一张Surface作为其解码的输出。大部分视频特效都是可以通过OpenGL来实现的,因此要实现视频特效,一般的流程是下面这样的。

我们将解码之后的渲染交给OpenGL,然后输出到编码器的InputSurface上,来实现整套编码流程。

2. 视频播放

任何视频类App都会涉及视频播放,从录制、剪辑再到播放,构成完整的视频体验。对于要播放一个MP4文件,最简单的方式莫过于直接使用系统的MediaPlayer,只需要简单几行代码,就能直接播放视频。对于本地视频播放来说,这是最简单的实现方式,但实际上我们可能会有更复杂的需求:

  • 需要播放的视频可能本身并不在本地,很多可能都是网络视频,有边下边播的需求。
  • 播放的视频可能是作为视频编辑的一部分,在剪辑时需要实时预览视频特效。

对于第二种场景,我们可以简单配置播放视频的View为一个GLSurfaceView,有了OpenGL的环境,我们就可以在这上实现各种特效、滤镜的效果了。而对于视频编辑常见的快进、倒放之类的播放配置,MediaPlayer也有直接的接口可以设置。

更为常见的是第一种场景,例如一个视频流界面,大部分视频都是在线视频,虽然MediaPlayer也能实现在线视频播放,但实际使用下来,会有两个问题:

  • 通过设置MediaPlayer视频URL方式下载下来的视频,被放到了一个私有的位置,App不容易直接访问,这样会导致我们没法做视频预加载,而且之前已经播放完、缓冲完的视频,也不能重复利用原有缓冲内容。
  • 同视频剪辑直接使用MediaExtractor返回的数据问题一样,MediaPlayer同样无法精确seek,只能seek到有关键帧的地方。

对于第一个问题,我们可以通过视频URL代理下载的方式来解决,通过本地使用Local HTTP Server的方式代理下载到一个指定的地方。现在开源社区已经有很成熟的项目实现,例如AndroidVideoCache。

而对于第二个问题来说,没法精确seek的问题在有些App上是致命的,产品可能无法接受这样的体验。那同视频编辑一样,我们只能直接基于MediaCodec来自行实现播放器,这部分内容就比较复杂了。当然你也可以直接使用Google开源的ExoPlayer,简单又快捷,而且也能支持设置在线视频URL。

看似所有问题都有了解决方案,是不是就万事大吉了呢?

常见的网络边下边播视频的格式都是MP4,但有些视频直接上传到服务器上的时候,我们会发现无论是使用MediaPlayer还是ExoPlayer,似乎都只能等待到整个视频都下载完才能开始播放,没有达到边下边播的体验。这个问题的原因实际上是因为MP4的格式导致的,具体来看,是跟MP4格式中的moov有关。


​​​​​​​

MP4格式中有一个叫作moov的地方存储这当前MP4文件的元信息,包括当前MP4文件的音轨视轨格式、视频长度、播放速率、视轨关键帧位置偏移量等重要信息,MP4文件在线播放的时候,需要moov中的信息才能解码音轨视轨。

而上述问题发生的原因在于,当moov在MP4文件尾部的时候,播放器没有足够的信息来进行解码,因此视频变得需要直接下载完之后才能解码播放。因此,要实现MP4文件的边下边播,则需要将moov放到文件头部。目前来说,业界已经有非常成熟的工具,FFmpeg跟mp4v2都可以将一个MP4文件的moov提前放到文件头部。例如使用FFmpeg,则是如下命令:

ffmpeg -i input.mp4 -movflags faststart -acodec copy -vcodec copy output.mp4

使用-movflags faststart,我们就可以把视频文件中的moov提前了。

另外,如果想要检测一个MP4的moov是否在前面,可以使用类似AtomicParsley的工具来检测。

在视频播放的实践中,除了MP4格式来作为边下边播的格式以外,还有更多的场景需要使用其他格式,例如m3u8、FLV之类,业界在客户端中常见的实现包括ijkplayer、ExoPlayer,有兴趣的同学可以参考下它们的实现。

音视频开发的学习之路

音视频相关开发涉及面很广,今天我也只是简单介绍一下其中基本的架构,如果想继续深入这个领域发展,从我个人学习的经历来看,想要成为一名合格的开发者,除了基础的Android开发知识以外,还要深入学习,我认为还需要掌握下面的技术栈。

语言

  • C/C++:音视频开发经常需要跟底层代码打交道,掌握C/C++是必须的技能。这方面资料很多,相信我们都能找到。
  • ARM NEON汇编:这是一项进阶技能,在视频编解码、各种帧处理低下时很多都是利用NEON汇编加速,例如FFmpeg/libyuv底层都大量利用了NEON汇编来加速处理过程。虽说它不是必备技能,但有兴趣也可以多多了解,具体资料可以参考ARM社区的教程。

框架

  • [FFmpeg](https://ffmpeg.org/):可以说是业界最出名的音视频处理框架了,几乎囊括音视频开发的所有流程,可以说是必备技能。
  • [libyuv](https://chromium.googlesource.com/libyuv/libyuv/):Google开源的YUV帧处理库,因为摄像头输出、编解码输入输出也是基于YUV格式,所以也经常需要这个库来操作数据(FFmpeg也有提供了这个库里面所有的功能,在[libswscale](https://www.ffmpeg.org/doxygen/2.7/swscale_8h.html)都可以找到类似的实现。不过这个库性能更好,也是基于NEON汇编加速)。
  • [libx264](https://www.videolan.org/developers/x264.html)/[libx265](http://x265.org/):目前业界最为广泛使用的H.264/H.265软编解码库。移动平台上虽然可以使用硬编码,但很多时候出于兼容性或画质的考虑,因为不少低端的Android机器,在低码率的场景下还是软编码的画质会更好,最终可能还是得考虑使用软编解码。
  • [OpenGL ES](https://www.khronos.org/opengles/):当今,大部分视频特效、美颜算法的处理,最终渲染都是基于GLES来实现的,因此想要深入音视频的开发,GLES是必备的知识。另外,除了GLES以外,[Vulkan](https://www.khronos.org/vulkan/)也是近几年开始发展起来的一个更高性能的图形API,但目前来看,使用还不是特别广泛。
  • [ExoPlayer](https://github.com/google/ExoPlayer)/[ijkplayer](https://github.com/bilibili/ijkplayer):一个完整的视频类App肯定会涉及视频播放的体验,这两个库可以说是当下业界最为常用的视频播放器了,支持众多格式、协议,如果你想要深入学习视频播放处理,它们几乎也算是必备技能。

从实际需求出发,基于上述技术栈,我们可以从下面两条路径来深入学习。

1. 视频相关特效开发

直播、小视频相关App目前越来越多,几乎每个App相关的特效,往往都是利用OpenGL本身来实现。对于一些简单的特效,可以使用类似的Color Look Up Table
技术,通过修改素材配合Shader来查找颜色替换就能实现。如果要继续学习更加复杂的滤镜,推荐你可以去shadertoy学习参考,上面有非常多Shader的例子。

而美颜、美型相关的效果,特别是美型,需要利用人脸识别获取到关键点,对人脸纹理进行三角划分,然后再通过Shader中放大、偏移对应关键点纹理坐标来实现。如果想要深入视频特效类的开发,我推荐可以多学习OpenGL相关的知识,这里会涉及很多优化点。

2. 视频编码压缩算法

H.264/H.265都是非常成熟的视频编码标准,如何利用这些视频编码标准,在保证视频质量的前提下,将视频大小最小化,从而节省带宽,这就需要对视频编码标准本身要有非常深刻的理解。这可能是一个门槛相对较高的方向,我也尚处学习阶段,有兴趣的同学可以阅读相关编码标准的文档。

【流媒体协议】图解 MP4 协议 快速入门 一张图快速理解 MP4文件协议 阅读详情

相关推荐

Android开发突围:视频制作平台崛起,音视频开发赛道寻求新突破

前言 前面,我写过几篇关于Android发展前景的文,大家在评论区的讨论也十分激烈。无非还是那句话:程序员这份职业就是一座围城,城外的人想进去,城内的人想出来。 不管是Android还是其他都是差不多的情况:一面是高校输出越来越多的计算机专业人才和社会上越来越多的“半路开发”,一面是越来越多的程序员高呼“编程已凉”纷纷离职。Android开发这个行业尤其如此。 今天在这里,我想和大家就Android围城之下如何“突围”这个话题进行探讨。 Android开发能不能成功突围? Android开发凉了? 2013

m0_46962786的博客 1881

ffmpeg常用命令总结

一.转码和转封装: ffmpeg -i ingput.rmvb -vcodec mpeg4 -b:v 200k -r 15 -s 640x480 -an -f mp4 -movflags faststart -y output.mp4 -vcodec : 强制指定视频编码格式,-acodec 强制指定音频编码格式 (ffmpeg -codecs可以查看支持的codecs, 如果指定copy则就...

浪子荆的博客 2万+

Android音视频开发---0基础入门准备篇

做Android开发有三四年了,一直做的都是应用层的APP开发,实现的基本都是UI效果,动画,机型适配,集成第三方的lib进行推送,支付,第三方登录,地图等的功能,就算涉及到视屏的播放也就是直接VideoView把mp4,flv或者其他格式的视屏直接给展示出来,并不会对视频本身做任何的处理,比如视频的压缩、比如清晰度切换,变声,滤镜。。。 就算涉及到拍照,也都是简单的直接调用系统给定的调用系统摄像...

jakezhang1990的专栏 5036

录制视频,实现特效与滤镜的几种方式(二)

本文并非专业音视频领域的文章,只不过是其在 Android 方向的 Camera 硬件下结合一些常用的应用场景而已。所以本文并不涉及到太专业的音视频知识,你只需要稍微了解一些以下知识点即可流畅阅读。Android 三种 Camera 分别如何预览,有什么区别?三种 Camera 回调的数据 byte[] 格式有什么区别?如何转换如何旋转?录制视频中常用的 NV21,I420,Surface 三种输入格式对哪一种COLOR_FORMAT完成编码?

chuyouyinghe的专栏 1283

Linux下的音视频开发和安卓的音视频开发有什么区别吗?

不管哪个平台大部分的音视频知识都是相同的,比如FFmpeg不管在Linux、Windows、Android、IOS都是通用的;比如RTMP、HLS、HTTP-FLV、RTP等流媒体知识也是不分平台;再比如WebRTC,也是跨平台的音视频应用。 音视频开发难点在哪里?现在上车还来得及吗?(全网最详细音视频学习路线分享) 一、行业现状 核心竞争力:定义音视频是程序界的皇冠,掌握音视频意味着你的技术航向已驶向蓝海,不用担心会被其他人替代。而音视频是有门槛的,是与其他人拉开差距的分水岭,不然也不会有“你想做音

Linux高级开发的博客 860

2024了,为什么说音视频技术是技术风口?Android音视频开发这么吃香

Android学习PDF+架构视频+面试文档+源码笔记【Android开发核心知识点笔记】【Android思维脑图(技能树)】【Android核心高级技术PDF文档,BAT大厂面试真题解析】【Android高级架构视频学习资源】【Android开发核心知识点笔记】[外链图片转存中…(img-ZgQUh7NF-1711272940975)]【Android思维脑图(技能树)】[外链图片转存中…(img-Ym9HNAzS-1711272940975)]

m0_56175058的博客 883

Android音视频开发

Android 音视频开发学习思路 Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的。只能通过一点点的学习和积累把这块的知识串联积累起来。 初级入门篇: Android 音视频开发(一) : 通过三种方式绘制图片 Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件 Android 音视频开发(三):使用 AudioTrack 播放PCM音频 Android 音视频开发(四):使用 Camera API 采集视

professionIT的博客 2786

实战内容(2)- 和-movflags +faststart一起咬文嚼字

了解mp4文件格式的同学都知道,mp4的索引字段box默认是放在视频文件尾部的。这种存储方式不利于视频文件在线点播播放,需要全部缓存下来才可以正常播放。为了解决这个问题,我们可以利用ffmpeg进行转码或转封装。 如果不了解mp4的文件格式,也没关系,可以参考这篇博客。 在转码和转封装的过程中,需要使用配置“-movflags +faststart”。细心的同学会发现faststart前边的加号+,于是提出问题:这个加号是否可以不加?

liuzhen007的专栏 4085

Android 音视频开发学习之路

Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的。只能通过一点点的学习和积累把这块的知识串联积累起来。 初级入门篇: Android 音视频开发(一) : 通过三种方式绘制图片 Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件 Android 音视频开发(三):使用 AudioTrack 播放PCM音...

jiang19921002的博客 2231

Android录制编辑播放视频解决方案。

尽量使用NDK,并且依赖开源框架实现的Android完整的录制,编辑特效,渲染,播放视频的解决方案Demo。

LVGL 9.4 性能调优实战:如何通过脏区合并与tile分块,让你的嵌入式UI流畅度翻倍

本文深入探讨LVGL 9.4中的性能优化技术,重点介绍脏区合并与tile分块如何显著提升嵌入式UI流畅度。通过实战案例和源码分析,详细解析局部刷新策略、显示框架调优及性能瓶颈诊断方法,帮助开发者在STM32、ESP32等资源受限设备上实现丝滑的UI体验。

weixin_28678831的博客 450

android音视频点/直播模块开发

前言随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能,那么作为开发一个小白,如何快速学习音视频基础知识,了解音视频编解码的传输协议,编解码方式,以及如何技术选型,如何解决遇到的坑,本文抛砖引玉,欢迎大咖交流。一. 音视频的基础知识1.1 基本概念视频是什么静止的画面叫图像(picture)。连续的图像变化每秒超过24帧(frame)画面以上时,

yabin的专栏 2万+

基于Codex Skill的抖音爆款分析与带货视频自动化生成实战

这次我们来看一个基于 Codex 的自动化内容创作项目。核心是利用 Codex 平台的能力,通过自定义的 Skill(技能)来拆解抖音爆款博主的视频模式,并自动生成自己的带货视频。对于内容创作者、电商运营或对短视频自动化感兴趣的技术开发者来说,这是一个将大语言模型(LLM)能力与具体业务场景深度结合的实战案例。 项目的核心价值在于流程自动化。它试图解决一个常见痛点:分析爆款视频的脚本结构、话术、节奏需要大量人工,而模仿创作又耗时费力。通过 Codex 的 Skill 机制,可以将“分析”和“生成”这两个环节

weixin_30420305的博客 383

Android开发摆脱行业寒冬必备《Android 音视频开发进阶指南》,开源分享。

前言 现在Android 开发工作越来越难找,是否这个行业凉了! Android开发前景怎么样? 安卓开发真的不行了吗? 相信绝大部分的Android开发者多多少都有关注过这些问题,Android凉肯定是凉不了的,只是招聘要求越来越高了,面试造火箭工作拧螺丝只是多少有点卷。 那大家有没有想过发展一下音视频开发领域呢?风口说相信大家也听腻了,风口猪是飞不起来了,不过好在不卷。 为什么要学习音视频开发技术? 高薪: 音视频开发的工资相比同级别的开发薪资普遍高出30%。主要分布在20k-35k之间,而且很重

datian1234的博客 3016

AI写作:为AI人工智能领域赋能

AI写作技术作为自然语言处理(NLP)领域的重要应用方向,正在深刻改变内容创作的方式。系统介绍AI写作的技术原理分析主流AI写作模型的架构特点提供实践性的代码示例探讨实际应用中的关键问题展望未来发展趋势本文涵盖从基础理论到高级应用的完整知识体系,适用于希望深入了解AI写作技术的开发者和研究人员。背景介绍:建立基本概念框架核心概念:解析关键技术原理算法实现:通过代码演示具体实现数学原理:深入底层数学模型实践应用:展示真实场景案例资源推荐:提供学习路径和工具。

AI天才研究院 3052

网格自适应_Comsol案例解析17:自适应网格的使用

本期导读自适应网格细化有许多优势,比如可以不用对网格进行全局加密,增加计算精度,又会降低求解自由度。本期仍然以气泡上升案例为例,在两相流模块中使用自适应网格。【打开案例模型】【修改网格】适当让气泡边界加密,注意,曲率因子越小,曲线上的网格越密【添加自适应网格】使用默认的参数即可,这里的误差指示器用的是水平集phi。可以根据具体求解模型选择适当的自变量作为误差指示器。【口诀】默认的一般是最...

weixin_28726871的博客 5681

Android 音视频开发学习思路大纲

前言 大家都知道,2019年是5g元年,随着5g的崛起,音视频将会运用的更加的广阔(比如远程教学,在线教学,在线会议,远程互动,安防监控…),将不再单单局限与目前的泛娱乐平台,将会更加的完善,从而更好的服务于我们的生活。 本人是非常爱好音视频开发的,奈何音视频的开发是有一定难度的,因为他涉及的层面比较广,要想深入学习,是需要有一定的学习体系,然后一步一个脚印的深入的。 Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的。只能通过一点点的学习和积累把这块的知识串联

hirezy 7009

Understanding Lockup Cells

工具会分析扫描链和EDT逻辑之间的控制时序元素的时钟的时序关系,当必须要同步时钟并保持数据完整性时插入边沿触发寄存器(lockup cells)。可以使用report_edt_lockup_cells命令来展示工具已经插入的lockup cells的详细报告。

weixin_44954910的博客 1080

《Android音视频开发》— Android 书籍

文章目录第1章 音视频基础知识 1第2章 常用的系统播放器MediaPlayer 8第3章 管理调度的服务者MediaPlayerService 40第4章 StagefrightPlayer(AwesomePlayer) 60第5章 流媒体播放的新生力量NuPlayer 98第6章 OpenMAX(OMX)框架 118第7章 FFmpeg项目 161 出版年: 2018-11 简介: 近年来,直播、短视频行业的相关业务发展迅猛,《Android音视频开发》主要介绍其中涉及的Android音视频开发相关技术

qq_27494201的博客 3627

谷歌账号国家或地区设置修改全攻略:条件、流程与避坑指南

谷歌账号的国家或地区设置与付款资料、账号历史行为及登录环境强绑定,修改时需满足特定条件。其原理在于地区作为索引键,关联内容库、货币结算和风控策略。正确切换可解决内容推荐错乱、付款失败等问题,适用于搬家、订阅区域限定服务等场景。操作前需在目标地区创建付款资料、清空余额并取消订阅,且一年仅能修改一次。本文详解从准备到验证的完整流程,并揭示官方文档未提及的实操陷阱,助你安全完成地区切换。

weixin_42521558的博客 2254

Host是如何与EC通信的

EC中有三个寄存器,分别为状态寄存器EC_SC、命令寄存器EC_SC和数据寄存器EC_DATA。而状态寄存器和命令寄存器同属于一个寄存器,这几个寄存器遵循着ACPI EC规范。host可以根据ACPI协议规范来与EC进行通信。 以下是个寄存器的详细介绍。 EC状态寄存器(EC_SC(R)),该寄存器是一个只读寄存器,它反映了此时EC接口的状态。下图为该寄存器表。 EC状态寄存器表中各位的具体含义: OBF(Output Buffer is Full),该状态位置1...

qq_30135687的博客 3691

Android平台FFmpeg音视频开发深度指南

FFmpeg在Android开发中具有核心价值,提供了跨平台支持、完整功能链和灵活扩展性,帮助开发者突破系统原生API限制,实现专业音视频处理。环境搭建包括FFmpeg编译和Android项目集成,编译时需优化安全性和性能,项目集成则通过CMake配置。核心开发流程涵盖初始化、媒体文件解析和解码引擎优化,确保高效、安全地处理音视频数据。

健健的博客 2136

如何在 R 中使用 Gamma 分布(附示例)

在统计学中,伽马分布通常用于模拟与等待时间相关的概率。我们可以使用以下函数来处理 R 中的 gamma 分布:dgamma(x, shape, rate) – 找到具有特定形状和速率参数的 gamma 分布的密度函数值。 pgamma(q, shape, rate) – 找到具有特定形状和速率参数的伽马分布的累积密度函数值。 qgamma(p, shape, rate) – 找到具有特定形状和速率参数的 gamma 分布的逆累积密度函数值。 rgamma(n, shape, rate) – 生成 n 个随机

Mrrunsen的博客 4415

Android音视频开发框架(上)

目前分析了Android音视频创建,编码,存储,可以说我们粗略的讲完了音视频的上半程;还剩下读取,解码,播放,由于篇幅所限决定分为两篇叙述较好。

嘴巴吃糖了 1439

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android程序员掌握音视频开发,再冷的寒冬也不怕

前言 相信绝大部分的Android开发者多多少都有关注过这些问题,Android凉肯定是凉不了的,只是招聘要求越来越高了,面试造火箭工作拧螺丝只是多少有点卷。那大家有没有想过发展一下音视频开发领域呢? 掌握音视频开发技术能给带来那些好处? 高薪: 音视频开发的工资相比同级别的开发薪资普遍高出30%。主要分布在20k-35k之间,而且很重要的一点是不卷啊。音视频开发薪资这么高主要就是因为音视频技术人才非常稀缺,人才的稀缺也注定内卷不起来。 就业: 短视频类(X音、X手等等。主要就是声音变化和美颜,表情特效等)

m0_64365896的博客 6493

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android音视频开发框架(下)

到此,Android的音视频开发框架基本描述完整了,它涵盖了音视频的创建,编码,保存,提取,解码,播放的全过程,当然每个部分只是囫囵吞枣的介绍,代码也不是完整,其实这里里面很多内容都可以单列一章来讲,细节颇多,不过我认为作为一个简介性质的文章深度是够了的,主要侧重于介绍概念和使用方法。后续深入研究还靠自己,本身的水平也有限。

嘴巴吃糖了 1299

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 抛开那些人生大道理,保持初心,砥砺前行
下一篇: iOS原生和前端JS交互真没那么简单,了解背后实现让你受益匪浅
弱水三千只取一瓢编号880908
博客等级 码龄14年 95粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值