Android中的音视频(1)|青训营笔记(一)

简介: 关于音视频,我们需要先了解如下的知识

前言

关于音视频,我们需要先了解如下的知识

像素

1.webp.jpg

如上的点阵图,每一幅图片都是由若干个不同颜色的点组成的,这其中的每一个点叫做一个像素。其颜色值一般由RGB表示

RGB

所谓RGB,是表示颜色值的的一种格式。其原理也是基于三原色,R G B 分别代表的是Red、Green、Blue,其数值表示对应颜色的强度。这三者每一个的取值范围为:0-255

我们可以在这个网站体验 RGB 的变化 Color Wheel - Color Calculator | Sessions College

其实我们在开发中多使用到的 HEX 值,这是 RGB 的十六进制表示。在上面的网站中,我们小范围拖动浮标,可以看到会有对应一个色域的值是不变的,这也验证了这是基于三原色来创造了RGB值。

1.webp.jpg

分辨率

分辨率是指纵横方向的像素数量,一般是长*宽。如下图所示

1.webp.jpg1.webp.jpg


较为高端的手机一般也都不会到达 2k,而是介于1080p-2k,这是因为分辨率越高就意味着手机耗电越大。

若是视频文件的分辨率为 4k ,但是设备并未达到 4k,此时设备渲染该视频时候会将其降采样,所以观影效果是一样的。

码率

码率(比特率)=bit数目/时间(s)  (单位:bps)

其表示单位时间内流媒体的bit数目,所以也可以称之为码流。事实上在网络传输中,我们也可以称之为网速

所以高比特率 => 需要高带宽(带宽不高会卡顿),低比特率 => 视频压缩模糊

FFmpeg

FFmpeg 是一个较为著名的视频处理开源工具,很多情况下,我们都会要使用到这个工具。到官网下载解压后配好环境变量,我们就可以使用cmd命令行来分析处理视频了。

1.webp.jpg

ffmpeg :视频处理工具

ffplay:视频播放工具

ffprobe:视频分析工具

将视频压缩指定大小
ffmpeg  -i  Desktop/input.mp4  -fs 10MB  Desktop/output.mp4
-fs 10 : 表示文件大小最大值为10MB
设置视频的帧率为20fps
ffmpeg  -i  Desktop/input.mp4  -r 20  Desktop/output.mp4
-r 20:表示帧率设置为 20fps
设置视频的码率
ffmpeg  -i  Desktop/input.mp4  -b:v 1M  Desktop/output.mp4
-b:v :指定视频的码率
-b:a : 指定音频的码率s
1M:码率的值 1M 表示 1Mb/s
设置视频的分辨率
ffmpeg  -i  Desktop/input.mp4  -s 1920x1080  Desktop/output.mp4
-s 1920x1080表示分辨率为1920x1080
可以结合上面的命令一起来使用
ffmpeg  -i  Desktop/input.mp4  -s 1920x1080  -b:v 1M  -r 20  Desktop/output.mp4
复制代码

上面的代码块,里面含有几种压缩视频的命令,大家可以尝试一下。

帧率

:指的是视频或者动画中的每一张画面,视频或者动画就是由一张张画面所组成。(例如胶片)

帧率:每秒的帧数。帧数越高,画面越流畅

FPS:刷新率,当刷新率太低,会感到屏幕不连贯。

当然,刷新率要匹配上帧率才能看到对应的流畅效果

1.webp.jpg

视频封装

当下的音视频都不是分离的,视频都会带有音频。事实上这两者在底层文件中是分离的,只是我们将其封装了起来,播放的时候就是同步播放的。

封装:简单来说,就是将已经编码压缩好的视频轨音频轨按照一定的格式放到一个文件中。再通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个饭盒,用来盛放饭菜的容器。

目前主要的视频容器有如下: MPG、VOB、MP4、3GP、ASF、RMVB、WMV、MOV、Divx、MKV、FLV、TS/PS等

那么他们不同的轨道是如何查看的呢?

下面我们用 ffprobe xxx.mkv 这个命令查看一下视频的信息

Input #0, matroska,webm, from 'D:\系统文件\下载\Video\Tar.mkv':
  Metadata:
    LANGUAGE        : und
    COMPATIBLE_BRANDS: isomiso2avc1mp41
    MAJOR_BRAND     : isom
    MINOR_VERSION   : 512
    HANDLER_NAME    : AudioHandler
    ENCODER         : Lavf59.27.100
  Duration: 00:05:16.26, start: 0.000000, bitrate: 304 kb/s
  Stream #0:0: Video: h264 (High), yuv420p(tv, bt709/unknown/unknown, progressive), 854x480 [SAR 1:1 DAR 427:240], 29.97 fps, 29.97 tbr, 1k tbn (default)
    Metadata:
      ENCODER         : Lavc59.37.100 libx264
      DURATION        : 00:05:16.249000000·
  Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp (default)
    Metadata:
      ENCODER         : Lavc59.37.100 libvorbis
      DURATION        : 00:05:16.261000000
复制代码

上面得到的结果可以看到时长,比特率信息。以及两个流,一个是Video,一个是Audio;对应的流也可以看到其参数信息

较为简单的一类视频就是包含了一个视频轨,一个音频轨。但是在大型的电影类视频中,是有着多类型、多语言的音轨以及多种字幕流。

1.webp.jpg

这个是电影原盘的数据,我们可以看到上面包含多种文件

一个视频流

多条音频流

多条字幕流

在网络直播或者网络播放的时候,我们可以选择把不必要的轨道去掉,可以节省流量。同时字幕流也可以全部去掉,字幕可以内嵌在视频上面或者作为外挂字幕同步播放。(其中,7.1或者5.1指的是几个喇叭的杜比音效)

