FFmpeg常见命令行(二):FFmpeg转封装

前言

在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个, 对应的要学习的内容是:如何使用FFmpeg命令行进行媒体格式的转封装


音视频任务列表

音视频任务列表: 点击此处跳转查看.


目录


1 音视频文件转MP4格式

1.1 MP4格式简介

当谈到MP4格式时,我们通常指的是MPEG-4 Part 14,它是一种常用的数字多媒体容器格式。容器格式是一种可以将不同类型的数据,如音频、视频、字幕和图片等,合并在一个文件中的技术。MP4是一种非常流行的容器格式,几乎所有设备和平台都支持它。

用通俗易懂的话来解释MP4格式:

想象MP4文件就像是一个箱子。这个箱子里可以装进各种东西,比如音乐、电影和照片。每种东西都有自己的特点,就像音乐有旋律,电影有画面,照片有图像。MP4文件可以像一个大箱子一样,把这些东西打包在一起,让你可以一次性携带和传输多种媒体内容。

MP4文件里通常会包含以下几种东西:

  1. 视频流:这是电影或视频的画面部分。MP4文件可以包含一个或多个视频流,以便支持不同的画面品质或多个角度。
  2. 音频流:这是声音部分,比如音乐或角色的对话。和视频一样,MP4文件可以包含多个音频流,使得你可以切换不同的语言或音效。
  3. 字幕:这是显示在视频上方或下方的文字,用于展示对话或说明。MP4文件允许添加不同语言或样式的字幕,让不同地区的观众都能理解内容。
  4. 其他数据:MP4文件还可以包含其他类型的数据,比如封面图片、元数据信息等。这些数据能够让你在播放时获得更多信息,或者在设备上显示电影封面。

总的来说,MP4格式是一个方便、灵活的数字媒体容器,让你能够轻松地存储、传输和播放多种类型的媒体内容。它已经成为互联网上分享视频和音乐的主流格式之一。无论是在手机、电脑、平板还是电视上,你都可以放心地使用MP4文件来欣赏你喜爱的娱乐内容。


1.2 音视频文件转mp4格式

要将音频或视频文件转换为MP4格式,你可以使用FFmpeg的命令行工具。下面是一个常见的命令示例:

bash 复制代码
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4

上述命令中的参数含义如下:

  • -i input.mp4: 这是输入文件的路径和名称。在这个例子中,input.mp4是你要转换的原始音频或视频文件。
  • -c:v libx264: 这是视频编码器选项。这里我们使用libx264编码器,它是H.264视频编码器,广泛支持且具有较好的压缩效率和质量。
  • -c:a aac: 这是音频编码器选项。我们使用AAC音频编码器,它是一种高质量的音频压缩技术。
  • output.mp4: 这是输出文件的路径和名称。在这个例子中,output.mp4是你转换后生成的MP4文件。

使用上述命令,FFmpeg会将输入文件进行重新编码,并将其保存为MP4格式的输出文件。请注意,此过程可能需要一些时间,具体时间取决于输入文件的大小和计算机性能。

如果你希望调整视频或音频的参数,比如分辨率、比特率、帧率等,可以在命令中添加其他选项。不过,在实际使用时请注意保持合适的视频和音频参数,以确保输出文件的质量和大小符合你的需求。

最后,记得在命令行中指定FFmpeg的正确路径或确保FFmpeg已正确地安装在你的计算机上。


1.2.1 视频编码器选项

除了-c:v libx264,FFmpeg还支持许多其他视频编码器,你可以根据你的需求选择合适的编码器。以下是一些常见的视频编码器选项:

  1. libx264: H.264视频编码器,高效且广泛支持。
  2. libx265: H.265/HEVC视频编码器,具有更好的压缩性能,但可能需要更长的编码时间。
  3. libvpx: VP8和VP9视频编码器,VP9是开放式WebM视频格式的常用编码器。
  4. mpeg4: MPEG-4 Part 2视频编码器,比H.264和H.265更旧,但仍然在某些场景中使用。
  5. libaom-av1: AV1视频编码器,具有出色的压缩性能,但编码时间可能较长。
  6. copy: 使用此选项时,FFmpeg将直接拷贝输入视频流,不进行重新编码。这对于只想改变容器格式而不重新压缩视频的情况很有用。

使用其他视频编码器的示例命令类似于之前的例子,只需将-c:v选项后的编码器名称替换为你想要使用的编码器即可。例如,使用libvpx编码器:

bash 复制代码
ffmpeg -i input.mp4 -c:v libvpx -c:a aac output.webm

在这个例子中,我们将输入文件转换为WebM格式,并使用libvpx编码器进行视频编码,音频仍然使用AAC编码器。

