数字逻辑(五)——用二进制来表示音频和视频

news/2024/12/23 17:12:21/

目录

1. 用二级制来表示音频 

1.1 采样

1.2 量化

1.3 编码

2. 用二进制来表示视频

2.1 使用二进制来存储文件

2.2 使用二进制来采集视频

2.3 计算机如何播放视频


1. 用二级制来表示音频 

声音是由物体的振动来表示的,振动是一种连续的波形,因此声音信息是一种模拟信号。但是计算机所能够表示的信息都是离散的,只能处理离散的数字信号,因此需要对于声音进行一定的处理,将模拟信号转换为数字信号。

其中最重要的有三步:采样、量化和编码。流程如下所示:

图1 用二进制表示音频过程图

1.1 采样

采样是将模拟信号转换为数字信号的第一步,通过固定间隔内”捕捉“音频信号的平均值来完成这一目标。

对于一段连续的音频,首先将其拆分为很多份的,每一份都需要记录一个平均振幅。每秒采集样本的次数称为采样率,通常是以赫兹(Hz)位单位。拆分的过程中通常会产生信息丢失,因此采样率越大,信息丢失越小,音频的还原程度越高,但同时也会增加数据量。计算机中使用二进制来表示一个采样点的振幅,例如8位的二进制来表示一个采样点振幅,可以使用0~255来表示一个振幅级别。使用16位的二进制来表示一个采样点,可以使用0~65535来表示一个振幅级别。

 如下图所示这是一个连续的模拟信号(仅作演示使用,实际上的音频文件比此图要复杂得多):

图2 连续的模拟信号图

 对上图进行声音信号的采样后为:

图3 对于声音信号的采样图

如何比较振幅的大小呢?如下图中,在水平方向上,每一个线段表示一个频段,从左到右的的频率是逐渐增大的。(从图中不能直接观察到);而在竖直方向上,线段的高度越高,那么表示振幅(即表示响度)越大。这是某个时刻的频谱图,将所有时刻的声音连接到一起就成为一个完整的音频文件。

图4 某时刻音频文件各个频段的振幅

1.2 量化

采样过后,需要对于声音的进行量化,量化过程是模拟信号到数字信号的转变。通过数字转换器(ADC)转化,量化过程是将采样的幅度映射到有限数量的离散值。

如下所示图5转换为为离散的音频信号:

图5 离散的音频信号图

 之后再完全转换成了离散的数字信号:

图6 转换为数字信号示意图

到此已经完成了对于音频的采样和转换的过程,波形的模拟信号完全转换为了离散的数字信号图。

在有的计算机的录音机软件,会显示相关声音的音频信号图,例如下面是在计算机的录音机中得到一段音频:

图7 计算机的录音机的音频信号图

1.3 编码

编码过程就是将量化之后的数字信号转换为储存和处理的形式。这个过程就是将二进制数据写入文件当中。常见的音频文件包括:mp3文件、FLAC文件和WMA文件。例如这种MP3文件的形式:

图8 mp3文件图

同时,也可以进行相反的过程,将一个音频的二进制文件转换相应的音频波形图。在计算机中,可以利用Python代码对于对于二进制的音频文件进行读取,再对于画出转换后的模拟信号的波形图。如下所示为Python的代码:

import numpy as np
import matplotlib.pyplot as plt# 读取音频二进制文件
with open('audio.bin', 'rb') as file:data = file.read()# 将二进制数据转换为音频波形数据
audio_data = np.frombuffer(data, dtype=np.int16)# 绘制音频波形图
plt.figure(figsize=(10, 4))
plt.plot(audio_data)
plt.xlabel('Sample')
plt.ylabel('Amplitude')
plt.title('Audio Waveform')
plt.show()

现在可以尝试将bin文件通过Python语言就行读取(音频原件来源于:音频)。将原先下载的wav文件转换为bin文件的格式(wav文件可以转换为bin文件),然后运行上面代码,运行结果如下所示:

图9 将音频二进制文件转换为音频波形图

可以看到上面的bin文件中的二进制变为音频波形图,可以见到计算机成功将二进制的数字信号变成了声音的模拟信号。

2. 用二进制来表示视频

2.1 使用二进制来存储文件

视频由一系列静态图片组成,图片通过快速连续的播放,让观看者感觉不到运动。当一系列静态图像以足够快的速度连续显示时,人眼无法区分它们之间的间隔,因此会感知到连续的运动。

帧(Frame)是视频序列中的单个静止图像。每一帧捕获了视频在特定时间点的画面。视频是由一系列连续的帧组成的。当这些帧以一定的速率(帧率)连续播放时,由于人眼的视觉暂留效应,它们会形成一个连续运动的错觉。

帧率(Frame Rate),又称为帧速率,值的是每一秒播放的视频的帧数,以”帧每秒“(frame per second,简写为fps)为单位,常见的帧率为24fps(应用于电影领域)、25fps(欧洲和中国的电视传播领域)、30fps(北美、南亚和日本的电视和互联网视频)、60fps和120fps等等,24fps指的是每秒播放24幅静态图像,即每秒播放24帧。帧的速率越高,那么视频播放越流畅,帧数越低的视频,可以带来电影的质感。