音视频流是分一个个包的,接下来我们用 ffprobe -show_packet xxx.mkv 查看一下媒体的数据包的信息

[PACKET]
codec_type=audio
stream_index=1
pts=170169
pts_time=170.169000
dts=170169
dts_time=170.169000
duration=21
duration_time=0.021000
size=248
pos=6426569
flags=K_
[/PACKET]
[PACKET]
codec_type=video
stream_index=0
pts=170203
pts_time=170.203000
dts=170170
dts_time=170.170000
duration=33
duration_time=0.033000
size=64
pos=6426823
flags=__
[/PACKET]
[PACKET]
codec_type=audio
stream_index=1
pts=170190
pts_time=170.190000
dts=170190
dts_time=170.190000
duration=21
duration_time=0.021000
size=230
pos=6426894
flags=K_
[/PACKET]
[PACKET]
codec_type=video
stream_index=0
pts=170370
pts_time=170.370000
dts=170203
dts_time=170.203000
duration=33
duration_time=0.033000
size=711
pos=6427131
flags=__
复制代码

1.webp.jpg

我们可以看到音轨和视频轨是交错排布的,是混流的。

选用混流存储而不是一前一后存储的原因是为了数据的同步

音视频虽然是两个数据流独立存在的,但两个流封装之后的数据是按顺序下载的,为满足在线观看的效果,就需要数据交错排布。否则就会出现卡顿或者音画不同步。


相关文章
|
7月前
|
开发工具 Android开发 开发者
Android如何回调编码后的音视频数据
有开发者提到,在RTMP推送端的基础上,希望能回调编码后的音视频数据,便于开发者对接第三方系统,如GB28181.
|
7月前
|
编解码 监控 网络协议
Android平台音视频推送选RTMP还是GB28181?
早在2015年,我们发布了RTMP直播推送模块,那时候音视频直播这块场景需求,还不像现在这么普遍,我们做这块的初衷,主要是为了实现移动单兵应急指挥系统的低延迟音视频数据传输。好多开发者可能会疑惑,走RTMP怎么可能低延迟?网上看到的RTMP推拉流延迟,总归要2-3秒起,如果是自己实现框架,RTMP推拉流逻辑自己实现的话,延迟确实可以控制在毫秒级,这个已无需赘述。
|
7月前
|
Web App开发 数据采集 物联网
Android平台基于RTMP或RTSP的一对一音视频互动技术方案探讨
随着智能门禁等物联网产品的普及,越来越多的开发者对音视频互动体验提出了更高的要求。目前市面上大多一对一互动都是基于WebRTC,优点不再赘述,我们这里先说说可能需要面临的问题:WebRTC的服务器部署非常复杂,可以私有部署,但是非常复杂。传输基于UDP,很难保证传输质量,由于UDP是不可靠的传输协议,在复杂的公网网络环境下,各种突发流量、偶尔的传输错误、网络抖动、超时等等都会引起丢包异常,都会在一定程度上影响音视频通信的质量,难以应对复杂的互联网环境,如跨区跨运营商、低带宽、高丢包等场景,行话说的好:从demo到实用,中间还差1万个WebRTC。
|
7月前
|
监控 前端开发 网络协议
Android前端音视频数据接入GB28181平台意义
在我们研发Android平台GB28181前端音视频接入模块之前,业内听到最多的是,如何用Android或者Windows端,在没有国标IPC设备的前提下,模拟GB28181的信令和媒体流交互流程,实现GB28181整体方案的测试?
101 0
|
2天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
20 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
7月前
|
Web App开发 开发工具 Android开发
Android平台不需要单独部署流媒体服务如何实现内网环境下一对一音视频互动
我们在做内网环境的一对一音视频互动的时候,遇到这样的技术诉求:如智能硬件场景下(比如操控智能硬件),纯内网环境,如何不要单独部署RTMP或类似流媒体服务,实现一对一音视频互动。
|
6月前
|
Java Android开发
[笔记]Android 学习一之转场动画+ViewPager+ListView简单Demo
[笔记]Android 学习一之转场动画+ViewPager+ListView简单Demo
|
6月前
|
Android开发
[笔记]Android开发之相机开发 Camera1、2、X
[笔记]Android开发之相机开发 Camera1、2、X
|
7月前
|
编解码 Android开发 数据安全/隐私保护
Android平台GB28181设备接入端对接编码前后音视频源类型浅析
今天主要对Android平台GB28181设备接入模块支持的接入数据类型,做个简单的汇总: 1. 编码前数据(目前支持的有YV12/NV21/NV12/I420/RGB24/RGBA32/RGB565等数据类型),其中,Android平台前后摄像头数据,或者屏幕数据,或者Unity拿到的数据,均属编码前数据; 2. 编码后数据(如无人机等264/HEVC数据,或者本地解析的MP4音视频数据); 3. 拉取RTSP或RTMP流并接入至GB28181平台(比如其他IPC的RTSP流,可通过Android平台GB28181接入到国标平台)。
|
7月前
|
数据采集 编解码 vr&ar
Android平台实现VR头显Unity下音视频数据RTMP推送
随着技术发展的日新月异,虚拟现实产业已经从过去的探索期,自2020年起,慢慢过渡到高速发展期,随着5G时代的到来,大带宽高可靠低延迟网络环境,为虚拟现实产业提供了很好的网络保障,虚拟现实在越来越多的场景下有了应用价值,典型场景如工业互联网、虚拟仿真、文旅文博、智慧交通、智慧能源、智慧医疗、智慧校园、智慧农业等。同事,行业也对清晰度、流畅性和交互感也提出了更高的要求。本文从Android平台的采集推送为例,介绍下基于头显或类似终端的低延迟解决方案。