请注意,不同的视频编码器具有不同的特性和效率,选择适合你需求的编码器很重要。同时,编码过程的速度和输出文件的质量也可能因所选编码器而异。


1.2.2 音频编码器选项

除了-c:a aac,FFmpeg还支持许多其他音频编码器,你可以根据你的需求选择合适的编码器。以下是一些常见的音频编码器选项:

  1. aac: 使用Advanced Audio Coding (AAC)编码器,广泛用于高质量音频压缩,特别适用于MP4格式。
  2. libmp3lame: 使用LAME MP3编码器,用于将音频编码为MP3格式,是MP3压缩的常用工具。
  3. libopus: 使用Opus编码器,支持低延迟音频传输和高质量音频编码。
  4. libvorbis: 使用Vorbis编码器,用于将音频编码为Ogg Vorbis格式。
  5. pcm_s16le: 无损音频编码器,直接使用16位有符号PCM编码。
  6. copy: 使用此选项时,FFmpeg将直接拷贝输入音频流,不进行重新编码。这对于只想改变容器格式而不重新压缩音频的情况很有用。

使用其他音频编码器的示例命令类似于之前的例子,只需将-c:a选项后的编码器名称替换为你想要使用的编码器即可。例如,使用libmp3lame编码器:

bash 复制代码
ffmpeg -i input.wav -c:a libmp3lame output.mp3

在这个例子中,我们将输入的WAV音频文件转换为MP3格式,并使用libmp3lame编码器进行音频编码。


1.3 MP4文件中的Demuxer

1.3.1 MP4文件中的Demuxer是什么?

在FFmpeg中,MP4文件的Demuxer是一个解复用器(Demultiplexer),它负责从MP4容器文件中提取视频、音频、字幕等各种媒体流。Demuxer的作用是将这些流分离出来,以便后续的处理器(如解码器、滤镜等)可以单独处理这些媒体数据。

MP4文件是一种容器格式,可以包含多个媒体流,通常包括以下几种:

  1. 视频流:包含视频数据,如电影或视频片段的画面。
  2. 音频流:包含音频数据,如音乐或角色的对话。
  3. 字幕流:包含字幕数据,用于显示视频中的文字。
  4. 其他元数据:MP4文件还可以包含其他类型的数据,如封面图片、艺术家信息等。

Demuxer在解析MP4文件时,会读取文件的结构,找到并识别其中的各种媒体流,并将它们提取出来。一旦这些流被提取,它们就可以被传递给相应的解码器进行解码,或者进一步处理,比如转码、剪辑、添加滤镜等。

使用MP4文件的Demuxer功能,可以将MP4文件拆分成单独的视频、音频和字幕文件,这样就可以对它们进行独立处理,或者重新封装成其他容器格式。这在视频编辑、转码和处理等应用中非常有用。

总之,MP4文件的Demuxer是FFmpeg中的一个模块,它能够解析MP4容器文件并从中提取各种媒体流,为后续处理器提供方便。


1.3.2 ffmpeg命令行查看mp4文件的Demuxer信息

你可以使用FFmpeg命令行工具来查看MP4文件的Demuxer信息。在命令行中运行以下命令:

bash 复制代码
ffmpeg -i input.mp4

将input.mp4替换为你要查看的MP4文件的路径。

运行上述命令后,FFmpeg会解析输入的MP4文件,并显示相关的信息,包括视频流、音频流、字幕流以及其他元数据信息。在输出结果中,你可以找到以下信息:

  • Stream #x:xx : 这些行显示了每个流的详细信息。其中x是流的索引号,从0开始,xx是流的类型,比如Video表示视频流,Audio表示音频流,Subtitle表示字幕流等。
  • Codec: 这一行显示了每个流所使用的编解码器信息。
  • Duration: 这一行显示了每个流的时长。
  • Bitrate: 这一行显示了每个流的比特率,即每秒传输的比特数。
  • Resolution: 这一行显示了视频流的分辨率。
  • Audio: 这一行显示了音频流的采样率和声道数。
  • Subtitle: 这一行显示了字幕流的语言信息。
  • Metadata: 这一部分显示了文件中可能包含的其他元数据信息,如标题、作者、封面图片等。

通过查看这些信息,你可以了解MP4文件中包含的媒体流以及与之相关的详细信息。这对于检查文件属性、诊断问题以及了解媒体内容非常有用。

下面是一个具体的案例:

假设你有一个名为example.mp4的MP4文件,位于你当前工作目录下。现在,你想要查看该文件中的媒体流和其他相关信息。

打开终端或命令提示符(Windows),输入以下命令:

