音视频开发
音频基础
采样数据格式
采集到模拟信号,然后通过 ADC(模数转换)将模拟信号转换成数字信号以后,再通过 PCM(Pulse Code Modulation)脉冲编码调制对连续变化的模拟信号进行采样、量化和编码转换成离散的数字信号
PCM 文件就是未经封装的音频原始文件,在输出之前,需要转换一下。这些数据的格式我们通常称之为采样数据格式
采样频率
PCM 数据的输入和输出是需要有一个频率的
- 8000 Hz 主要是电话通信时用的采样率
- 11025 Hz、22050 Hz 主要是无线电广播用的采样率
- 44100 Hz 常用于音频 CD,MP3 音乐播放等场景
- 48000 Hz 常用于 miniDV、数字电视、DVD、电影和专业音频等设备中
声道与布局
除了左声道、右声道,还有立体声等,当我们听到的音频声道比较多,比如听交响乐的时候,立体感会尤为明显
采样位深度
决定了声音的动态范围,常见的 16 位(16bit)可以记录大概 96 分贝(96dB)的动态范围,位数越多,保真程度越高
码率
用 bps(bits per second)来表示,也就是每秒钟有多少位数据
编解码
- MP3
- AAC
流媒体
推流
本地客户端产生流 -> rtmp服务器 -> 客户端
ffmpeg
应用场景:
- Remuxing:统一编解码
- Transcoding:转码
- 推流
音视频分析
# 分析视频格式
.\ffprobe.exe D:\转笔视频\2017合片\转笔探讨2017转笔合片.mp4 -show_format
[FORMAT]
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=166.848000
size=211236984
bit_rate=10128355
probe_score=100
TAG:major_brand=mp42
TAG:minor_version=0
TAG:compatible_brands=mp42mp41
TAG:creation_time=2017-01-26T12:13:08.000000Z
[/FORMAT]
# 分析音频内容
.\ffprobe.exe D:\转笔视频\2017合片\转笔探讨2017转笔合片.mp4 -show_streams
[STREAM]
index=0 //流的索引号
codec_name=h264 //流的编码名
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 //流的编码详细描述
profile=High //流的profile
codec_type=video //流的codec类型
codec_tag_string=avc1 // 流的codec tag 字符串
codec_tag=0x31637661 // 流的codec tag,也是字符串,只不过以16进制方式存储
width=1920 //视频的宽,流内容部分
height=800 //视频的高,流内容部分
coded_width=1920 // 编码视频的宽,编解码时的部分,对齐的数据,显示时不用
coded_height=800 // 编码视频的高,编解码时的部分,对齐的数据,显示时不用
has_b_frames=2 // IPB 帧排列时两个P之间包含两个B
sample_aspect_ratio=1:1 //像素点采样比例
display_aspect_ratio=12:5 // 显示图像比例
pix_fmt=yuv420p // 像素点格式
level=40 // 与profile一起出现,对应的是参考标准中有对应的参数描述
color_range=unknown //调色必备参数
color_space=unknown //调色必备参数
color_transfer=unknown //调色必备参数
color_primaries=unknown //调色必备参数
field_order=progressive // 隔行扫描逐行扫描标识
r_frame_rate=24/1 // 实际帧率
avg_frame_rate=24/1 // 平均帧率
time_base=1/24 //时间基,通常和帧率有对应关系
start_pts=0 // 开始时间戳
start_time=0.000000 // 开始时间
duration_ts=17620 //duration 时间戳
duration=734.166667 // duration 时间
bit_rate=7862427 // 码率
max_bit_rate=N/A // 最大码率
bits_per_raw_sample=8 // 原始数据每个采样占位
nb_frames=17620 // 总帧数
extradata_size=42 // extradata 大小
TAG:language=eng // 这个是TAG,主要是展示语种
TAG:handler_name=VideoHandle // 句柄名
TAG:vendor_id=FFMP // 生成MP4文件的工具
TAG:encoder=libx264 // 视频编码器标识
[/STREAM]
# 可以将音视频的所有包都列出来
.\ffprobe.exe D:\转笔视频\2017合片\转笔探讨2017转笔合片.mp4 -show_packets
# 分析音视频帧
.\ffprobe.exe D:\转笔视频\2017合片\转笔探讨2017转笔合片.mp4 -show_frames
ffmpeg公共参数
通用:
- -codec、
- -c
- -f
- -ss 定位文件的开始时间
- -t 来规定输出文件时间长度
视频操作:
- -r:v 设置视频的帧率
- -vb 设置视频码率
- -vframes 设置视频输出的帧数
- -aspect 设置视频的宽高比
- -vn 关闭视频流处理操作,也就是屏蔽视频流
- -vf 给视频做简单滤镜处理,简单滤镜处理一般不支持多图层、多输入、多输出的滤镜
音频操作:
- -ar 设置音频采样率
- -ab 设置音频码率
- -aframes 设置音频输出的帧数
- -ac 设置音频的声道数量
- -an 关闭音频流处理操作,也就是屏蔽音频流
- -af 给音频做简单滤镜处理,简单滤镜处理一般不支持多图层、多输入、多输出的滤镜
- -vol 设置音频的音量