而计算机中的分辨率为显示器和图像在单位面积内包含的像素数量,通常以横向和纵向的像素点来衡量。一般来说,像素越多,那么分辨率越大,图像越清晰,图像文件也就越大。常见的分辨率博包括VGA、SVGA、XGA、SXGA、WUXGA等。VGA(640×680)是IBM计算机的一种显示标准;SVGA(800×600),专指800×600的分辨率;WUXGA(1920×1200),UXGA的宽屏幕版,必须需要足够大的屏幕。

在分辨率后面有个后缀,例如1080P,这个后缀通常有P、K和MP,分别表示不同的意思。

  • P:表示“视频像素的总行数”,例如:720P和1080P,720P表示视频行数为720,1080P表示的是视频行数为1080。1080P的镜头通常是1940×1080。
  • K:表示“视频像素的总列数”,例如:4K,表示的是视频一共有4000列的像素,具体可能是3940列或者4096列。
  • MP:表示视频像素总和,是像素的行数与列数相乘的结果。

下面手机视频剪辑软件中的界面如下所示:

图10 手机视频剪辑界面示意图

在上面的内容中包括分辨率为1080P,表示视频像素的行数为1080行;下面有连续图像帧,最下面作为视频配乐的音频。这些都是这个视频中基本信息。

视频文件为什么比图片文件大得多,对于图片来说,只包含单幅图片的信息,而对于视频文件来说,而视频文件包含一系列连续的图像帧以及音频信息,假设一个视频是 24fps(每秒 30 帧),时长为 1 分钟,分辨率也是 1920×1080,那么它就包含 24×60 = 1440 帧图像。

2.2 使用二进制来采集视频

采集完整的视频的过程和包括采样和编码两个过程。如下所示:

图11 使用二进制来采集视频过程图

视频采集过程可以使用多种设备进行采集,包括摄像头、录屏软件等等。在采集完成之后,需要对于文件进行编码,常见的编码方式包括H.264/AVC 和 H.265/HEVC 等,这些方式通常利用数据的空间冗余和时间冗余进行压缩。

2.3 计算机如何播放视频

当用户需要播放视频时,首先打开视频编译器对于视频进行解码,读取视频的编译信息,然后采用的编码标准(如H.264)通过相应的解码器将压缩的数据还原为原始的视频帧数据。

之后使用GPU(图形处理单元)或者CPU(中央处理器)进行渲染,最终将处理过后的视频帧传递到屏幕缓冲区,最后视频帧显示在屏幕上。

利用二进制播放视频的流程图如下图所示:

图12 计算机播放视频文件的流程图

http://www.ppmy.cn/news/1557522.html

相关文章

Django-视图

这里的视图的文件是view.py的文件: django 项目中视图就相当于 python 函数或者类;django 接收到浏览器发送的请求之后,进行 URL 匹配,找到对应的视图进行响应。 视图中第一个参数必须是 HttpRequest 的对象(正常情况下,默认写为 request) 视图中必须返回一个 HttpResp…

基于springboot的电影订票系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的电影订票系统,java项目…

构建简洁之美:我的第一个前端页面

实现界面效果 1. HTML示例代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><link rel"stylesheet…

【唐叔学算法】第18天:解密选择排序的双重魅力-直接选择排序与堆排序的Java实现及性能剖析

引言 在数据排序的世界里&#xff0c;选择排序是一类简单而直观的算法&#xff0c;它通过不断选取未排序部分中的最小&#xff08;或最大&#xff09;元素来逐步构建有序序列。今天&#xff0c;我们将深入探讨两种基于选择思想的排序方法——直接选择排序和堆排序&#xff0c;…

matlab Patten的使用(重要)(Matlab处理字符串一)

原文连接&#xff1a;https://www.mathworks.com/help/releases/R2022b/matlab/ref/pattern.html?browserF1help 能使用的搜索函数&#xff1a; contains确定字符串中是否有模式matches确定模式是否与字符串匹配count计算字符串中模式的出现次数endsWith确定字符串是否以模式…

vue中高德地图api的使用

在我们使用高德地图的时候&#xff0c;官方给我们推荐了很多案例&#xff0c;但是这些案例都是使用原生方法接入&#xff0c;并没有提供 vue 或者 react 的demo&#xff0c;vue2的接入网上也很多人都有写过&#xff0c;今天我们就来看看 vue3 如何使用常用的高德地图api。前置工…

量化交易——RSI策略(vectorbt实现)

本文为通过vectorbt&#xff08;以下简称vbt&#xff09;实现量化交易系列第一篇文章&#xff0c;通过使用vbt实现RSI策略从而熟悉其代码框架。 关于本文所使用数据的说明 由于vbt官方文档提供的入门案例使用的数据是通过其内置的yfinance包获取&#xff0c;在国内无法直接访…

电商数据采集电商,行业数据分析,平台数据获取|稳定的API接口数据

电商数据采集可以通过多种方式完成&#xff0c;其中包括人工采集、使用电商平台提供的API接口、以及利用爬虫技术等自动化工具。以下是一些常用的电商数据采集方法&#xff1a; 人工采集&#xff1a;人工采集主要是通过基本的“复制粘贴”的方式在电商平台上进行数据的收集&am…