bash 复制代码
ffmpeg -i example.mp4

然后按下回车键运行该命令。

FFmpeg会解析example.mp4文件,并显示相关的媒体流信息以及其他元数据信息。输出结果可能类似于以下内容:

bash 复制代码
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'example.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2023-08-03T23:34:56.000000Z
  Duration: 00:03:45.56, start: 0.000000, bitrate: 1758 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/bt709), 1280x720 [SAR 1:1 DAR 16:9], 1624 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2023-08-03T23:34:56.000000Z
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      creation_time   : 2023-08-03T23:34:56.000000Z
      handler_name    : SoundHandler

在这个例子中,输出提供了以下信息:

  • 文件格式:mov,mp4,m4a,3gp,3g2,mj2
  • 元数据信息:主要品牌、次要版本、兼容品牌、创建时间等
  • 视频流:编码器为h264,分辨率为1280x720,帧率为25 fps,比特率为1624 kb/s
  • 音频流:编码器为AAC(LC),采样率为44100 Hz,声道数为立体声,比特率为127 kb/s

通过解析这些信息,你可以了解到example.mp4文件的基本信息以及其中包含的视频和音频流的详细参数。


1.4 MP4文件中的Muxer

1.4.1 MP4文件中的Muxer是什么?

在MP4文件中,Muxer(复用器或合复用器)是用于合成(Multiplexing)不同类型媒体流到单个MP4容器文件中的程序或模块。MP4文件是一种数字多媒体容器格式,它可以包含视频、音频、字幕和其他数据流。Muxer的主要作用是将这些来自不同来源的媒体流合并到一个MP4文件中,使它们可以同时存储、传输和播放。

简单来说,MP4文件的Muxer就像是合并不同媒体内容的"容器",将视频、音频、字幕等流放入其中,构建一个统一的文件。这样,你可以在一个单独的MP4文件中同时包含视频、音频、字幕和其他相关内容。

具体来说,MP4文件的Muxer会完成以下任务:

  1. 打开新文件:首先,Muxer会创建一个新的MP4文件,并打开它,准备向其中写入数据。
  2. 合并媒体流:Muxer会将来自不同来源的媒体流,比如视频、音频和字幕流,合并到MP4文件中。它会根据MP4文件的规范,将这些流正确地放置在文件的指定位置。
  3. 写入媒体数据:Muxer会从各个媒体流中读取数据,并按照特定的格式将这些数据写入到MP4文件中。这样,每个媒体流的数据都能被正确地放入容器中。
  4. 重新封装:在一些情况下,Muxer可能还会对媒体数据进行重新封装,以满足特定的要求或优化文件结构。
  5. 关闭文件:当所有媒体数据都写入到MP4文件中后,Muxer会关闭文件,完成合成过程。

总的来说,MP4文件的Muxer在媒体处理工具中扮演着重要的角色,它负责将来自不同来源的媒体流合并到一个MP4容器文件中。这使得MP4文件成为一种方便的多媒体容器,可以同时存储、传输和播放多种类型的媒体内容,如视频、音频、字幕和其他元数据。


1.4.2 ffmpeg命令行查看mp4文件的Muxer信息

在FFmpeg中,命令行可以用于查看MP4文件的Muxer信息,但实际上,查看Muxer信息并不是FFmpeg的主要功能之一,因为Muxer是用于合成(Multiplexing)多个媒体流到容器文件的过程,而通常情况下,我们是在处理单个媒体文件或者进行媒体转码等操作。

然而,如果你想查看MP4文件的一般信息,包括媒体流、元数据等,可以使用以下命令:

bash 复制代码
ffmpeg -i input.mp4

将input.mp4替换为你要查看的MP4文件的路径。

运行这个命令后,FFmpeg会解析输入的MP4文件,并显示相关的信息,包括视频流、音频流、字幕流以及其他元数据信息。在输出结果中,你可以找到以下信息:

  • Stream #x:xx : 这些行显示了每个流的详细信息。其中x是流的索引号,从0开始,xx是流的类型,比如Video表示视频流,Audio表示音频流,Subtitle表示字幕流等。
  • Codec: 这一行显示了每个流所使用的编解码器信息。
  • Duration: 这一行显示了每个流的时长。
  • Bitrate: 这一行显示了每个流的比特率,即每秒传输的比特数。
  • Resolution: 这一行显示了视频流的分辨率。
  • Audio: 这一行显示了音频流的采样率和声道数。
  • Subtitle: 这一行显示了字幕流的语言信息。
  • Metadata: 这一部分显示了文件中可能包含的其他元数据信息,如标题、作者、封面图片等。

