偶遇FFmpeg(一) —— 初了解

FFmpeg_logo.png

整体的目标

  • [ ] 完成将多张图片转换成视频。并添加背景音乐的任务。
  • [ ] 完成将音频混音到视频中的任务。
  • [ ] 完成将找到的视频合并的任务。

目前计划确定

  • [ x ] 1. 寻找Android端可以解决的方案
  • [ x ] 2. 了解方案和实现
  • [ x ] 3. 完成任务

具体内容

FFmpeg的了解

FFmpeg的介绍网上还是很多的。官网的wiki上面也有很多内容。围绕目标,主要是有两套实现的思路。早期,其实是想通过自己编写C代码,来完成整个流程的。但是无奈目前的水平有限,而且时间不够充裕。故最后的思路是通过学习现有的命令行参数,来快速完成FFmpeg的使用。但是这样的弊端也极大的,在此暂时不诉。

FFmpeg主要包含了以下几个核心的库:

  1. libavcodec-> 提供了更加全面的编解码实现的合集
  2. libavformat->2、libavformat-提供了更加全面的音视频容器格式的封装和解析以及所支持的协议
  3. libavutil->提供了一些公关的函数
  4. libavfilter->听音视频的过滤器,如视频加水印、音频变身等
  5. libavdevice->提供了支持众多设备数据的输入与输出,如读取摄像头数据、屏幕录制
  6. libswresample,libavresample->提供了音频的重采样工具
  7. libswscale->提供对视频图像进行色彩转换、缩放以及像素格式转换、如图像的YUV转换
  8. libpostproc->多媒体后处理器 从官网上下载好ffmpeg,进入FFmpeg命令行工具所在的文件夹,就开始干活。 因为直接使用cmd 是没有历史记录的,所以书内推荐使用其他的客户端来操作,但是为了便捷,则是还是使用最简单的工具。

FFmpeg Basic的学习

  1. 参考FFmpeg Basic FFmpeg封装好的命令行整体是是这样的
Command line syntax
     ffmepg [global options] [input file options] -i input_file [output file options] output_file
 [ ]中的内容是可选的参数,其他则是必填的参数。

一图比千言—CommanLine.png

  1. 使用ffmpeg进行转码 ffmpeg可以输入各种文件或者流,进行操作。整体的工作流程是解码器将未压缩的帧数据在经过filter之后,再进行编码和输出。其中很重要的一点就是它能够构造一个 filterchains 和 filtergraphs (滤镜链和滤镜图)。

转码流程.png

看了这个图,可能会问 什么是 packets ,什么是frames ,在这里暂且不表

  1. Filters,filter chains 和filtergraphs 在多媒体的进程中,filter意味着在输入文件进行编码之前将其修改的一个软件工具。他被分成音频的滤镜和视频的滤镜。FFmpeg已经内置好了多种滤镜而且能够通过多种方式结合他们使用。这样简化了媒体的进程,因为在编解码的过程中。会整体的质量。 libavfilter就是整个软件库。使用-vf 来操作视频滤镜 使用 -af来使用音频的滤镜。
Filter syntax
      [input_link_label1]...
            filter_name=parameters
                [output_link_label1]...
  #####Filterchain
      "filter1,filter2,...."
  #####Filtergraph
      "filterchain1;filterchain2;..."
  #####使用filtergraph能够有效的简化命令行。将两行变成一行
      #使用前
      ffmpeg -i input.mpg -vf hqdn3d,pad=2*iw outpt.mp4
      ffmpeg -i output.mp4 -i input.mpg -filter_complex overlay=w compare.mp4
      #使用后
      ffplay -i i.mpg -vf split[a][b];[a]pad=2*iw[A];[b]hqdn3d[B];[A][B]overlay=w
      # 将输入的i.mpg 分成[a]和[b] ;将[a]左右一个filterchains的输入,输出为[A];将[b]作为输入,输出为[B],最后再将[A][B] 通过overLay filter产生一个对比。

加上Filter之后的总体流程

  1. 媒体流的选择。
    • 许多封装格式存在多个流媒体。ffmpeg能够识别5种流。 audio(a),attachment(t),data(d),subtitle(s) and video(v)。可以通过-map后面添加这些参数来完成选择。 syntax file_number:stream_type [:stream_number] #其中file_number、stream_number都是从0开始。 #-map 0 表示选择所有 #-map i:v表示从角标为i的文件中选择所有的视频流。 -map: i:a 则是所有的音频流 # -an,-vn,-sn 简单的理解就是 剔除音频。视频。和字母(... no ..) #将A中的视频和B中的音频和C中的字幕合并到clip.mov中 ffmpeg -i A.mov -i B.mov -i C.mov -map 0:v:0 -map 1:a:0 -map 2:s:0 clip.mov
      - 除此之外,还有其他的可以定义流的信息
            #-b 可以设置音频和视频的bit rate
            ffmpeg -i input.mpg -b:a 128k -b:v 1500k outpu.mp4


