视频

使用ffmpeg修改视频文件的分辨率

这种方法是在Linux系统(几乎任何发行版)中调整视频文件大小的最佳方法之一,也是Windows和Mac用户的绝佳替代方案。

更改视频文件的分辨率将是我们在处理视频文件时将执行的最常见操作之一,因此ffm​​peg能够完美地完成此操作。我们应该想要更改视频文件的分辨率有几个原因,例如:

  • 减少视频的大小。这可以通过降低视频的分辨率来实现。如果我们采用高清(1920×1080像素)的视频,但我们知道我们永远不会在支持比1024×768更高分辨率的屏幕上看到,我们可以降低视频分辨率以适应这种新分辨率,从而节省大量存储空间空间,如果在互联网上使用,也可以节省带宽。
  • 很多时候,视频文件的分辨率会发生变化,从而使其格式标准化。也就是说,如果我们有几个视频并且我们希望它们都在同一分辨率下,则必须经历这个改变分辨率的过程。

在现代网站的开发中,根据它们出现的位置来分辨各种分辨率的视频是非常有用的。我们可以开发具有响应式设计的网站,其中最适合用户的视频播放。例如,如果我们有各种格式的视频 – 我们说1920×1080,1280×720和640×360-我们可以设计一个响应式网站,让访问者根据访问者浏览器节省带宽重现正确的视频分辨率(请记住,移动用户通常支付传输数据,因此最好尽可能少地传输流量)

在这个例子中,我们将高清格式(1920×1080像素)的视频分辨率降低到640×360(对于宽高比16:9,这是一个相当常用的配置):

ffmpeg -i video_1920.mp4 -vf scale=640:360 video_640.mp4 -hide_banner

仅需要使用-vf scale = 640:360以新的所需分辨率(640:360)指示缩放视频滤波器  。要考虑:

  • 我们可以指出我们想要的任何分辨率,但生成的视频将始终具有相同的宽高比。也就是说,它不会扭曲图像,如果视频的宽高比为16:9,它将保持视频的16:9宽高比。该程序将调整生成的视频,使其符合我们给出的分辨率。
  • 更改分辨率时,视频必须再次进行编码过程,因此根据输出格式和用于输出的编解码器,过程可能会很慢。
  • 我们还没有提到它,但大多数时候  将视频转换为更高的分辨率  是没有意义的,因为视频质量没有任何改善。

更改视频宽高比

如果我们想要改变视频的外观,知道图像会显得扭曲,我们可以使用额外的过滤器“ setdar”。想象一下,在前一种情况下,我们想要将16:9的宽高比改为4:3,因此视频的分辨率为4:3宽高比,在这种情况下,它将是640×480。进行此转换的ffmpeg命令将是:

ffmpeg -i video_1920.mp4 -vf scale=640:480,setdar=4:3 video_640x480.mp4 -hide_banner

我们在这种情况下获得的视频输出  video_640x480.mp4  改变了原始视频的外观并且稍微扭曲了图像,但它将以新的外观获得我们想要的分辨率。

另一方面,如果我们不想依赖于使用可能

    

[总结]FFMPEG视音频编解码零基础学习方法

在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者。在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一个不可逾越的鸿沟。“大神”们水平高超,探讨着深奥的问题;而初学者们还停留在入门阶段。究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的关键:FFMPEG难度比较大,却没有一个循序渐进,由简单到复杂的教程。现在网上的有关FFMPEG的教程多半难度比较大,不太适合刚接触FFMPEG的人学习;而且很多的例子程序编译通不过,极大地打消了学习的积极性。我自己在刚开始学习FFMPEG的时候也遇到了很大的困难。为了帮助更多的人快速成为“大神”,我想总结一个学习FFMPEG的方法,方便大家循序渐进的学习FFMPEG。

PS:有不少人不清楚“FFmpeg”应该怎么读。它读作“ef ef em peg”

0. 背景知识

本章主要介绍一下FFMPEG都用在了哪里(在这里仅列几个我所知的,其实远比这个多)。说白了就是为了说明:FFMPEG是非常重要的。

使用FFMPEG作为内核视频播放器:

Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音…

使用FFMPEG作为内核的Directshow Filter:

ffdshow,lav filters…

使用FFMPEG作为内核的转码工具:

ffmpeg,格式工厂…

事实上,FFMPEG的视音频编解码功能确实太强大了,几乎囊括了现存所有的视音频编码标准,因此只要做视音频开发,几乎离不开它。