通过查看这些信息,你可以了解MP4文件中包含的媒体流以及与之相关的详细参数。请注意,这些信息并不直接涉及Muxer的具体细节,因为在大多数情况下,FFmpeg会自动选择合适的Muxer进行输出,而不需要手动查看或指定Muxer信息。

下面是一个具体的案例:

假设你有一个名为example.mp4的MP4文件,位于你当前工作目录下。现在,你想要查看该文件中的媒体流和其他相关信息。

打开终端或命令提示符(Windows),输入以下命令:

bash 复制代码
ffmpeg -i example.mp4

然后按下回车键运行该命令。

FFmpeg会解析example.mp4文件,并显示相关的媒体流信息以及其他元数据信息。输出结果可能类似于以下内容:

bash 复制代码
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'example.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2023-08-03T23:34:56.000000Z
  Duration: 00:03:45.56, start: 0.000000, bitrate: 1758 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/bt709), 1280x720 [SAR 1:1 DAR 16:9], 1624 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2023-08-03T23:34:56.000000Z
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      creation_time   : 2023-08-03T23:34:56.000000Z
      handler_name    : SoundHandler

在这个例子中,输出提供了以下信息:

  • 文件格式:mov,mp4,m4a,3gp,3g2,mj2
  • 元数据信息:主要品牌、次要版本、兼容品牌、创建时间等
  • 视频流:编码器为h264,分辨率为1280x720,帧率为25 fps,比特率为1624 kb/s
  • 音频流:编码器为AAC(LC),采样率为44100 Hz,声道数为立体声,比特率为127 kb/s

通过解析这些信息,你可以了解到example.mp4文件的基本信息以及其中包含的视频和音频流的详细参数。


2 视频文件转FLV

2.1 FLV格式简介

当我们谈论FLV格式时,它是一种视频文件格式,FLV代表"Flash Video"。FLV是Adobe公司开发的一种流行的视频容器格式,最初用于在互联网上传输和播放视频内容,特别是在Flash播放器中。虽然现在已经有更先进的视频格式出现,但FLV仍然在一些应用中广泛使用。

FLV格式的简洁之处在于它是一种容器格式,可以包含不同编码和分辨率的视频、音频和字幕流。这意味着你可以把视频和音频合并在一个FLV文件中,然后通过网络传输它,并使用Flash播放器来播放。

由于FLV文件通常较小,所以在互联网上传输和共享视频时非常有用。在过去,许多视频网站都使用FLV格式,因为它可以通过Flash插件在各种浏览器上播放。

然而,随着技术的发展,HTML5视频和其他更先进的视频编解码技术逐渐取代了Flash和FLV格式。现在,主流视频网站已经转向更现代的视频格式,如MP4、WebM等,因为它们在各种设备上的兼容性更好,并支持更高质量的视频。

总而言之,FLV格式是一种过去常用的视频容器格式,适用于Flash播放器和早期的视频网站。虽然它在一些应用中仍然有用,但随着技术的发展,它的使用逐渐减少,让位给更现代的视频格式。


2.2 视频文件转FLV

要将视频文件转换为FLV格式,你可以使用FFmpeg的命令行工具。下面是一个常见的命令示例:

bash 复制代码
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.flv

上述命令中的参数含义如下:

  • -i input.mp4: 这是输入文件的路径和名称。在这个例子中,input.mp4是你要转换的原始视频文件。
  • -c:v libx264: 这是视频编码器选项。这里我们使用libx264编码器,它是H.264视频编码器,广泛支持且具有较好的压缩效率和质量。
  • -c:a aac: 这是音频编码器选项。我们使用AAC音频编码器,它是一种高质量的音频压缩技术。
  • output.flv: 这是输出文件的路径和名称。在这个例子中,output.flv是你转换后生成的FLV文件。

使用上述命令,FFmpeg会将输入的视频文件进行重新编码,并将其保存为FLV格式的输出文件。请注意,此过程可能需要一些时间,具体时间取决于输入文件的大小和计算机性能。


2.3 FFmpeg生成带关键索引的 FLV

要使用FFmpeg生成带有关键索引(keyframe index)的FLV文件,你需要添加-g参数来设置关键帧间隔。关键索引可以提高视频文件的随机访问性能,让视频在网络传输和播放过程中更加稳定和高效。

以下是一个生成带关键索引的FLV文件的命令行示例:

bash 复制代码
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -g 30 output.flv

