美文网首页
音视频开发第一步

音视频开发第一步

作者: 李周 | 来源:发表于2020-02-16 19:41 被阅读0次

    《音视频开发进阶指南》是我第一次了解到音视频开发内在的小细节,书中很多还难以理解的内容,不过循序渐进不要慌嘛,慢慢进入这个充满魅力的音视频开发的世界。

    压缩编码格式

    音频
    音频裸数据PCM(Pulse Code Modulation)脉冲编码调制。压缩编码的原理实际上是压缩掉亢余信号,亢余信号是指不能被人耳感到的信号,包含人耳听觉范围之外的音频信号以及被掩蔽掉的音频信号等。几种常用的压缩编码格式:

    ① WAV编码

    WAV编码的一种实现就是在PCM数据格式前面加上44字节。

    WAV编码

    完全没有压缩的实现方式导致该形式音质非常好,占用大量内存导致只适用于多媒体的开发中间文件、保存音乐和音效素材。

    ② MP3编码
    MP3编码

    具有不错的压缩率,适用于高比特率下对兼容性有要求的音乐。

    ③ AAC编码

    AAC是新一代的音频有损压缩技术,通过一些附加的编码技术(比如PS、SBR等),衍生出了LC-AAC、HE-AAC、HE=AAC v2三种主要的编码格式。


    AAC编码

    适用于128kbit/s以下的音频编码,多用于视频中的音频轨编码。

    ④ Ogg编码

    在各种码率下都有比较优秀的表现,尤其是在中低码率场景下。Ogg有着非常出色的算法,可以用更小的码率达到更好的音质,128kbit/s的Ogg比192kbit/s甚至更高码率的MP3还要出色。但是无论是软件上还是硬件上受支持情况都不是很好。


    Ogg编码

    视频

    ISO标准 Motion JPEG即MPEG

    MPEG算法适用于动态视频的压缩算法,除了对单幅图像进行编码外,还利用图像序列中的相关原则去除亢余,这样可以大大提高视频的压缩比。


    ITU-T制定标准
    H.261、H.262、H.263一系列视频编码标准。

    两者又联合制定了H.264,又称为MPEG-4 Part10等。

    视频裸数据表示中为什么要使用YUV而不是RGB?
    对于视频帧的裸数据表示,更多使用的是YUV数据格式的表示,主要是应用于优化彩色视频信号的传输,以及向后兼容老式黑白电视,而使用YUY格式而不是RGB格式的主要原因是:

    • RGB格式不利于压缩(每个像素都有三个小像素,而且必须同时传输)
    • 眼睛对于亮和暗的分辨率要比对颜色的分辨率更精细,所以在视频数据的存储中,没有必要存储所有的颜色值。Y留给黑白信号(被称为“亮度”),UV用于色度的描述。
    FFMpeg

    FFMpeg简介

    FF: Fast Forward
    Mpeg: 视频编码标准MPEG
    

    FFMpeg是一套可以用来记录、处理数字音频、视频,并将其转换为流的开源框架。

    FFMpeg编译

    FFmpeg编码库加入FDK-AAC、LAME、X264的静态库和头文件:
    LAME
     源代码: https://sourceforge.net/projects/lame/files/lame/
     sh脚本: https://github.com/kewlbear/lame-ios-build
    X264
     源代码: https://www.videolan.org/developers/x264.html
     sh脚本: https://github.com/kewlbear/x264-ios
    FDK-AAC
     源代码: https://github.com/mstorsjo/fdk-aac
     sh脚本: https://github.com/kewlbear/fdk-aac-build-script-for-iOS
    

    编译sh脚本的方式:

    sudo sh (sh脚本名).sh
    

    在编译前确认脚本的路径配置正确,不然会提示"无法找到其中一个文件":


    FFmpeg 命令行

    • ffprobe:查看媒体文件格式的工具
    ffprobe (文件名).mp3
    

    ① ffprobe 和 Apple clang verison介绍
    ② configuration设置的配置
    ③ 具体信息

    • Metadata 元数据

    • Duration 时长 , start 开始时间 ,bitrate 比特率

    • stream #0: 音频流 采样率 立体音 fltp(float,4bit,planner平铺格式)这路流的比特率为 320kb/s

    • stream #1: 视频流 编码格式为mjpeg,每帧的数据表示是yuvj420p 宽高 363 * 363

    • ffplay: 媒体文件播放器

    ffplay Modern_family.mp4 -loop 10 //重复播放 10遍
    

    选择播放流

    ffplay Modern_family.mp4 -ast 1 //播放视频中的第一路音频流,如果没有第一路音频流,则会静音
    

    选择音画同步的对齐方式

    ffplay Modern_family.mp4 -sync audio //指定以音频为基准进行音画同步(默认方式)
    

    注意: 使用 外部时钟作为基准时,会导致在一些快进或后退操作时出现音画不同步的问题。

    播放PCM裸音频数据

    ffplay (文件名).pcm -f s16le -channels 2 -ar 44100
    

    在播放PCM时没有设置-f(格式)、-channels(声道数)、-ar(采样率)等,是无法进行正确播放的,且会报错:

    .pcm: Invalid data form when processing input
    
    • ffmpeg: 媒体文件转换工具

    实现音视频轨分离

    ffmpeg -i (文件名).mp4 -vn -acodec copy output.m4a
    

    -i fmt:指定输入文件名 -vn:取消视频的输出 -acodec copy: 音频强制使用codec编解码方式)

    ffmpeg -i (文件名).mp4 -an -vcodec copy output.mp4
    

    -an:取消音频的输出 -acodec copy: 视频强制使用codec编解码方式)

    裁剪一段视频的时长

    ffmpeg -i (文件名).mp4 -ss 46.0 -codec copy -t 1127 output.mp4
    

    -ss 46.0(或 00:00:46.0) -t 1127: 从46秒开始裁剪1127秒的时间

    图片处理

    ① 转换成gif图片格式

    ffmpeg -i (文件名).mp4 -vf scale=200:-1 -t 4 -r 10 image.gif
    

    -vf scale=100:-1 :按照分辨比例不动宽度改为200,并且只处理前4秒(-t),按照10的帧率(-r)


    ② 生成一张图片

    ffmpeg -i frame_%d.jpeg -r 5 output.gif
    

    音频处理
    ① 将音频a.mp3 MP3转换为WAV
    ffmpeg -i (文件名).mp3 -acodec pcm_s16le output.wav
    

    使用原mp3文件的声道数(-ac) 和 采样数(-ar)

    ② 将音频a.wav的音频降低
    ffmpeg -i (文件名).wav -af ‘volume=0.5’ output.wav
    
    ③将音频a.wav作为背景音添加到视频的音频轨b中:
    ffmpeg -i (文件名a).wav -i (文件名b).m4a -filter_complex amix=inputs=2:duration=shortest output.wav
    

    将(a).wav 和 (b).m4a文件进行合并,按照时间长度较短的音频文件的时间长度作为最终输出output.wav的时间长度

    视频处理

    ① 淡入淡出效果
    ffmpeg -i (文件名).wav -filter_complex afade=t=in:ss=0:d=2 output.wav
    

    afade=t=in: / afade=t=out: 效果处理

    遍历整个视频帧逐帧处理:


    逐帧处理

    相关文章

      网友评论

          本文标题:音视频开发第一步

          本文链接:https://www.haomeiwen.com/subject/obymfhtx.html