FMUSER更轻松地传输视频和音频!
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org ->荷兰语
sq.fmuser.org ->阿尔巴尼亚人
ar.fmuser.org ->阿拉伯语
hy.fmuser.org - >亚美尼亚
az.fmuser.org ->阿塞拜疆
eu.fmuser.org ->巴斯克
be.fmuser.org ->白俄罗斯语
bg.fmuser.org - >保加利亚
ca.fmuser.org ->加泰罗尼亚语
zh-CN.fmuser.org ->中文(简体)
zh-TW.fmuser.org - >中国(繁体)
hr.fmuser.org ->克罗地亚语
cs.fmuser.org ->捷克
da.fmuser.org ->丹麦语
nl.fmuser.org - >荷兰
et.fmuser.org ->爱沙尼亚语
tl.fmuser.org ->菲律宾
fi.fmuser.org ->芬兰语
fr.fmuser.org - >法国
gl.fmuser.org ->加利西亚语
ka.fmuser.org ->乔治亚
de.fmuser.org ->德语
el.fmuser.org - >希腊
ht.fmuser.org ->海地克里奥尔语
iw.fmuser.org ->希伯来语
hi.fmuser.org ->印地语
hu.fmuser.org - >匈牙利
is.fmuser.org ->冰岛语
id.fmuser.org ->印尼语
ga.fmuser.org ->爱尔兰
it.fmuser.org - >意大利
ja.fmuser.org ->日语
ko.fmuser.org ->韩文
lv.fmuser.org ->拉脱维亚
lt.fmuser.org - >立陶宛
mk.fmuser.org ->马其顿语
ms.fmuser.org ->马来语
mt.fmuser.org ->马耳他语
no.fmuser.org - >挪威
fa.fmuser.org ->波斯语
pl.fmuser.org ->波兰语
pt.fmuser.org ->葡萄牙语
ro.fmuser.org - >罗马尼亚
ru.fmuser.org ->俄语
sr.fmuser.org ->塞尔维亚语
sk.fmuser.org ->斯洛伐克
sl.fmuser.org - >斯洛文尼亚
es.fmuser.org ->西班牙语
sw.fmuser.org ->斯瓦希里语
sv.fmuser.org ->瑞典语
th.fmuser.org - >泰国
tr.fmuser.org ->土耳其语
uk.fmuser.org ->乌克兰语
ur.fmuser.org ->乌尔都语
vi.fmuser.org - >越南
cy.fmuser.org ->威尔士语
yi.fmuser.org - >意第绪语
3.收藏
采集主要包括两个方面:视频采集和音频采集。 摄像机收集视频,这涉及摄像机的相关操作以及摄像机的参数设置。 由于各种手机制造商的相机有所不同,因此在这方面存在一些陷阱,有关该相机的文章将对此进行介绍。 音频通过麦克风收集。 不同手机的麦克风支持不同的音频采样率,有时需要回音消除才能支持麦克风功能。
视频捕获技术的要点:
检查是否可以使用相机;
相机拍摄的图像是水平的,拍摄的图像需要旋转一定程度后才能显示。
相机拍摄时,有一系列图像尺寸可供选择。 当拍摄的图像尺寸与手机的屏幕尺寸不一致时,需要进行特殊处理。
Android手机摄像头具有一系列状态,摄像头的相应操作需要处于正确的状态;
Android手机摄像头的许多参数都存在兼容性问题,因此需要更好地解决这些兼容性问题。
音频捕获技术的要点:
检查是否可以使用麦克风;
需要检测手机是否支持一定的音频采样率;
在某些情况下,有必要对音频执行回声消除处理。
在音频捕获期间设置正确的缓冲区大小。
注意:稍后将有关于该系列的特别文章
4.加工
视频处理
现在,Beauty几乎是手机直播软件的标准配置。 美化之后,主机具有更高的外观,并且对粉丝更具吸引力。 还有一些Android直播应用程序可以识别主持人的脸并添加有趣的动画。 特殊效果,有时我们还需要在视频中添加水印。
实际上,美化视频和添加特殊效果是通过OpenGL处理的。 Android中有GLSurfaceView,与SurfaceView类似,但可以使用Renderer进行渲染。 可以通过OpenGL生成纹理,可以通过纹理ID生成SurfaceTexture,然后可以将SurfaceTexture移交给Camera,最后通过纹理将相机预览屏幕和OpenGL连接起来,从而可以通过OpenGL执行一系列操作。
美化的整个过程无非就是通过OpenGL中的FBO技术基于Camera预览的纹理生成新纹理,然后使用新纹理在Renderer中的onDrawFrame()上绘制。 添加水印是先将图片转换为纹理,然后使用OpenGL进行绘制。 添加动态吊坠特殊效果更加复杂。 首先,需要基于当前预览图像执行算法分析以识别人脸的相应部分,然后在每个相应的部分上绘制相应的图像。 整个过程的实现有些困难。
下图是整个美容过程的流程图:
美容过程
下图很好地显示了美感和动画效果。
美容
动画效果和水印
注意:将会有一篇关于OpenGL及其整个过程实现的特别文章。
音频处理
在某些情况下,主持人需要添加一些其他声音以增加现场广播的气氛,例如掌声等等。 处理它的一种方法是直接播放其他声音,以便麦克风将其收集起来然后记录下来,但是当锚点戴着耳机或需要对声音执行回声消除处理时,这种处理将不起作用。 。 由于尚未将相应功能添加到我们的项目中,因此暂时没有相关经验可以分享,我们可能会在以后添加此功能,然后与您共享。
5. 编码
通过摄像机和麦克风,我们可以收集相应的视频和音频数据,但是这些都是固定格式的原始数据。 一般而言,相机一帧一帧地收集,而麦克风则收集PCM音频数据。 如果直接发送这些数据,则数据量通常非常大,导致带宽浪费很大,因此通常需要在发送之前对视频和音频进行编码。
视频编码
1.预测编码
众所周知,图像由许多所谓的像素组成。 大量统计数据表明,同一图像中的像素之间存在很强的相关性。 两个像素之间的距离越短,相关性越强。 用外行的话来说,两个像素的值越接近。 因此,人们可以利用像素之间的这种相关性来执行压缩编码。 该压缩方法称为帧内预测编码。 不仅如此,相邻帧之间的相关性通常强于帧内像素之间的相关性,并且压缩率也更大。 可以看出,通过使用像素之间的相关性(帧内)和帧之间的相关性,即找到相应的参考像素或参考帧作为预测值,可以实现视频压缩编码。
2.转换编码
大量统计数据表明,视频信号包含最耗能的DC和低频成分,即图像的平坦部分,以及少量高频成分,即图像的细节。图像。 因此,另一种方法可以用于视频编码。 图像经过一定的数学变换后,即可获得变换域中的图像(如图所示),其中u和v分别为空间频率坐标。
转换编码
3.基于波形的编码
基于波形的编码使用结合了预测编码和变换编码的基于块的混合编码方法。 为了降低编码复杂度并使视频编码操作更容易执行,在使用混合编码方法时,首先将图像划分为固定大小的块,例如块8×8(即每个块8行,8每行像素数),块16×16(每块16行,每行16像素)等等,然后对块进行压缩和编码。
自从ITU-T在261年发布第一个数字视频编码标准-H.1989以来,它已经相继发布了诸如H.263之类的视频编码标准以及诸如H.320和H.323之类的多媒体终端标准。 ISO下的运动图像专家组(MPEG)已定义MPEG-1,MPEG-2,MPEG-4和其他娱乐和数字电视压缩编码国际标准。
ITU-T在2003年264月发布了H.XNUMX视频编码标准。 它不仅使视频压缩比以前的标准有了显着提高,而且还具有良好的网络亲和力,特别是对于IP互联网,无线移动网络和其他易于出错,易阻塞且不容易保证QoS的网络视频传输性能。 。 所有这些视频编码都使用基于块的混合编码,它们都是基于波形的编码。
4.基于内容的编码
还有一种基于内容的编码技术,其中视频帧首先被划分为对应于不同对象的区域,然后进行编码。 具体来说,它对不同对象的形状,运动和纹理进行编码。 在最简单的情况下,二维轮廓用于描述对象的形状,运动矢量用于描述对象的运动状态,纹理由彩色波形描述。
当已知视频序列中的对象类型时,可以使用基于知识或基于模型的编码。 例如,对于人脸,已经开发了一些预定义的线框以编码脸部特征。 此时,编码效率非常高,仅需几个比特即可描述其功能。 对于面部表情(例如生气,高兴等),可能的行为可以通过语义进行编码。 由于对象的可能行为的数量非常少,因此可以获得非常高的编码效率。
MPEG-4采用的编码方法是基于块的混合编码和基于内容的编码方法。
5.软硬编织
在Android平台上有两种方法可以实现视频编码,一种是软编码,另一种是硬编码。 对于软编辑,它通常依赖于cpu并使用cpu的计算能力来执行编码。 例如,我们可以下载x264编码库,编写相关的jni界面,然后传入相应的图像数据。 经过x264库处理后,原始图像将转换为h264格式的视频。
硬代码使用Android本身提供的MediaCodec。 要使用MediaCodec,您需要传递相应的数据。 这些数据可以是yuv图像信息或Surface。 通常建议使用Surface,这样效率更高。 Surface直接使用本地视频数据缓冲区,而无需将其映射或复制到ByteBuffer; 因此,这种方法将更加有效。 使用Surface时,通常不能直接访问原始视频数据,但是可以使用ImageReader类访问不可靠的解码(或原始)视频帧。 这可能仍然比使用ByteBuffer更为有效,因为某些本地缓冲区可以映射为直接的ByteBuffer。 使用ByteBuffer模式时,可以使用Image类和getInput / OutputImage(int)方法访问原始视频数据帧。
注意:以下文章将专门介绍如何执行视频编码
音频编码
可以在Android中使用AudioRecord录制声音,并且录制的声音是PCM声音。 如果要用计算机语言表达声音,则必须数字化声音。 数字化声音的最常见方法是通过脉冲编码调制(PCM)。 声音通过麦克风,然后转换为一系列电压变化信号。 将此类信号转换为PCM格式的方法是使用三个参数表示声音。 它们是:通道数,采样位数和采样频率。
1.采样频率
即,采样频率是指每秒获得声音采样的次数。 采样频率越高,声音质量越好,声音再现越真实,但同时占用更多资源。 由于人耳的分辨率有限,因此无法分辨出太高的频率。 22位声卡中有44KHz,16KHz和其他级别。 其中,22KHz相当于普通FM广播的音质,44KHz相当于CD的音质。 当前的通用采样频率不超过48KHz。
2.采样位数
即,采样值或采样值(即,采样样本的振幅被量化)。 它是用于测量声音波动的参数,也可以说是声卡的分辨率。 其值越大,分辨率越高,声音功率越强。
在计算机中,采样位数通常为8位和16位,但是请注意,8位并不意味着将纵坐标分为8个部分,而是分为2到8的幂,即256个部分。 16位也是如此。 它将纵坐标分为2到16的65,536次方。
3.频道数
不难理解,有单声道和立体声的。 单声道声音只能由一个扬声器产生(某些声音也被处理成两个扬声器以输出相同的声道声音),而立体声pcm可以使两个扬声器同时发出声音(通常左右声道之间存在分工),这样您就可以感受到更多的空间效果。
因此,现在我们可以获取pcm文件容量的公式:
存储容量=(采样频率✖️采样位数✖️通道✖️时间)➗8(单位:字节数)
如果全部以PCM格式传输音频,则占用的带宽相对较大,因此需要在传输之前对音频进行编码。
已经有一些广泛使用的声音格式,例如wav,MIDI,MP3,WMA,AAC,Ogg等。与pcm格式相比,这些格式压缩声音数据,可以减少传输带宽。
音频编码也可以分为两种类型:软编码和硬编码。 要进行软编辑,请下载相应的编码库,编写相应的jni,然后传入数据进行编码。 硬代码使用Android本身提供的MediaCodec。
注意:以下文章将专门介绍如何执行音频编码
6,包装
视频和音频在传输过程中需要定义相应的格式,以便在将其传输到另一端时可以正确地对其进行解析。
1.HTTP-FLV
在Web 2.0时代,最受欢迎的网站类型自然是国外的Youtube,中国的优酷和土豆网。 可以说由这些站点提供的视频内容各有千秋,但是它们都毫无例外地将Flash用作视频播放载体。 支持这些视频站点的技术基础是Flash视频(FLV)。 FLV是一种全新的流媒体视频格式,它利用网页上广泛使用的Flash Player平台将视频集成到Flash动画中。 换句话说,只要网站的访问者可以观看Flash动画,他们自然就可以观看FLV格式的视频,而无需安装其他视频插件。 FLV视频的使用为视频分发带来了极大的便利。
HTTP-FLV将音频和视频数据封装到FLV中,然后通过HTTP协议将其传输到客户端。 作为上传者,仅需要将FLV格式的视频和音频传输到服务器。
一般来说,FLV格式的视频和音频通常使用h264格式的视频,而音频通常使用AAC-LC格式。
FLV格式是先发送FLV标头信息,然后发送带有视频和音频参数(元数据)的元数据,然后发送视频和音频参数信息,然后发送视频和音频数据。
注意:以下文章将详细描述FLV
2.RTMP
RTMP是实时消息协议的缩写。 该协议基于TCP,是一个协议集群,包括RTMP基本协议和RTMPT / RTMPS / RTMPE和许多其他变体。 RTMP是一种用于实时数据通信的网络协议。 它主要用于Flash / AIR平台与支持RTMP协议的流媒体/交互式服务器之间的音频,视频和数据通信。
RTMP协议是Adobe发布的一种实时传输协议,主要用于基于flv格式的音频和视频流的实时传输。 在获取编码的视频和音频数据之后,首先需要进行FLV打包,然后将其打包为rtmp格式,然后进行传输。
要使用RTMP格式进行传输,您需要首先连接到服务器,然后创建一个流,然后发布该流,然后传输相应的视频和音频数据。 整个传输由消息定义,rtmp定义了各种形式的消息,为了更好地发送消息,将消息划分为块,这使整个协议更加复杂。
注意:以后的文章将详细介绍RTMP
协议还有其他几种形式,例如RTP等。一般原理相似,因此我不会一一解释。
7.网络处理不良
视音频可以在良好的网络下及时发送,而不会造成本地视音频数据的积累,直播效果流畅,时延小。 在恶劣的网络环境中,如果无法发送音频和视频数据,则需要处理音频和视频数据。 在恶劣的网络环境中,通常有四种处理视频和音频数据的方法:缓冲区设计,网络检测,帧丢失处理和比特率降低处理。
1.缓冲设计
视频和音频数据被传输到缓冲区,发送方从缓冲区获取数据并将其发送,从而形成异步的生产者-消费者模式。 生产者只需要将收集和编码的视频和音频数据推送到缓冲区,而消费者则负责从缓冲区中取出数据并将其发送。
视频和音频缓冲区
上图中仅显示了视频帧,并且显然内部有相应的音频帧。 为了构建异步的生产者-消费者模型,Java提供了一个很好的类。 由于帧丢失,插入,删除等需要稍后处理,因此显然LinkedBlockingQueue是一个很好的选择。
2.网络检测
网络处理不佳过程中的一个重要过程是网络检测。 当网络变差时,可以快速检测到它,然后进行相应的处理。 这将使网络响应更加敏感,效果会更好。
我们每秒计算输入缓冲区中的数据,并实时发送数据。 如果发送的数据小于输入缓冲区中的数据,则网络带宽不好。 此时,缓冲区中的数据将继续增加。 激活相应的机制。
3.丢帧处理
当检测到网络降级时,帧丢失是一种很好的响应机制。 视频编码后,有关键帧和非关键帧。 关键帧是完整的图片,非关键帧描述了图像的相对变化。
丢帧策略可以自己定义。 需要注意的一件事是:如果要放置P帧(非关键帧),则需要在两个关键帧之间放置所有非关键帧,否则将发生拼接。 丢帧策略的设计取决于需求,您可以自己设计。
4.代码减少率
在Android中,如果使用硬编码进行编码,则在恶劣的网络环境中,我们可以实时更改硬编码的比特率以使直播更加流畅。 当检测到网络环境较差时,我们还可以在丢帧的同时降低视频和音频的比特率。 当Android sdk版本大于或等于19时,您可以将参数传递给MediaCodec来更改来自硬编码编码器的数据的比特率。
捆绑包比特率= new Bundle(); bitrate.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE,bps * 1024);
mMediaCodec.setParameters(bitrate);
8.发送
经过各种处理后,数据最终需要发送出去,这一步比较简单。 无论是HTTP-FLV还是RTMP,我们都使用TCP建立连接。 在进行实时广播之前,您需要通过套接字连接到服务器,以验证是否可以连接到服务器。 连接后,使用此套接字将数据发送到服务器,并在发送数据后关闭套接字。
|
输入电子邮件以获取惊喜
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org ->荷兰语
sq.fmuser.org ->阿尔巴尼亚人
ar.fmuser.org ->阿拉伯语
hy.fmuser.org - >亚美尼亚
az.fmuser.org ->阿塞拜疆
eu.fmuser.org ->巴斯克
be.fmuser.org ->白俄罗斯语
bg.fmuser.org - >保加利亚
ca.fmuser.org ->加泰罗尼亚语
zh-CN.fmuser.org ->中文(简体)
zh-TW.fmuser.org - >中国(繁体)
hr.fmuser.org ->克罗地亚语
cs.fmuser.org ->捷克
da.fmuser.org ->丹麦语
nl.fmuser.org - >荷兰
et.fmuser.org ->爱沙尼亚语
tl.fmuser.org ->菲律宾
fi.fmuser.org ->芬兰语
fr.fmuser.org - >法国
gl.fmuser.org ->加利西亚语
ka.fmuser.org ->乔治亚
de.fmuser.org ->德语
el.fmuser.org - >希腊
ht.fmuser.org ->海地克里奥尔语
iw.fmuser.org ->希伯来语
hi.fmuser.org ->印地语
hu.fmuser.org - >匈牙利
is.fmuser.org ->冰岛语
id.fmuser.org ->印尼语
ga.fmuser.org ->爱尔兰
it.fmuser.org - >意大利
ja.fmuser.org ->日语
ko.fmuser.org ->韩文
lv.fmuser.org ->拉脱维亚
lt.fmuser.org - >立陶宛
mk.fmuser.org ->马其顿语
ms.fmuser.org ->马来语
mt.fmuser.org ->马耳他语
no.fmuser.org - >挪威
fa.fmuser.org ->波斯语
pl.fmuser.org ->波兰语
pt.fmuser.org ->葡萄牙语
ro.fmuser.org - >罗马尼亚
ru.fmuser.org ->俄语
sr.fmuser.org ->塞尔维亚语
sk.fmuser.org ->斯洛伐克
sl.fmuser.org - >斯洛文尼亚
es.fmuser.org ->西班牙语
sw.fmuser.org ->斯瓦希里语
sv.fmuser.org ->瑞典语
th.fmuser.org - >泰国
tr.fmuser.org ->土耳其语
uk.fmuser.org ->乌克兰语
ur.fmuser.org ->乌尔都语
vi.fmuser.org - >越南
cy.fmuser.org ->威尔士语
yi.fmuser.org - >意第绪语
FMUSER更轻松地传输视频和音频!
联系我们
分类目录
订阅电子邮件