上述命令中的参数含义如下:

  • -i input.mp4: 这是输入文件的路径和名称。在这个例子中,input.mp4是你要转换的原始视频文件。
  • -c:v libx264: 这是视频编码器选项。这里我们使用libx264编码器,它是H.264视频编码器,广泛支持且具有较好的压缩效率和质量。
  • -c:a aac: 这是音频编码器选项。我们使用AAC音频编码器,它是一种高质量的音频压缩技术。
  • -g 30: 这是设置关键帧间隔的选项。在这个例子中,我们将关键帧间隔设置为30帧。你可以根据需要调整这个值,通常使用视频帧率的两倍作为关键帧间隔是一个合理的选择。
  • output.flv: 这是输出文件的路径和名称。在这个例子中,output.flv是你生成的带有关键索引的FLV文件。

运行上述命令后,FFmpeg会读取input.mp4文件,并使用libx264视频编码器和AAC音频编码器重新编码视频和音频,并生成一个带有关键索引的FLV格式的输出文件output.flv。

除了使用-g参数设置关键帧间隔外,还有其他一些与关键帧相关的参数可以在FFmpeg中使用,以便更好地控制视频编码和生成关键索引的FLV文件。以下是一些常见的关键帧相关的参数:

  1. 使用-bf参数设置B帧数:
    假设我们有一个名为input.mp4的视频文件,现在我们想要将其转换为FLV格式,并设置两个B帧。我们可以使用以下命令:
bash 复制代码
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -bf 2 output.flv

在这个命令中,-bf 2表示设置两个B帧。

  1. 使用-keyint_min参数设置最小关键帧间隔:
    如果我们希望强制使关键帧更频繁,可以设置最小关键帧间隔为30帧。命令如下:
bash 复制代码
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -g 60 -keyint_min 30 output.flv

在这个命令中,-g 60表示设置关键帧间隔为60帧,-keyint_min 30表示设置最小关键帧间隔为30帧。

  1. 使用-force_key_frames参数强制指定关键帧的时间戳:
    假设我们希望在视频的第10秒和第30秒位置生成关键帧,可以使用以下命令:
bash 复制代码
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -force_key_frames 10,30 output.flv

在这个命令中,-force_key_frames 10,30表示在时间戳10秒和30秒位置生成关键帧。

  1. 使用-x264opts keyint参数设置关键帧间隔(libx264编码器):
    如果我们使用libx264编码器,可以使用-x264opts keyint参数来设置关键帧间隔。例如,设置关键帧间隔为30帧的命令如下:
bash 复制代码
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -x264opts keyint=30 output.flv

以上四个案例分别演示了如何使用不同参数来控制关键帧的生成和间隔,以及如何影响视频编码和生成带有关键索引的FLV文件。请根据你的具体需求选择适合的参数设置。

请注意,生成关键索引可能会导致输出文件稍微增大一些,但它可以显著改善视频的随机访问性能。这在视频网络传输和流媒体播放中非常有用,特别是对于长时间的视频文件。


3 视频文件转M3U8

3.1 M3U8格式简介

M3U8是一种简单易懂的文本文件格式,用于描述多媒体播放列表。它是一种基于文本的文件,通常用于流媒体服务和在线视频播放。

M3U8文件的内容非常简单,它包含一系列URL地址,这些地址指向不同的媒体文件片段或流。这些媒体文件片段通常是视频或音频的分段,每个片段都是一小段连续的媒体内容。通过将这些片段按顺序组合在一起,就可以实现流畅的媒体播放。

M3U8文件的结构如下:

bash 复制代码
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:10.0,
https://example.com/media/segment-0.ts
#EXTINF:10.0,
https://example.com/media/segment-1.ts
#EXTINF:10.0,
https://example.com/media/segment-2.ts

#EXT-X-ENDLIST
  • #EXTM3U: 这是M3U8文件的头部标记,表示这是一个M3U8文件。
  • #EXT-X-VERSION:3: 这是一个可选标记,用于指定M3U8文件的版本。
  • #EXT-X-TARGETDURATION:10: 这是一个必需标记,用于指定每个媒体片段的最大持续时间(以秒为单位)。这个值告诉播放器在请求下一个片段之前等待的最长时间。
  • #EXT-X-MEDIA-SEQUENCE:0: 这是一个必需标记,用于指定第一个媒体片段的序列号。随着播放,序列号会逐渐递增。
  • #EXTINF:10.0,: 这是一个必需标记,用于指定下一个媒体片段的持续时间(以秒为单位)。在逗号后面指定的时间是片段的持续时间。
  • https://example.com/media/segment-0.ts: 这是一个媒体片段的URL地址,它是实际视频或音频内容所在的位置。播放器会根据这些URL逐个加载和播放媒体片段。
  • #EXT-X-ENDLIST: 这是一个可选标记,表示M3U8文件中不再有其他片段,播放到这里就结束了。

