ffmpeg architecture(上)
ffmpeg architecture(上)
目录

音频-您在听什么!
尽管静音的视频可以表达各种感觉,但是添加声音可以为体验带来更多乐趣。
声音是指压力波通过空气或任何其他传输介质(例如气体,液体或固体)传播的振动。
在数字音频系统中,麦克风将声音转换为模拟电信号,然后通常使用脉冲编码调制(PCM)的模数转换器(ADC)将模拟信号转换为数字信号。

编解码器-缩小数据
CODEC是一种压缩或解压缩数字音频/视频的电子电路或软件。它将原始(未压缩的)数字音频/视频转换为压缩格式,反之亦然。 https://zh.wikipedia.org/wiki/Video_codec
但是,如果我们选择将数百万个图像打包到一个文件中并称为电影,那么最终可能会得到一个巨大的文件。让我们做一下数学:
假设我们正在创建一个分辨率为1080 x 1920(高度x宽度)的视频,并且我们将花费3 bytes每个像素(屏幕上的最小点)来编码颜色(或24位颜色,这将为我们提供16,777,216种不同的颜色),视频的播放时间24 frames per second很30 minutes长。
toppf = 1080 * 1920 // total_of_pixels_per_frame
cpp = 3 // cost_per_pixel
tis = 30 * 60 // time_in_seconds
fps = 24 // frames_per_second
required_storage = tis * fps * toppf * cpp
该视频大约需要250.28GB存储或1.11Gbps带宽!这就是为什么我们需要使用CODEC的原因。
容器-音频和视频的舒适场所
容器或包装器格式是图元文件格式,其规范描述了计算机文件中数据和元数据的不同元素如何共存。https://zh.wikipedia.org/wiki/Digital_container_format
甲包含所有流单个文件(主要是音频和视频),它也提供了同步和一般的元数据,例如标题,分辨率等
通常,我们可以通过查看文件的扩展名来推断文件的格式:例如,a video.webm可能是使用container的视频webm。
FFmpeg-命令行
完整的跨平台解决方案,用于记录,转换和流传输音频和视频。
要使用多媒体,我们可以使用称为FFmpeg的AMAZING工具/库。您已经有可能直接或间接知道/使用它(是否使用Chrome?)。
它有一个名为的命令行程序ffmpeg,这是一个非常简单但功能强大的二进制文件。例如,您可以通过输入以下命令从转换mp4为容器avi:
$ ffmpeg -i input.mp4 output.avi
我们只是在这里进行了重新混合,它正在从一个容器转换为另一个容器。从技术上讲,FFmpeg也可以进行转码,但我们稍后再讨论。
FFmpeg命令行工具101
FFmpeg确实有一个文档,可以很好地解释其工作原理。
简而言之,FFmpeg命令行程序期望以下参数格式执行其操作ffmpeg {1} {2} -i {3} {4} {5},其中:
1. 全局选项
2. 输入文件选项
3. 输入网址
4. 输出文件选项
5. 输出网址
第2、3、4和5部分可以根据需要任意设置。实际上,更容易理解此参数格式:
#警告:此文件约为300MB
$ wget -O bunny_1080p_60fps.mp4 http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_60fps_normal.mp4
$ ffmpeg \
-y \ #全局选项
-c:a libfdk_aac -c:v libx264 \ #输入选项
-i bunny_1080p_60fps.mp4 \ #输入URL
-c:v libvpx-vp9 -c:a libvorbis \ #输出选项
bunny_1080p_60fps_vp9.webm #输出网址
此命令获取mp4包含两个流(使用aacCODEC 编码的音频和使用h264CODEC 编码的视频)的输入文件,并将其转换为webm,同时更改其音频和视频CODEC。
我们可以简化上面的命令,但是请注意FFmpeg将采用或猜测您的默认值。例如,当您只键入使用ffmpeg -i input.avi output.mp4哪种音频/视频编解码器来生成output.mp4?
Werner Robitza编写了有关使用FFmpeg进行编码和编辑的必读/执行教程。
常见的视频操作
在处理音频/视频时,我们通常会对媒体执行一系列任务。
转码
什么?将其中一个流(音频或视频)从一个编解码器转换为另一个的行为。
为什么?有时某些设备(电视,智能手机,控制台等)不支持X,但Y和更新的CODEC提供更好的压缩率。
怎么样?将H264(AVC)视频转换为H265(HEVC)。
$ ffmpeg \
-i bunny_1080p_60fps.mp4 \
-c:v libx265 \
bunny_1080p_60fps_h265.mp4
什么?从一种格式(容器)转换为另一种格式的行为。
为什么?有时某些设备(电视,智能手机,控制台等)不支持X,但支持Y,有时更新的容器提供现代必需的功能。
怎么样?将转换mp4为webm。
$ ffmpeg \
-i bunny_1080p_60fps.mp4 \
-c复制\ #只是对ffmpeg说,跳过编码
bunny_1080p_60fps.webm
转换中
什么?更改比特率或产生其他再现的行为。
为什么?人们会尝试2G使用功能较弱的智能手机在(边缘)连接中观看视频,或者在fiber其4K电视上通过Internet连接观看视频,因此,您应该为同一视频提供不止一个比特率的不同版本。
怎么样?产生比特率在3856K和2000K之间的演绎。
$ ffmpeg \
-i bunny_1080p_60fps.mp4 \
-最小964K-最大3856K -bufsize 2000K \
bunny_1080p_60fps_transrating_964_3856.mp4
通常,我们将使用带有转换的转换。Werner Robitza写了另一篇有关FFmpeg速率控制的必读/执行的系列文章。
转换中
什么?从一种分辨率转换为另一种分辨率的行为。如前所述,转换通常与转换一起使用。
为什么?原因与移转大致相同。
怎么样?将转换1080p为480p分辨率。
$ ffmpeg \
-i bunny_1080p_60fps.mp4 \
-vf scale = 480:-1 \
bunny_1080p_60fps_transsizing_480.mp4
红利回合:自适应流
什么?产生多种分辨率(比特率)并将媒体拆分为多个部分并通过http服务的行为。为什么?为了提供可以在低端智能手机或4K电视上观看的灵活媒体,它还易于扩展和部署,但会增加延迟。
怎么样?使用DASH创建自适应WebM。
#个视频流
$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 160x90 -b:v 250k -keyint_min 150 -g 150 -an -f webm -dash 1 video_160x90_250k.webm
$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 320x180 -b:v 500k -keyint_min 150 -g 150 -an -f webm -dash 1 video_320x180_500k.webm
$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 640x360 -b:v 750k -keyint_min 150 -g 150 -an -f webm -dash 1 video_640x360_750k.webm
$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 640x360 -b:v 1000k -keyint_min 150 -g 150 -an -f webm -dash 1 video_640x360_1000k.webm
$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 1280x720 -b:v 1500k -keyint_min 150 -g 150 -an -f webm -dash 1 video_1280x720_1500k.webm
#音频流
$ ffmpeg -i bunny_1080p_60fps.mp4 -c:a libvorbis -b:a 128k -vn -f webm -dash 1 audio_128k.webm
#的DASH清单
$ ffmpeg \
-f webm_dash_manifest -i video_160x90_250k.webm \
-f webm_dash_manifest -i video_320x180_500k.webm \
-f webm_dash_manifest -i video_640x360_750k.webm \
-f webm_dash_manifest -i video_640x360_1000k.webm \
-f webm_dash_manifest -i video_1280x720_500k.webm \
-f webm_dash_manifest -i audio_128k.webm \
-c复制-map 0 -map 1 -map 2 -map 3 -map 4 -map 5 \
-f webm_dash_manifest \
-adaptation_sets “ id = 0,streams = 0,1,2,3,4 id = 1,streams = 5 ” \
manifest.mpd
PS:我从指令中窃取了此示例,以使用DASH播放Adaptive WebM
超越
有许多和许多其他用途的FFmpeg的。我将它与iMovie结合使用,可以为YouTube制作/编辑一些视频,您当然可以专业地使用它。
ffmpeg architecture(上)的更多相关文章
- ffmpeg architecture(下)
ffmpeg architecture(下) 第3章-转码 TLDR:给我看代码和执行. $ make run_transcoding 我们将跳过一些细节,但是请放心:源代码可在github上找到. ...
- ffmpeg architecture(中)
ffmpeg architecture(中) 艰苦学习FFmpeg libav 您是否不奇怪有时会发出声音和视觉? 由于FFmpeg作为命令行工具非常有用,可以对媒体文件执行基本任务,因此如何在程序中 ...
- indows下PHP通过ffmpeg给上传的视频截图详解
windows下PHP通过ffmpeg给上传的视频截图详解,php_ffmpeg.dll安装下载,找了很久php_ffmpeg.dll的下载地址和应用,发现有用的资源很少,现在问题解决了,贴出来跟大家 ...
- php使用ffmpeg获取上传的视频的时长,码率等信息
视频上传是程序员在很多时候需要用到的操作,然而上传完视频肯定要获得一些视频的详细信息,php本身是不支持信息获取的 ,所以采用ffmpeg第三方插件 首先你需要下载ffmpeg文件:官网地址:http ...
- java使用ffmpeg实现上传视频的转码,提取视频的截图等功能
ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用. 1.能支持的格式 ff ...
- 多媒体开发(4):在视频上显示文字或图片--ffmpeg命令
小白:我录了段视频,里面用的音乐是有版权的,而且快过期了,能把音乐去掉吗? 小程拿到视频后,一个快捷键打开命令终端,快速打下一行命令: ffmpeg -i 小白.flv -vcodec copy -a ...
- arm linux 移植 ffmpeg 库 + x264
背景 Ffmpeg 中带有h264的解码,没有编码,需要添加x264.libx264是一个自由的H.264编码库,是x264项目的一部分,使用广泛,ffmpeg的H.264实现就是用的libx264. ...
- 基于FFMPEG的跨平台播放器实现
基于FFMPEG的跨平台播放器实现 一.背景介绍 FFmpeg是一款超级强大的开源多媒体编解码框架,提供了录制.转换以及流化音视频的完整解决方案,包含了libavcodec.libavformat等多 ...
- 微信公众号开发——通过ffmpeg解决amr文件无法播放问题
今天刚好碰到个需求,要在微信浏览器中实现录音,并在其他页面上播放.录音功能本身是JS SDK的功能,倒没啥问题,然而录音的文件保存下来是amr格式,而IOS的浏览器没法播放amr(据说微信浏览器的vi ...
随机推荐
- 路由器逆向分析------QEMU的基本使用方法(MIPS)
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69258334 一.QEMU的运行模式 直接摘抄自己<揭秘家用路由器0day漏 ...
- CreateThread 线程操作与 _beginthreadex 线程安全(Windows核心编程)
0x01 线程的创建 线程不同于进程,Windows 中的进程是拥有 '惰性' 的,本身并不执行任何代码,而执行代码的任务转交给主线程,列如使用 CreateProcess 创建一个进程打开 Cmd ...
- JetBrains系列软件用法
IDEA JSON格式化 IDEA的JSON_Formatter插件,下载地址 安装方式:File->Settings->Plugins,然后选择INstall plugin from d ...
- 【python】Leetcode每日一题-二叉搜索树节点最小距离
[python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...
- 狂神说Elasticsearch7.X学习笔记整理
Elasticsearch概述 一.什么是Elasticsearch? Lucene简介 Lucene是一套用于全文检索和搜寻的开源程序库,由Apache软件基金会支持和提供 Lucene提供了一个简 ...
- [转载]libvirt(virsh命令总结)
libvirt(virsh命令总结) virsh回车进入交互式界面: version pwd hostname 显示本节点主机名 nodeinfo 显示节点信息 list --all 显示所有云主机 ...
- 面试阿里P6难在哪?(面试难点)
对于很多没有学历优势的人来说,面试大厂是非常困难的,这对我而言,也是一样,出身于二本,原本以为就三点一线的生活度过一生,直到生活上的变故,才让我有了新的想法和目标,因此我这个二本渣渣也奋斗了起来,竟拿 ...
- C++的构造函数为何不能为虚函数
1. 存储空间角度:虚函数对应一个vtable,vtable存储于对象的内存空间 若构造函数是虚的,则需要通过 vtable来调用,若对象还未实例化,即内存空间还没有,无法找到vtable 2. 使用 ...
- 5.1-5 uname、hostname、dmesg、stat、du
5.1 uname:显示系统信息 uname命令用于显示系统相关信息,比如内核版本号.硬件架构等. -a 显示系统所有相关信息 -v 显示内核版本 -m 显示计算机硬件架构 ...
- 服务器RAID配置
一.RAID介绍RAID是Redundent Array of Inexpensive Disks的缩写,直译为"廉价冗余磁盘阵列",也简称为"磁盘阵列".后来 ...