zoukankan      html  css  js  c++  java
  • ffmpeg architecture(上)

    ffmpeg architecture(上)

    目录

    • 视频-您看到的是什么!
    • 如果您有一系列图像序列,并以给定的频率(例如每秒24张图像)进行更改,则会产生运动错觉。总之,这是视频背后的基本概念:一系列以给定速率运行的图片/

     

    音频-您在听什么!

    尽管静音的视频可以表达各种感觉,但是添加声音可以为体验带来更多乐趣。

    声音是指压力波通过空气或任何其他传输介质(例如气体,液体或固体)传播的振动。

    在数字音频系统中,麦克风将声音转换为模拟电信号,然后通常使用脉冲编码调制(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,有时更新的容器提供现代必需的功能。

    怎么样?将转换mp4webm

    $ 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速率控制的必读/执行的系列文章

    转换中

    什么?从一种分辨率转换为另一种分辨率的行为。如前所述,转换通常与转换一起使用。

    为什么?原因与移转大致相同。

    怎么样?将转换1080p480p分辨率。

    $ 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制作/编辑一些视频,您当然可以专业地使用它。

  • 相关阅读:
    [React] Broadcaster + Operator + Listener pattern -- 20. useBroadcaster & useListener Example
    [React] Broadcaster + Operator + Listener pattern -- 19. useBroadcaster & useListener
    [Javascript] Broadcaster + Operator + Listener pattern -- 18. Create a Win Condition with a mapDone Operator
    [Typescript Unit testing] Error Handling with Unknown
    [Typescript v3.9] ts-expect-error
    [Typescript v4.1] Template type literals
    Everything you need to know about Multi-Cloud Architecture
    几款开源NTA/IPS/NDR工具的简单比较
    安全技术研究:三大微隔离架构有何区别
    数学专业劝退指南
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/13291348.html
Copyright © 2011-2022 走看看