M3U8文件允许播放器动态地加载并播放媒体片段,从而实现了流媒体的连续播放。这在实时直播和点播等场景中非常有用。


3.2 FFmpeg转HLS参数以及举例

HLS(HTTP Live Streaming)是一种流媒体传输协议,它是由Apple公司开发的,并被广泛用于实时直播和点播服务。M3U8是HLS使用的一种播放列表文件格式,用于描述HLS媒体流的切片和播放顺序。

HLS协议将媒体文件切片成小段(通常是10秒左右)的TS(Transport Stream)分片,然后将这些分片以M3U8文件的形式组织成一个播放列表。M3U8文件是一个简单的文本文件,其中包含了一系列URL地址,每个地址指向一个TS分片。播放器根据M3U8文件中的信息按顺序加载和播放这些分片,从而实现流畅的媒体播放。

在FFmpeg中,你可以使用一些特定的参数来将视频转换为HLS格式并生成M3U8播放列表文件。

以下是一些常见的FFmpeg参数,用于将视频转换为HLS格式:

  1. -i input.mp4 : 这是输入文件的路径和名称。在这个例子中,input.mp4是你要转换为HLS的原始视频文件。
  2. -c:v libx264: 这是视频编码器选项。这里我们使用libx264编码器,它是H.264视频编码器,广泛用于HLS。
  3. -c:a aac: 这是音频编码器选项。我们使用AAC音频编码器,因为它是HLS所支持的常用音频格式。
  4. -hls_time 10: 这是设置HLS切片时长的选项,以秒为单位。在这个例子中,我们将切片时长设置为10秒。
  5. -hls_list_size 0: 这是设置HLS播放列表中切片数量的选项。0表示生成无限大小的播放列表。
  6. -hls_segment_filename "output_%03d.ts" : 这是设置HLS切片文件名的选项。在这个例子中,切片文件名将以"output_001.ts"、"output_002.ts"等格式命名。
  7. output.m3u8 : 这是输出HLS播放列表文件的名称。在这个例子中,我们将HLS播放列表保存为output.m3u8。

综合起来,完整的FFmpeg命令如下:

bash 复制代码
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -hls_time 10 -hls_list_size 0 -hls_segment_filename "output_%03d.ts" output.m3u8

运行上述命令后,FFmpeg会读取input.mp4文件,并将其转换为HLS格式,生成HLS播放列表文件output.m3u8和对应的媒体切片文件output_001.ts、output_002.ts等等。这样就可以通过HTTP服务器或其他支持HLS的平台进行流媒体播放。


4 视频文件切片

4.1 FFmpeg切片segment参数

在FFmpeg中,切片(segment)是指将输入视频或音频文件切分为多个固定长度的小段,每个小段称为一个切片。切片在流媒体传输中非常有用,可以实现平滑的播放和快速的随机访问。FFmpeg提供了一些参数来控制切片的生成。

下面是常见的切片相关参数:

  1. -segment_time duration : 这是设置每个切片的时长的选项,以时间值duration表示。例如,-segment_time 10表示每个切片的时长为10秒。
  2. -segment_time_delta duration : 这是设置切片时长的偏差的选项,以时间值duration表示。默认情况下,切片时长是固定的,但使用这个选项可以让切片的时长在一定范围内浮动。例如,-segment_time_delta 2表示切片的时长可以在10秒上下浮动2秒。
  3. -segment_format format : 这是设置切片文件格式的选项。可以使用mp4、avi、ts等格式。例如,-segment_format ts表示生成TS格式的切片文件。
  4. -segment_list file : 这是设置输出切片列表文件的选项。切片列表文件是一个M3U8格式的文本文件,包含所有切片文件的URL地址。例如,-segment_list playlist.m3u8表示生成名为playlist.m3u8的切片列表文件。
  5. -segment_list_type type : 这是设置切片列表文件的类型的选项。可以使用m3u8或mpegts。m3u8表示生成HLS播放列表文件,mpegts表示生成MPEG-TS格式的切片列表文件。
  6. -segment_list_size size : 这是设置切片列表文件的最大大小的选项。如果切片列表文件的大小超过这个值,将重新生成一个新的切片列表文件。例如,-segment_list_size 10M表示切片列表文件的最大大小为10MB。

这些参数可以根据你的需求来调整切片的生成方式。通过合理设置切片参数,你可以实现适合不同应用场景的切片策略,从而更好地控制生成的切片文件。


4.2 FFmpeg切片segment举例

假设你有一个名为input.mp4的视频文件,并且你希望将它切片为每个切片时长为10秒的TS格式文件,并生成一个HLS播放列表文件。

你可以使用以下命令来实现:

bash 复制代码
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -segment_time 10 -segment_format mpegts -segment_list output.m3u8 output_%03d.ts

解释一下这个命令:

  • -i input.mp4: 这是输入文件的路径和名称,表示要切片的原始视频文件。
  • -c:v libx264: 这是视频编码器选项,我们使用libx264编码器进行H.264视频编码。
  • -c:a aac: 这是音频编码器选项,我们使用AAC音频编码器。
  • -segment_time 10: 这是设置每个切片的时长的选项,这里我们将切片时长设置为10秒。
  • -segment_format mpegts: 这是设置切片文件格式的选项,我们选择生成MPEG-TS格式的切片文件。
  • -segment_list output.m3u8: 这是设置输出切片列表文件的选项,我们将切片列表保存为output.m3u8。
  • output_%03d.ts: 这是设置切片文件名的模板,%03d表示使用三位数的数字递增命名切片文件。例如,生成的切片文件名可能是output_001.ts、output_002.ts等等。

运行这个命令后,FFmpeg会读取input.mp4文件,并将其切片为每个时长为10秒的TS格式文件。同时,它会生成一个名为output.m3u8的HLS播放列表文件,其中包含了所有切片文件的URL地址。切片文件会以output_001.ts、output_002.ts等格式存储在同一目录中。

你可以将生成的切片文件和output.m3u8播放列表文件部署在支持HLS播放的HTTP服务器上,然后就可以通过HLS协议进行流媒体播放。播放器将根据output.m3u8中的信息逐个加载和播放这些切片文件,实现流畅的视频播放和随机访问。


4.3 FFmpeg使用ss与t参数进行切片

在FFmpeg中,你可以使用-ss参数来指定从输入文件的哪个时间点开始切片,使用-t参数来指定切片的持续时间。

以下是一个示例命令,假设你有一个名为input.mp4的视频文件,你想从第10秒开始切片,并切片10秒钟的内容,然后保存为一个新的文件output.mp4:

bash 复制代码
ffmpeg -ss 00:00:10 -i input.mp4 -t 10 -c:v copy -c:a copy output.mp4

解释一下这个命令:

  • -ss 00:00:10: 这是指定从第10秒开始切片的参数。00:00:10表示时间点为10秒。
  • -i input.mp4: 这是输入文件的路径和名称,表示要切片的原始视频文件。
  • -t 10: 这是指定切片的持续时间的参数,这里我们设置切片持续时间为10秒。
  • -c:v copy: 这是视频编码器选项,copy表示直接复制视频流而不重新编码。因为我们只是进行简单的切片操作,所以不需要重新编码视频。
  • -c:a copy: 这是音频编码器选项,copy表示直接复制音频流而不重新编码。同样,由于我们只是进行切片,不需要重新编码音频。
  • output.mp4: 这是输出文件的路径和名称,表示保存切片后的内容为新的文件output.mp4。

运行这个命令后,FFmpeg会从input.mp4文件的第10秒开始,切片10秒钟的内容,并将结果保存为output.mp4文件。

请注意,使用-ss参数进行切片时,FFmpeg会尽可能地寻找最近的关键帧(I帧)作为切片的起始点,以确保切片的质量和准确性。如果你需要更精确的切片起始点,可以使用-ss参数和-i参数的顺序调换,即将-ss参数放在输入文件之前,这样可以更精确地控制切片起始时间点。​


5 音视频文件音视频流抽取

5.1 FFmpeg抽取音视频文件中的AAC音频流

要从音视频文件中抽取AAC音频流,你可以使用FFmpeg并指定输出的音频编码器为AAC。

以下是一个示例命令,假设你有一个名为input.mp4的视频文件,并且你希望从中抽取AAC音频流,并保存为一个独立的音频文件output.aac:

bash 复制代码
ffmpeg -i input.mp4 -vn -c:a copy -strict -2 output.aac

解释一下这个命令:

  • -i input.mp4: 这是输入文件的路径和名称,表示要从中抽取音频流的原始视频文件。
  • -vn: 这是禁止视频流选项,表示不处理视频流,只处理音频流。
  • -c:a copy: 这是音频编码器选项,copy表示直接复制音频流而不重新编码。由于我们只是抽取AAC音频流,不需要重新编码。
  • -strict -2: 这是一个可选选项,用于设置编码器的严格程度。在此情况下,我们设置为-2表示允许实验性的非标准AAC编码器。
  • output.aac: 这是输出文件的路径和名称,表示保存抽取的AAC音频流为output.aac文件。

运行这个命令后,FFmpeg会从input.mp4文件中抽取AAC音频流,并将结果保存为output.aac文件。