![map steam 示意图.png](http://upload-images.jianshu.io/upload_images/1877190-954ea618c5f03ccc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


   4. **有用的命令。**
      将输出输出到文件当中。
          ffmpeg -help > help.txt
          ffmpeg -filters >> data.txt   #续写
   5. **概念的介绍**
   比特率、帧率和文件大小之间的关系
   #####帧率。
每秒被编码到视频文件中的帧数。人眼至少需要15fps,才能举得是一个连续的滑动。它也进程被较为一个帧的频繁度 。它的单位是Hz.LCD显示器通常是60Hz的。
```shell
    # 直接使用- r 能够制定帧率
         ffmepg -i input -r fps output
     #使用fpsfilter来指定帧率
         ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm
比特率

确定的是音频和视频总体的质量。它定义的是 每个时间单元携带的数据量。

Type

Abbreviation

Average bit rate

ABR

每秒平均的比特率。在VBR编码模式下也需要。通常用于确定的输出大小

Constant bit rate

CBR

每秒处理的比特率是相同的。这并不实际。因为在运动的处理过程中,需要更多的比特率。CBR通常用于在混合多媒体流的时候使用。

Variable bit rate

VBR

可变的比特率。简言之就是需要多的时候多,反之亦然。但是同样需要更多的cpu来处理这些判断

之前说过,通过-b就可以设定比特率。-b:v 就 可以设定视频

# 在视频通话中,因为传输的数据不能被缓存。所有需要设定
#一个固定的比特率来输出。通常需要设定三个参数。 -b -minrate -maxrate .设置maxrate的同时,还得设置一个 -bufsize来缓存。           
ffmpeg -i in.avi -b 0.5M -minirate 0.5M -maxrate 0.5M -bufsize 1M out.mkv

#为了控制文件的大小,可以使用 -fs
 ffmpeg -i -input.avi -fs 10MB output.mp4
文件大小的计算公式
  • 视频大小 video_size =vieo_birate * time_inseconds/8
  • 音频大小 (未压缩)audio_size=sampling_ratebit_depthchannelstime_in_seconds/8 (压缩)audio_size = bitrate time_in_seconds/8 最后计算的文件,应该比两个相加还略大一点。因为还有以下meta data 和overhead。

未完待续。。。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玉树芝兰

如何用Python提取中文关键词?

本文一步步为你演示,如何用Python从中文文本中提取关键词。如果你需要对长文“观其大略”,不妨尝试一下。

2402
来自专栏用户画像

2.3.2 集线器

集线器实质上是一个多端口的中继器,也可以工作在物理层。在Hub工作时,当一个端口接受到数据后,由于信号在从端口到Hub的传输过程中已有了衰减,所以Hub便将该信...

991
来自专栏ThoughtWorks

React全家桶与前端单元测试艺术|洞见

TL;DR——什么是好的单元测试? 其实我是个标题党,单元测试根本没有“艺术”可言。 好的单元测试来自于好的代码,如果说有艺术,那也是代码的艺术。 注:以下“...

3606
来自专栏应用案例

如何用Python提取中文关键词?

本文一步步为你演示,如何用Python从中文文本中提取关键词。如果你需要对长文“观其大略”,不妨尝试一下。 ? 需求 好友最近对自然语言处理感兴趣,因为他打算利...

3588
来自专栏GopherCoder

专栏:006:实战爬取博客

1752
来自专栏Python中文社区

数据挖掘实战(一):Kaggle竞赛经典案例剖析

專 欄 ❈那只猫,Python中文社区专栏作者,Python中文社区新Logo设计者,现就读于英国剑桥大学。 ❈— Load Lib ? 在这边提一下为什么要...

3277
来自专栏奇点大数据

python需要系统学习一下

1、python是脚本语言,作为程序员我觉得至少应该掌握一本通用脚本语言,因为脚本语言与编译语言的开发测试过程不同,可以极大的提高编程效率。

1422
来自专栏腾讯NEXT学位

Mobx 核心概念简单入门:以股票为例

3645
来自专栏CSDN技术头条

Apache Beam:下一代的数据处理标准

Apache Beam(原名Google DataFlow)是Google在2016年2月份贡献给Apache基金会的孵化项目,被认为是继MapReduce、G...

39810
来自专栏玉树芝兰

Python编程遇问题,文科生怎么办?

敲黑板了啊,答疑时间到。如果你没有良好的Python编程基础,在尝试应用数据科学方法时遇到了问题和困难,又不知道该如何有效解决,那么这篇文章就是为你写的。请务必...

1712

扫码关注云+社区

领取腾讯云代金券