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

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

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

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


相关文章
|
3月前
|
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配置以确保顺利运行。
152 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
3月前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
287 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
1天前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
9 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
3月前
|
监控 Unix 应用服务中间件
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
|
2月前
|
Java API Android开发
技术经验分享:Android源码笔记——Camera系统架构
技术经验分享:Android源码笔记——Camera系统架构
31 0
|
3月前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
72 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
3月前
|
Java 测试技术 开发工具
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
|
3月前
|
设计模式 缓存 前端开发
真的强!借助阿里技术博主分享的Android面试笔记,我拿到了字节跳动的offer
真的强!借助阿里技术博主分享的Android面试笔记,我拿到了字节跳动的offer
|
3月前
|
Java Android开发 设计模式
flutter音视频开发,Android开发需要学什么
flutter音视频开发,Android开发需要学什么
|
3月前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
348 1