如果你需要重新编码音频流为其他格式或调整音频参数,可以使用不同的音频编码器和选项。在上述示例中,我们选择了copy选项,这适用于直接复制原始的AAC音频流。如果需要进行其他音频处理,可以选择不同的音频编码器并调整相应参数。


5.2 FFmpeg抽取音视频文件中的H.264视频流

要从音视频文件中抽取H.264视频流,你可以使用FFmpeg并指定输出的视频编码器为H.264。

以下是一个示例命令,假设你有一个名为input.mp4的视频文件,并且你希望从中抽取H.264视频流,并保存为一个独立的视频文件output.h264:

bash 复制代码
ffmpeg -i input.mp4 -c:v copy -an output.h264

解释一下这个命令:

  • -i input.mp4: 这是输入文件的路径和名称,表示要从中抽取视频流的原始视频文件。
  • -c:v copy: 这是视频编码器选项,copy表示直接复制视频流而不重新编码。由于我们只是抽取H.264视频流,不需要重新编码。
  • -an: 这是禁止音频流选项,表示不处理音频流,只处理视频流。
  • output.h264: 这是输出文件的路径和名称,表示保存抽取的H.264视频流为output.h264文件。

运行这个命令后,FFmpeg会从input.mp4文件中抽取H.264视频流,并将结果保存为output.h264文件。

如果你需要重新编码视频流为其他格式或调整视频参数,可以使用不同的视频编码器和选项。在上述示例中,我们选择了copy选项,这适用于直接复制原始的H.264视频流。如果需要进行其他视频处理,可以选择不同的视频编码器并调整相应参数。


5.3 FFmpeg抽取音视频文件中的H.265数据

要从音视频文件中抽取H.265(也称为HEVC)视频数据,你可以使用FFmpeg并指定输出的视频编码器为H.265。

以下是一个示例命令,假设你有一个名为input.mp4的视频文件,并且你希望从中抽取H.265视频数据,并保存为一个独立的视频文件output.h265:

bash 复制代码
ffmpeg -i input.mp4 -c:v copy -an output.h265

解释一下这个命令:

  • -i input.mp4: 这是输入文件的路径和名称,表示要从中抽取视频数据的原始视频文件。
  • -c:v copy: 这是视频编码器选项,copy表示直接复制视频流而不重新编码。由于我们只是抽取H.265视频数据,不需要重新编码。
  • -an: 这是禁止音频流选项,表示不处理音频流,只处理视频流。
  • output.h265: 这是输出文件的路径和名称,表示保存抽取的H.265视频数据为output.h265文件。

运行这个命令后,FFmpeg会从input.mp4文件中抽取H.265视频数据,并将结果保存为output.h265文件。

请注意,H.265是一种视频编码标准,它可以用于多种封装格式,比如MP4、MKV等。上述命令中使用的-c:v copy选项表示直接复制原始视频流而不重新编码,因此输出的output.h265文件中的数据将与原始视频的H.265数据一致。如果你需要将H.265数据重新封装到其他格式或进行其他视频处理,可以使用不同的视频编码器和选项。

​

相关推荐
死磕音视频2 天前
Codex CLI 入门:在终端里让 AI 读懂项目并完成一次小修改
openai·ai编程·命令行·codex
OH_TPC2 天前
【鸿蒙优选三方库】@ohos/ffmpeg-kit:把 FFmpeg 的全部能量带进鸿蒙
华为·ffmpeg·harmonyos·鸿蒙
是jin奥2 天前
最新 FFmpeg 安装脚本:Linux x86_64
linux·运维·ffmpeg
骑着蜗牛撵大象3272 天前
用 Codex 批量做数字人商品口播视频:从分镜 JSON 到成片校验的流水线
java·ffmpeg·json·音视频·数字人·视频·codex
企业数字化笔记2 天前
视频加放大特写后音画不同步怎么办?OpenCV转场与FFmpeg音轨续接实战
opencv·ffmpeg·音视频
VimorphTech3 天前
文件名是 MP4 就能处理?用 ffprobe 检查视频流、音轨和时长
java·音视频开发
开开心心就好4 天前
课堂随机点名工具,绿色版免安装双击即用
java·服务器·前端·ffmpeg·音视频·perl·symfony
小鹿软件办公4 天前
不依赖 FFmpeg 也能录屏?ShareX 22 新增录屏等十余款新工具
ffmpeg·sharex·免费录屏工具
lll23526917794 天前
Android APP短视频音频提取,主流工具怎么选
ffmpeg·音视频
成都旺小宝科技5 天前
首访决策人没来,AI一客一策两天成交!
大数据·人工智能·机器学习·ffmpeg·语音识别