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

1 音视频文件转MP4格式
1.1 MP4格式简介
当谈到MP4格式时,我们通常指的是MPEG-4 Part 14,它是一种常用的数字多媒体容器格式。容器格式是一种可以将不同类型的数据,如音频、视频、字幕和图片等,合并在一个文件中的技术。MP4是一种非常流行的容器格式,几乎所有设备和平台都支持它。
用通俗易懂的话来解释MP4格式:
想象MP4文件就像是一个箱子。这个箱子里可以装进各种东西,比如音乐、电影和照片。每种东西都有自己的特点,就像音乐有旋律,电影有画面,照片有图像。MP4文件可以像一个大箱子一样,把这些东西打包在一起,让你可以一次性携带和传输多种媒体内容。
MP4文件里通常会包含以下几种东西:
- 视频流:这是电影或视频的画面部分。MP4文件可以包含一个或多个视频流,以便支持不同的画面品质或多个角度。
- 音频流:这是声音部分,比如音乐或角色的对话。和视频一样,MP4文件可以包含多个音频流,使得你可以切换不同的语言或音效。
- 字幕:这是显示在视频上方或下方的文字,用于展示对话或说明。MP4文件允许添加不同语言或样式的字幕,让不同地区的观众都能理解内容。
- 其他数据: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还支持许多其他视频编码器,你可以根据你的需求选择合适的编码器。以下是一些常见的视频编码器选项:
- libx264: H.264视频编码器,高效且广泛支持。
- libx265: H.265/HEVC视频编码器,具有更好的压缩性能,但可能需要更长的编码时间。
- libvpx: VP8和VP9视频编码器,VP9是开放式WebM视频格式的常用编码器。
- mpeg4: MPEG-4 Part 2视频编码器,比H.264和H.265更旧,但仍然在某些场景中使用。
- libaom-av1: AV1视频编码器,具有出色的压缩性能,但编码时间可能较长。
- 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还支持许多其他音频编码器,你可以根据你的需求选择合适的编码器。以下是一些常见的音频编码器选项:
- aac: 使用Advanced Audio Coding (AAC)编码器,广泛用于高质量音频压缩,特别适用于MP4格式。
- libmp3lame: 使用LAME MP3编码器,用于将音频编码为MP3格式,是MP3压缩的常用工具。
- libopus: 使用Opus编码器,支持低延迟音频传输和高质量音频编码。
- libvorbis: 使用Vorbis编码器,用于将音频编码为Ogg Vorbis格式。
- pcm_s16le: 无损音频编码器,直接使用16位有符号PCM编码。
- 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文件是一种容器格式,可以包含多个媒体流,通常包括以下几种:
- 视频流:包含视频数据,如电影或视频片段的画面。
- 音频流:包含音频数据,如音乐或角色的对话。
- 字幕流:包含字幕数据,用于显示视频中的文字。
- 其他元数据: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 : mp42minor_version : 0compatible_brands: isommp42creation_time : 2023-08-03T23:34:56.000000ZDuration: 00:03:45.56, start: 0.000000, bitrate: 1758 kb/sStream #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.000000Zhandler_name : VideoHandlerStream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)Metadata:creation_time : 2023-08-03T23:34:56.000000Zhandler_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会完成以下任务:
- 打开新文件:首先,Muxer会创建一个新的MP4文件,并打开它,准备向其中写入数据。
- 合并媒体流:Muxer会将来自不同来源的媒体流,比如视频、音频和字幕流,合并到MP4文件中。它会根据MP4文件的规范,将这些流正确地放置在文件的指定位置。
- 写入媒体数据:Muxer会从各个媒体流中读取数据,并按照特定的格式将这些数据写入到MP4文件中。这样,每个媒体流的数据都能被正确地放入容器中。
- 重新封装:在一些情况下,Muxer可能还会对媒体数据进行重新封装,以满足特定的要求或优化文件结构。
- 关闭文件:当所有媒体数据都写入到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 : mp42minor_version : 0compatible_brands: isommp42creation_time : 2023-08-03T23:34:56.000000ZDuration: 00:03:45.56, start: 0.000000, bitrate: 1758 kb/sStream #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.000000Zhandler_name : VideoHandlerStream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)Metadata:creation_time : 2023-08-03T23:34:56.000000Zhandler_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的命令行工具。下面是一个常见的命令示例:
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文件。以下是一些常见的关键帧相关的参数:
- 使用
-bf参数设置B帧数:
假设我们有一个名为input.mp4的视频文件,现在我们想要将其转换为FLV格式,并设置两个B帧。我们可以使用以下命令:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -bf 2 output.flv
在这个命令中,-bf 2表示设置两个B帧。
- 使用
-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帧。
- 使用
-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秒位置生成关键帧。
- 使用
-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格式:
- -i input.mp4: 这是输入文件的路径和名称。在这个例子中,
input.mp4是你要转换为HLS的原始视频文件。 - -c:v libx264: 这是视频编码器选项。这里我们使用libx264编码器,它是H.264视频编码器,广泛用于HLS。
- -c:a aac: 这是音频编码器选项。我们使用AAC音频编码器,因为它是HLS所支持的常用音频格式。
- -hls_time 10: 这是设置HLS切片时长的选项,以秒为单位。在这个例子中,我们将切片时长设置为10秒。
- -hls_list_size 0: 这是设置HLS播放列表中切片数量的选项。0表示生成无限大小的播放列表。
- -hls_segment_filename “output_%03d.ts”: 这是设置HLS切片文件名的选项。在这个例子中,切片文件名将以"output_001.ts"、"output_002.ts"等格式命名。
- 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.ts、output_002.ts等等。这样就可以通过HTTP服务器或其他支持HLS的平台进行流媒体播放。
4 视频文件切片
4.1 FFmpeg切片segment参数
在FFmpeg中,切片(segment)是指将输入视频或音频文件切分为多个固定长度的小段,每个小段称为一个切片。切片在流媒体传输中非常有用,可以实现平滑的播放和快速的随机访问。FFmpeg提供了一些参数来控制切片的生成。
下面是常见的切片相关参数:
- -segment_time duration: 这是设置每个切片的时长的选项,以时间值duration表示。例如,
-segment_time 10表示每个切片的时长为10秒。 - -segment_time_delta duration: 这是设置切片时长的偏差的选项,以时间值duration表示。默认情况下,切片时长是固定的,但使用这个选项可以让切片的时长在一定范围内浮动。例如,
-segment_time_delta 2表示切片的时长可以在10秒上下浮动2秒。 - -segment_format format: 这是设置切片文件格式的选项。可以使用
mp4、avi、ts等格式。例如,-segment_format ts表示生成TS格式的切片文件。 - -segment_list file: 这是设置输出切片列表文件的选项。切片列表文件是一个M3U8格式的文本文件,包含所有切片文件的URL地址。例如,
-segment_list playlist.m3u8表示生成名为playlist.m3u8的切片列表文件。 - -segment_list_type type: 这是设置切片列表文件的类型的选项。可以使用
m3u8或mpegts。m3u8表示生成HLS播放列表文件,mpegts表示生成MPEG-TS格式的切片列表文件。 - -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.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:
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数据重新封装到其他格式或进行其他视频处理,可以使用不同的视频编码器和选项。
相关文章:
FFmpeg常见命令行(二):FFmpeg转封装
前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个, 对应的要学习的内容是:如何使…...
全面升级:华为鸿蒙HarmonyOS4正式发布,玩趣个性化,小艺AI升级
8月4日新闻,今天下午,华为正式发布了最新版本的鸿蒙操作系统——HarmonyOS 4! 在华为发布会上,鸿蒙HarmonyOS迎来了一系列令人激动的功能升级。其中包括个性化空间、多种生产力工具以及增强的手机AI助手"小艺"。这次更…...
【python】使用Selenium和Chrome WebDriver来获取 【腾讯云 Cloud Studio 实战训练营】中的文章信息
文章目录 前言导入依赖库设置ChromeDriver的路径创建Chrome WebDriver对象打开网页找到结果元素创建一个空列表用于存储数据遍历结果元素并提取数据提取标题、作者、发布时间等信息判断是否为目标文章提取目标文章的描述、阅读数量、点赞数量、评论数量等信息将提取的数据存储为…...
使用Feign 的远程调用,把mysql数据导入es
要把数据库数据导入到elasticsearch中,包括下面几步: 1)将商品微服务中的分页查询商品接口定义为一个FeignClient,放到feign-api模块中 2)搜索服务编写一个测试业务,实现下面功能: 调用item-ser…...
Java课题笔记~ MyBatis接口开发(代理开发)
使用XML文件进行开发,在调用SqlSession进行操作时,需要指定MyBatis映射文件中的方法,这种调用方式过于烦琐。为解决此问题,MyBatis提供了接口开发的方式。 接口开发的目的: 解决原生方式中的硬编码 简化后期执行SQL …...
从数学到深度学习的学习资料及教程合集
诸神缄默不语-个人CSDN博文目录 目前仅收集免费内容,最多需要买本纸质书。 付费的如果有免费版本我也会收录。 链接如失效请联系我。 这个笔记主要是为我自己准备的,算是一个可公开的to do list(其实做不完的我也知道)ÿ…...
nn.CrossEntropyLoss()报错
RuntimeError: “nll_loss_forward_reduce_cuda_kernel_2d_index” not implemented for ‘Float’ Traceback (most recent call last): File "<string>", line 1, in <module> File "/home/zz/anaconda3/envs/torch1.11/lib/python3.7/site-pack…...
【BASH】回顾与知识点梳理(一)
【BASH】回顾与知识点梳理 一 前言一. 认识与学习 BASH1.1 硬件、核心与 Shell1.2 为何要学文字接口的 shell?1.3 系统的合法 shell 与 /etc/shells 功能1.4 Bash shell 的功能1.5 查询指令是否为 Bash shell 的内建命令: type1.6 指令的下达与快速编辑按…...
AWS Amplify 部署node版本18报错修复
Amplify env:Amazon Linux:2 Build Error : Specified Node 18 but GLIBC_2.27 or GLIBC_2.28 not found on build 一、原因 报错原因是因为默认情况下,AWS Amplify 使用 Amazon Linux:2 作为其构建镜像,并自带 GLIBC 2.26。不过,…...
K8S添加yum源并安装kubectl/kubeadm/kubelet组件
1.安装kubectl/kubeadm/kubelet ##添加yum 源 cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled1 gpgcheck0 repo_gpgcheck0 gpgkeyhttps://mirr…...
kafka生产者指定ip
kafka生产者指定ip 最近工作中遇到一个问题,记录一下,需求中要求往kafka上推送信息。本来是个很简单的需求,但是踩了一个坑。 我通过spring boot集成了kafka写了一个生产者,客户那边给我三个节点的ip,然后我也没多想…...
python 封装sql 增删改查连接MySQL
select * from Teacher limit 10 连接字符串配置MysqlConfig.py class MysqlConfig:HOST 192.168.56.210PORT 3306USER rootPASSWORD 1qaz0987654321DBStudentDBCHARSET utf8封装增删改查MysqlConnection.py Author: tkhywang 2810248865qq.com Date: 2023-06-19 15:44:48 Las…...
Flink正常消费一段时间后,大量反压,看着像卡住了,但又没有报错。
文章目录 前言一、原因分析二、解决方案 前言 前面我也有提到,发现flink运行一段时间后,不再继续消费的问题。这个问题困扰了我非常久,一开始也很迷茫。又因为比较忙,所以一直没有时间能够去寻找答案,只是通过每天重启…...
软件测试需求分析的常用方法
软件测试需求分析时,应要求产品人员对需求进行讲解,并使用相对应的方法进行科学分析,否则无法保障软件测试的完整性和科学性,从而造成在项目中后期Bug频出、风险增大等问题。 而常用的测试需求分析的方法: 1、功能分解…...
数据结构10 -查找_树表查找
创建二叉搜索树 二叉搜索树 二叉搜索树是有数值的了,二叉搜索树是一个有序树。 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它…...
第126天:内网安全-隧道技术SSHDNSICMPSMB上线通讯LinuxMac
知识点 #知识点: 1、入站规则不出网上线方案 2、出站规则不出网上线方案 3、隧道技术-SMB&ICMP&DNS&SSH 4、控制上线-Linux&Mac&IOS&Android-连接方向:正向&反向(基础课程有讲过) -内网穿透…...
开发一个饲料商城小程序需要多少钱
随着宠物行业的蓬勃发展,饲料商城小程序作为一个重要的销售渠道,吸引了越来越多的投资者。那么,开发一套饲料商城小程序需要多少钱呢?本文将为您详细解答。 首先,开发一套饲料商城小程序的价格受到多个因素的影响&…...
Emacs之set-face-attribute与font-lock-add-keywords用法区别(一百二十八)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
JavaScript高阶函数和闭包
在JavaScript编程中,高阶函数和闭包是两个重要而又常见的概念。它们是函数式编程的重要组成部分,可以让我们的代码更加灵活、简洁和高效。本文将详细解释高阶函数和闭包的概念、用法以及它们在JavaScript中的重要性。 高阶函数 1. 什么是高阶函数&…...
私有化部署企业IM即时通讯:提升效率、防止泄密、高效协同办公
随着科技的飞速发展和智能手机的普及,即时通讯(IM)应用在我们的生活和工作中变得越来越重要。在企业中,IM已成为员工之间交流沟通的主要方式之一。然而,对于大多数企业来说,选择私有化部署企业IM即时通讯软…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
