前语

Android音视频开发中,网上知识点过于零碎,自学起来难度十分大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 – 使命列表》。本文是Android音视频使命列表的其间一个, 对应的要学习的内容是:怎么运用FFmpeg指令行进行媒体格局的转封装


音视频使命列表

音视频使命列表: 点击此处跳转检查.


目录

FFmpeg常见命令行(二):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的指令行东西。下面是一个常见的指令示例:

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编码器:

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编码器:

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信息。在指令行中运转以下指令:

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),输入以下指令:

ffmpeg -i example.mp4

然后按下回车键运转该指令。

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

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,分辨率为1280×720,帧率为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文件的一般信息,包括媒体流、元数据等,能够运用以下指令:

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),输入以下指令:

ffmpeg -i example.mp4

然后按下回车键运转该指令。

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

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,分辨率为1280×720,帧率为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的指令行东西。下面是一个常见的指令示例:

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文件的指令行示例:

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帧。咱们能够运用以下指令:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -bf 2 output.flv

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

  1. 运用-keyint_min参数设置最小要害帧距离:
    假如咱们期望强制使要害帧更频繁,能够设置最小要害帧距离为30帧。指令如下:
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秒方位生成要害帧,能够运用以下指令:
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帧的指令如下:
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文件的结构如下:

#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指令如下:

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.tsoutput_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: 这是设置切片文件格局的选项。能够运用mp4avits等格局。例如,-segment_format ts表明生成TS格局的切片文件。
  4. -segment_list file: 这是设置输出切片列表文件的选项。切片列表文件是一个M3U8格局的文本文件,包括一切切片文件的URL地址。例如,-segment_list playlist.m3u8表明生成名为playlist.m3u8的切片列表文件。
  5. -segment_list_type type: 这是设置切片列表文件的类型的选项。能够运用m3u8mpegtsm3u8表明生成HLS播映列表文件,mpegts表明生成MPEG-TS格局的切片列表文件。
  6. -segment_list_size size: 这是设置切片列表文件的最大巨细的选项。假如切片列表文件的巨细超过这个值,将从头生成一个新的切片列表文件。例如,-segment_list_size 10M表明切片列表文件的最大巨细为10MB。

这些参数能够依据你的需求来调整切片的生成方法。经过合理设置切片参数,你能够完成合适不同运用场景的切片战略,然后更好地操控生成的切片文件。


4.2 FFmpeg切片segment举例

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

你能够运用以下指令来完成:

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.tsoutput_002.ts等等。

运转这个指令后,FFmpeg会读取input.mp4文件,并将其切片为每个时长为10秒的TS格局文件。一起,它会生成一个名为output.m3u8的HLS播映列表文件,其间包括了一切切片文件的URL地址。切片文件会以output_001.tsoutput_002.ts等格局存储在同一目录中。

你能够将生成的切片文件和output.m3u8播映列表文件布置在支撑HLS播映的HTTP服务器上,然后就能够经过HLS协议进行流媒体播映。播映器将依据output.m3u8中的信息逐一加载和播映这些切片文件,完成流通的视频播映和随机拜访。


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

在FFmpeg中,你能够运用-ss参数来指定从输入文件的哪个时刻点开端切片,运用-t参数来指定切片的持续时刻。

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

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

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

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

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数据从头封装到其他格局或进行其他视频处理,能够运用不同的视频编码器和选项。