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

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

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

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


相关文章
|
1月前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
75 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
1月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
90 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
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积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
73 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
6月前
|
监控 Unix 应用服务中间件
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
|
2月前
|
Web App开发 网络协议 Android开发
Android平台一对一音视频通话方案大比拼:WebRTC VS RTMP VS RTSP,谁才是王者?
【9月更文挑战第4天】本文详细对比了在Android平台上实现一对一音视频通话时常用的WebRTC、RTMP及RTSP三种技术方案。从技术原理、性能表现与开发难度等方面进行了深入分析,并提供了示例代码。WebRTC适合追求低延迟和高质量的场景,但开发成本较高;RTMP和RTSP则在简化开发流程的同时仍能保持较好的传输效果,适用于不同需求的应用场景。
169 1
|
3月前
|
编解码 安全 Ubuntu
Android Selinux 问题处理笔记
这篇文章是关于处理Android系统中SELinux权限问题的笔记,介绍了如何通过分析SELinux拒绝的日志、修改SELinux策略文件,并重新编译部署来解决权限问题,同时提供了一些SELinux的背景知识和实用工具。
83 0
|
6月前
|
安全 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在线视频。
115 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
5月前
|
Java API Android开发
技术经验分享:Android源码笔记——Camera系统架构
技术经验分享:Android源码笔记——Camera系统架构
60 0
|
6月前
|
Java 测试技术 开发工具
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
|
6月前
|
设计模式 缓存 前端开发
真的强!借助阿里技术博主分享的Android面试笔记,我拿到了字节跳动的offer
真的强!借助阿里技术博主分享的Android面试笔记,我拿到了字节跳动的offer