对于完全没有视音频技术背景的人来说,在学习FFmpeg之前最好先了解一下几种最基本的视音频数据的格式,可以参考下面的文章:

[总结]视音频编解码技术零基础学习方法

视音频数据处理入门:RGB、YUV像素数据处理

视音频数据处理入门:PCM音频采样数据处理

视音频数据处理入门:H.264视频码流解析

视音频数据处理入门:AAC音频码流解析

视音频数据处理入门:FLV封装格式解析

视音频数据处理入门:UDP-RTP协议解析

1. ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe)

 

【视频资源】

本文中第1,2章是FFmpeg编程最基础的内容。这部分的内容我在给大二同学代课的时候录制成了视频,有时间的话可以看一下《基于 FFmpeg + SDL 的视频播放器的制作》课程的视频

本章主要介绍一下ffmpeg工程包含的三个exe的使用方法。

ffmpeg的官方网站是:http://ffmpeg.org/

编译好的windows可用版本的下载地址(官网中可以连接到这个网站,和官方网站保持同步): http://ffmpeg.zeranoe.com/builds/

    

关于FFmpeg工具的使用总结

FFmpeg官网:http://ffmpeg.org/
安装ffmpeg:
主要参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
视频参数:
-b 设定视频流量,默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
拓展:
-strict -2 之前是实验参数表示 aac音频编码 如果不使用aac音频编码使用使其的编码好像还需要导入第三方的音频编码库 比较麻烦
    

使用FFMPEG生成HLS

使用FFmpeg生成HLS

 

HLS也就是HTTP Live Streaming,是苹果出的一个基于HTTP的流媒体通信协议。字面意思有个live,也就是直播相关的。其实HLS可以分为点播以及直播两种。后面具体说两者在处理上有什么区别。目前HLS在RFC上还只是草案,并且一直不断更新,发现ffmpeg对于HLS的实现,不同版本的实现对应rfc版本也不一样,最新版本的,对应的HLS RFC草案规范也比较新(追新并不一定好,有些设备对于新版本的规范支持还不是很完整,可能会有播放失败的问题,所以如果需要正常使用,选择一个稳定的版本即可)。rfc的草案现在到了16版本。由于项目比较敢,这规范其实我看的不多。

HLS对于音视频是有编码要求的,HLS要求视频必须是H264协议,H264是目前最流行也是最成熟的视频编解码方案了。而在音频上,则要求为MP3, HE-AAC或AC-3这三种格式。在转换成HLS流后,会生成多个的TS文件。如果是点播的话,则是对视频文件进行TS的切片处理,一般情况下,每个TS文件的播放时间为10秒。但这并不是固定的,切片的多少,这是会影响直播的延迟情况。这个后面会稍微做一些说明。

HLS会生成一个m3u8的播放文件。这个播放文件可以通过VLC等一些播放器直接播放。现在大部分手机也支持HLS了,所以手机也是可以进行对HLS的直播或点播进行观看。但是目前的桌面端浏览器尚未完全支持HTML5的HLS播放,大部分直播还是依赖flash player进行封装直播(据说国内的很多视频站有自己的播放技术)。这边主要讨论的并非是桌面端,主要还是移动端的支持。

现在简单说一下m3u8文件。以下是由ffmpeg生成的一个直播的m3u8文件:

    

[FFmpeg] ffmpeg 常用命令

1. 视频转换

比如一个avi文件,想转为mp4,或者一个mp4想转为ts。
ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts

2. 提取音频

ffmpeg -i test.mp4 -acodec copy -vn output.aac
上面的命令,默认mp4的audio codec是aac,如果不是,可以都转为最常见的aac。
ffmpeg -i test.mp4 -acodec aac -vn output.aac

3. 提取视频

ffmpeg -i input.mp4 -vcodec copy -an output.mp4

4. 视频剪切

    

流媒体:ffmpeg生成HLS的m3u8与ts片段

流媒体:ffmpeg生成HLS的m3u8与ts片段

 

转换方式一

1.直接把媒体文件转为ts

ffmpeg -i cat.mp4 -c copy -bsf h264_mp4toannexb cat.ts

2.使用segment参数进行切片

ffmpeg -i cat.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 2 cat_output%03d.ts

 

 

转换方式二

1.ffmpeg切片命令,以H264和AAC的形式对视频进行输出

ffmpeg -i