FFmpeg常見命令行(二):FFmpeg轉(zhuǎn)封裝

前言

今天要學習的內(nèi)容是:如何使用FFmpeg命令行進行媒體格式的轉(zhuǎn)封裝

1 音視頻文件轉(zhuǎn)MP4格式

1.1 MP4格式簡介

當談到MP4格式時,我們通常指的是MPEG-4 Part 14,它是一種常用的數(shù)字多媒體容器格式。容器格式是一種可以將不同類型的數(shù)據(jù),如音頻、視頻、字幕和圖片等,合并在一個文件中的技術(shù)。MP4是一種非常流行的容器格式,幾乎所有設(shè)備和平臺都支持它。

用通俗易懂的話來解釋MP4格式:

想象MP4文件就像是一個箱子。這個箱子里可以裝進各種東西,比如音樂、電影和照片。每種東西都有自己的特點,就像音樂有旋律,電影有畫面,照片有圖像。MP4文件可以像一個大箱子一樣,把這些東西打包在一起,讓你可以一次性攜帶和傳輸多種媒體內(nèi)容。

MP4文件里通常會包含以下幾種東西:

  1. 視頻流:這是電影或視頻的畫面部分。MP4文件可以包含一個或多個視頻流,以便支持不同的畫面品質(zhì)或多個角度。
  2. 音頻流:這是聲音部分,比如音樂或角色的對話。和視頻一樣,MP4文件可以包含多個音頻流,使得你可以切換不同的語言或音效。
  3. 字幕:這是顯示在視頻上方或下方的文字,用于展示對話或說明。MP4文件允許添加不同語言或樣式的字幕,讓不同地區(qū)的觀眾都能理解內(nèi)容。
  4. 其他數(shù)據(jù):MP4文件還可以包含其他類型的數(shù)據(jù),比如封面圖片、元數(shù)據(jù)信息等。這些數(shù)據(jù)能夠讓你在播放時獲得更多信息,或者在設(shè)備上顯示電影封面。

總的來說,MP4格式是一個方便、靈活的數(shù)字媒體容器,讓你能夠輕松地存儲、傳輸和播放多種類型的媒體內(nèi)容。它已經(jīng)成為互聯(lián)網(wǎng)上分享視頻和音樂的主流格式之一。無論是在手機、電腦、平板還是電視上,你都可以放心地使用MP4文件來欣賞你喜愛的娛樂內(nèi)容。


1.2 音視頻文件轉(zhuǎn)mp4格式

要將音頻或視頻文件轉(zhuǎn)換為MP4格式,你可以使用FFmpeg的命令行工具。下面是一個常見的命令示例:

ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4

上述命令中的參數(shù)含義如下:

  • -i input.mp4: 這是輸入文件的路徑和名稱。在這個例子中,input.mp4是你要轉(zhuǎn)換的原始音頻或視頻文件。
  • -c:v libx264: 這是視頻編碼器選項。這里我們使用libx264編碼器,它是H.264視頻編碼器,廣泛支持且具有較好的壓縮效率和質(zhì)量。
  • -c:a aac: 這是音頻編碼器選項。我們使用AAC音頻編碼器,它是一種高質(zhì)量的音頻壓縮技術(shù)。
  • output.mp4: 這是輸出文件的路徑和名稱。在這個例子中,output.mp4是你轉(zhuǎn)換后生成的MP4文件。

使用上述命令,F(xiàn)Fmpeg會將輸入文件進行重新編碼,并將其保存為MP4格式的輸出文件。請注意,此過程可能需要一些時間,具體時間取決于輸入文件的大小和計算機性能。

如果你希望調(diào)整視頻或音頻的參數(shù),比如分辨率、比特率、幀率等,可以在命令中添加其他選項。不過,在實際使用時請注意保持合適的視頻和音頻參數(shù),以確保輸出文件的質(zhì)量和大小符合你的需求。

最后,記得在命令行中指定FFmpeg的正確路徑或確保FFmpeg已正確地安裝在你的計算機上。


1.2.1 視頻編碼器選項

除了-c:v libx264,F(xiàn)Fmpeg還支持許多其他視頻編碼器,你可以根據(jù)你的需求選擇合適的編碼器。以下是一些常見的視頻編碼器選項:

  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: 使用此選項時,F(xiàn)Fmpeg將直接拷貝輸入視頻流,不進行重新編碼。這對于只想改變?nèi)萜鞲袷蕉恢匦聣嚎s視頻的情況很有用。

使用其他視頻編碼器的示例命令類似于之前的例子,只需將-c:v選項后的編碼器名稱替換為你想要使用的編碼器即可。例如,使用libvpx編碼器:

ffmpeg -i input.mp4 -c:v libvpx -c:a aac output.webm

在這個例子中,我們將輸入文件轉(zhuǎn)換為WebM格式,并使用libvpx編碼器進行視頻編碼,音頻仍然使用AAC編碼器。

請注意,不同的視頻編碼器具有不同的特性和效率,選擇適合你需求的編碼器很重要。同時,編碼過程的速度和輸出文件的質(zhì)量也可能因所選編碼器而異。


1.2.2 音頻編碼器選項

除了-c:a aac,F(xiàn)Fmpeg還支持許多其他音頻編碼器,你可以根據(jù)你的需求選擇合適的編碼器。以下是一些常見的音頻編碼器選項:

  1. aac: 使用Advanced Audio Coding (AAC)編碼器,廣泛用于高質(zhì)量音頻壓縮,特別適用于MP4格式。
  2. libmp3lame: 使用LAME MP3編碼器,用于將音頻編碼為MP3格式,是MP3壓縮的常用工具。
  3. libopus: 使用Opus編碼器,支持低延遲音頻傳輸和高質(zhì)量音頻編碼。
  4. libvorbis: 使用Vorbis編碼器,用于將音頻編碼為Ogg Vorbis格式。
  5. pcm_s16le: 無損音頻編碼器,直接使用16位有符號PCM編碼。
  6. copy: 使用此選項時,F(xiàn)Fmpeg將直接拷貝輸入音頻流,不進行重新編碼。這對于只想改變?nèi)萜鞲袷蕉恢匦聣嚎s音頻的情況很有用。

使用其他音頻編碼器的示例命令類似于之前的例子,只需將-c:a選項后的編碼器名稱替換為你想要使用的編碼器即可。例如,使用libmp3lame編碼器:

ffmpeg -i input.wav -c:a libmp3lame output.mp3

在這個例子中,我們將輸入的WAV音頻文件轉(zhuǎn)換為MP3格式,并使用libmp3lame編碼器進行音頻編碼。


1.3 MP4文件中的Demuxer

1.3.1 MP4文件中的Demuxer是什么?

在FFmpeg中,MP4文件的Demuxer是一個解復用器(Demultiplexer),它負責從MP4容器文件中提取視頻、音頻、字幕等各種媒體流。Demuxer的作用是將這些流分離出來,以便后續(xù)的處理器(如解碼器、濾鏡等)可以單獨處理這些媒體數(shù)據(jù)。

MP4文件是一種容器格式,可以包含多個媒體流,通常包括以下幾種:

  1. 視頻流:包含視頻數(shù)據(jù),如電影或視頻片段的畫面。
  2. 音頻流:包含音頻數(shù)據(jù),如音樂或角色的對話。
  3. 字幕流:包含字幕數(shù)據(jù),用于顯示視頻中的文字。
  4. 其他元數(shù)據(jù):MP4文件還可以包含其他類型的數(shù)據(jù),如封面圖片、藝術(shù)家信息等。

Demuxer在解析MP4文件時,會讀取文件的結(jié)構(gòu),找到并識別其中的各種媒體流,并將它們提取出來。一旦這些流被提取,它們就可以被傳遞給相應(yīng)的解碼器進行解碼,或者進一步處理,比如轉(zhuǎn)碼、剪輯、添加濾鏡等。

使用MP4文件的Demuxer功能,可以將MP4文件拆分成單獨的視頻、音頻和字幕文件,這樣就可以對它們進行獨立處理,或者重新封裝成其他容器格式。這在視頻編輯、轉(zhuǎn)碼和處理等應(yīng)用中非常有用。

總之,MP4文件的Demuxer是FFmpeg中的一個模塊,它能夠解析MP4容器文件并從中提取各種媒體流,為后續(xù)處理器提供方便。


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

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

ffmpeg -i input.mp4

input.mp4替換為你要查看的MP4文件的路徑。

運行上述命令后,F(xiàn)Fmpeg會解析輸入的MP4文件,并顯示相關(guān)的信息,包括視頻流、音頻流、字幕流以及其他元數(shù)據(jù)信息。在輸出結(jié)果中,你可以找到以下信息:

  • Stream #x:xx: 這些行顯示了每個流的詳細信息。其中x是流的索引號,從0開始,xx是流的類型,比如Video表示視頻流,Audio表示音頻流,Subtitle表示字幕流等。
  • Codec: 這一行顯示了每個流所使用的編解碼器信息。
  • Duration: 這一行顯示了每個流的時長。
  • Bitrate: 這一行顯示了每個流的比特率,即每秒傳輸?shù)谋忍財?shù)。
  • Resolution: 這一行顯示了視頻流的分辨率。
  • Audio: 這一行顯示了音頻流的采樣率和聲道數(shù)。
  • Subtitle: 這一行顯示了字幕流的語言信息。
  • Metadata: 這一部分顯示了文件中可能包含的其他元數(shù)據(jù)信息,如標題、作者、封面圖片等。

通過查看這些信息,你可以了解MP4文件中包含的媒體流以及與之相關(guān)的詳細信息。這對于檢查文件屬性、診斷問題以及了解媒體內(nèi)容非常有用。

下面是一個具體的案例:

假設(shè)你有一個名為example.mp4的MP4文件,位于你當前工作目錄下。現(xiàn)在,你想要查看該文件中的媒體流和其他相關(guān)信息。

打開終端或命令提示符(Windows),輸入以下命令:

ffmpeg -i example.mp4

然后按下回車鍵運行該命令。

FFmpeg會解析example.mp4文件,并顯示相關(guān)的媒體流信息以及其他元數(shù)據(jù)信息。輸出結(jié)果可能類似于以下內(nèi)容:

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
  • 元數(shù)據(jù)信息:主要品牌、次要版本、兼容品牌、創(chuàng)建時間等
  • 視頻流:編碼器為h264,分辨率為1280x720,幀率為25 fps,比特率為1624 kb/s
  • 音頻流:編碼器為AAC(LC),采樣率為44100 Hz,聲道數(shù)為立體聲,比特率為127 kb/s

通過解析這些信息,你可以了解到example.mp4文件的基本信息以及其中包含的視頻和音頻流的詳細參數(shù)。


1.4 MP4文件中的Muxer

1.4.1 MP4文件中的Muxer是什么?

在MP4文件中,Muxer(復用器或合復用器)是用于合成(Multiplexing)不同類型媒體流到單個MP4容器文件中的程序或模塊。MP4文件是一種數(shù)字多媒體容器格式,它可以包含視頻、音頻、字幕和其他數(shù)據(jù)流。Muxer的主要作用是將這些來自不同來源的媒體流合并到一個MP4文件中,使它們可以同時存儲、傳輸和播放。

簡單來說,MP4文件的Muxer就像是合并不同媒體內(nèi)容的"容器",將視頻、音頻、字幕等流放入其中,構(gòu)建一個統(tǒng)一的文件。這樣,你可以在一個單獨的MP4文件中同時包含視頻、音頻、字幕和其他相關(guān)內(nèi)容。

具體來說,MP4文件的Muxer會完成以下任務(wù):

  1. 打開新文件:首先,Muxer會創(chuàng)建一個新的MP4文件,并打開它,準備向其中寫入數(shù)據(jù)。
  2. 合并媒體流:Muxer會將來自不同來源的媒體流,比如視頻、音頻和字幕流,合并到MP4文件中。它會根據(jù)MP4文件的規(guī)范,將這些流正確地放置在文件的指定位置。
  3. 寫入媒體數(shù)據(jù):Muxer會從各個媒體流中讀取數(shù)據(jù),并按照特定的格式將這些數(shù)據(jù)寫入到MP4文件中。這樣,每個媒體流的數(shù)據(jù)都能被正確地放入容器中。
  4. 重新封裝:在一些情況下,Muxer可能還會對媒體數(shù)據(jù)進行重新封裝,以滿足特定的要求或優(yōu)化文件結(jié)構(gòu)。
  5. 關(guān)閉文件:當所有媒體數(shù)據(jù)都寫入到MP4文件中后,Muxer會關(guān)閉文件,完成合成過程。

總的來說,MP4文件的Muxer在媒體處理工具中扮演著重要的角色,它負責將來自不同來源的媒體流合并到一個MP4容器文件中。這使得MP4文件成為一種方便的多媒體容器,可以同時存儲、傳輸和播放多種類型的媒體內(nèi)容,如視頻、音頻、字幕和其他元數(shù)據(jù)。


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

在FFmpeg中,命令行可以用于查看MP4文件的Muxer信息,但實際上,查看Muxer信息并不是FFmpeg的主要功能之一,因為Muxer是用于合成(Multiplexing)多個媒體流到容器文件的過程,而通常情況下,我們是在處理單個媒體文件或者進行媒體轉(zhuǎn)碼等操作。

然而,如果你想查看MP4文件的一般信息,包括媒體流、元數(shù)據(jù)等,可以使用以下命令:

ffmpeg -i input.mp4

input.mp4替換為你要查看的MP4文件的路徑。

運行這個命令后,F(xiàn)Fmpeg會解析輸入的MP4文件,并顯示相關(guān)的信息,包括視頻流、音頻流、字幕流以及其他元數(shù)據(jù)信息。在輸出結(jié)果中,你可以找到以下信息:

  • Stream #x:xx: 這些行顯示了每個流的詳細信息。其中x是流的索引號,從0開始,xx是流的類型,比如Video表示視頻流,Audio表示音頻流,Subtitle表示字幕流等。
  • Codec: 這一行顯示了每個流所使用的編解碼器信息。
  • Duration: 這一行顯示了每個流的時長。
  • Bitrate: 這一行顯示了每個流的比特率,即每秒傳輸?shù)谋忍財?shù)。
  • Resolution: 這一行顯示了視頻流的分辨率。
  • Audio: 這一行顯示了音頻流的采樣率和聲道數(shù)。
  • Subtitle: 這一行顯示了字幕流的語言信息。
  • Metadata: 這一部分顯示了文件中可能包含的其他元數(shù)據(jù)信息,如標題、作者、封面圖片等。

通過查看這些信息,你可以了解MP4文件中包含的媒體流以及與之相關(guān)的詳細參數(shù)。請注意,這些信息并不直接涉及Muxer的具體細節(jié),因為在大多數(shù)情況下,F(xiàn)Fmpeg會自動選擇合適的Muxer進行輸出,而不需要手動查看或指定Muxer信息。

下面是一個具體的案例:

假設(shè)你有一個名為example.mp4的MP4文件,位于你當前工作目錄下?,F(xiàn)在,你想要查看該文件中的媒體流和其他相關(guān)信息。

打開終端或命令提示符(Windows),輸入以下命令:

ffmpeg -i example.mp4

然后按下回車鍵運行該命令。

FFmpeg會解析example.mp4文件,并顯示相關(guān)的媒體流信息以及其他元數(shù)據(jù)信息。輸出結(jié)果可能類似于以下內(nèi)容:

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
  • 元數(shù)據(jù)信息:主要品牌、次要版本、兼容品牌、創(chuàng)建時間等
  • 視頻流:編碼器為h264,分辨率為1280x720,幀率為25 fps,比特率為1624 kb/s
  • 音頻流:編碼器為AAC(LC),采樣率為44100 Hz,聲道數(shù)為立體聲,比特率為127 kb/s

通過解析這些信息,你可以了解到example.mp4文件的基本信息以及其中包含的視頻和音頻流的詳細參數(shù)。


2 視頻文件轉(zhuǎn)FLV

2.1 FLV格式簡介

當我們談?wù)揊LV格式時,它是一種視頻文件格式,F(xiàn)LV代表“Flash Video”。FLV是Adobe公司開發(fā)的一種流行的視頻容器格式,最初用于在互聯(lián)網(wǎng)上傳輸和播放視頻內(nèi)容,特別是在Flash播放器中。雖然現(xiàn)在已經(jīng)有更先進的視頻格式出現(xiàn),但FLV仍然在一些應(yīng)用中廣泛使用。

FLV格式的簡潔之處在于它是一種容器格式,可以包含不同編碼和分辨率的視頻、音頻和字幕流。這意味著你可以把視頻和音頻合并在一個FLV文件中,然后通過網(wǎng)絡(luò)傳輸它,并使用Flash播放器來播放。

由于FLV文件通常較小,所以在互聯(lián)網(wǎng)上傳輸和共享視頻時非常有用。在過去,許多視頻網(wǎng)站都使用FLV格式,因為它可以通過Flash插件在各種瀏覽器上播放。

然而,隨著技術(shù)的發(fā)展,HTML5視頻和其他更先進的視頻編解碼技術(shù)逐漸取代了Flash和FLV格式?,F(xiàn)在,主流視頻網(wǎng)站已經(jīng)轉(zhuǎn)向更現(xiàn)代的視頻格式,如MP4、WebM等,因為它們在各種設(shè)備上的兼容性更好,并支持更高質(zhì)量的視頻。

總而言之,F(xiàn)LV格式是一種過去常用的視頻容器格式,適用于Flash播放器和早期的視頻網(wǎng)站。雖然它在一些應(yīng)用中仍然有用,但隨著技術(shù)的發(fā)展,它的使用逐漸減少,讓位給更現(xiàn)代的視頻格式。


2.2 視頻文件轉(zhuǎn)FLV

要將視頻文件轉(zhuǎn)換為FLV格式,你可以使用FFmpeg的命令行工具。下面是一個常見的命令示例:

ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.flv

上述命令中的參數(shù)含義如下:

  • -i input.mp4: 這是輸入文件的路徑和名稱。在這個例子中,input.mp4是你要轉(zhuǎn)換的原始視頻文件。
  • -c:v libx264: 這是視頻編碼器選項。這里我們使用libx264編碼器,它是H.264視頻編碼器,廣泛支持且具有較好的壓縮效率和質(zhì)量。
  • -c:a aac: 這是音頻編碼器選項。我們使用AAC音頻編碼器,它是一種高質(zhì)量的音頻壓縮技術(shù)。
  • output.flv: 這是輸出文件的路徑和名稱。在這個例子中,output.flv是你轉(zhuǎn)換后生成的FLV文件。

使用上述命令,F(xiàn)Fmpeg會將輸入的視頻文件進行重新編碼,并將其保存為FLV格式的輸出文件。請注意,此過程可能需要一些時間,具體時間取決于輸入文件的大小和計算機性能。


2.3 FFmpeg生成帶關(guān)鍵索引的 FLV

要使用FFmpeg生成帶有關(guān)鍵索引(keyframe index)的FLV文件,你需要添加-g參數(shù)來設(shè)置關(guān)鍵幀間隔。關(guān)鍵索引可以提高視頻文件的隨機訪問性能,讓視頻在網(wǎng)絡(luò)傳輸和播放過程中更加穩(wěn)定和高效。

以下是一個生成帶關(guān)鍵索引的FLV文件的命令行示例:

ffmpeg -i input.mp4 -c:v libx264 -c:a aac -g 30 output.flv

上述命令中的參數(shù)含義如下:

  • -i input.mp4: 這是輸入文件的路徑和名稱。在這個例子中,input.mp4是你要轉(zhuǎn)換的原始視頻文件。
  • -c:v libx264: 這是視頻編碼器選項。這里我們使用libx264編碼器,它是H.264視頻編碼器,廣泛支持且具有較好的壓縮效率和質(zhì)量。
  • -c:a aac: 這是音頻編碼器選項。我們使用AAC音頻編碼器,它是一種高質(zhì)量的音頻壓縮技術(shù)。
  • -g 30: 這是設(shè)置關(guān)鍵幀間隔的選項。在這個例子中,我們將關(guān)鍵幀間隔設(shè)置為30幀。你可以根據(jù)需要調(diào)整這個值,通常使用視頻幀率的兩倍作為關(guān)鍵幀間隔是一個合理的選擇。
  • output.flv: 這是輸出文件的路徑和名稱。在這個例子中,output.flv是你生成的帶有關(guān)鍵索引的FLV文件。

運行上述命令后,F(xiàn)Fmpeg會讀取input.mp4文件,并使用libx264視頻編碼器和AAC音頻編碼器重新編碼視頻和音頻,并生成一個帶有關(guān)鍵索引的FLV格式的輸出文件output.flv。

除了使用-g參數(shù)設(shè)置關(guān)鍵幀間隔外,還有其他一些與關(guān)鍵幀相關(guān)的參數(shù)可以在FFmpeg中使用,以便更好地控制視頻編碼和生成關(guān)鍵索引的FLV文件。以下是一些常見的關(guān)鍵幀相關(guān)的參數(shù):

  1. 使用-bf參數(shù)設(shè)置B幀數(shù):
    假設(shè)我們有一個名為input.mp4的視頻文件,現(xiàn)在我們想要將其轉(zhuǎn)換為FLV格式,并設(shè)置兩個B幀。我們可以使用以下命令:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -bf 2 output.flv

在這個命令中,-bf 2表示設(shè)置兩個B幀。

  1. 使用-keyint_min參數(shù)設(shè)置最小關(guān)鍵幀間隔:
    如果我們希望強制使關(guān)鍵幀更頻繁,可以設(shè)置最小關(guān)鍵幀間隔為30幀。命令如下:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -g 60 -keyint_min 30 output.flv

在這個命令中,-g 60表示設(shè)置關(guān)鍵幀間隔為60幀,-keyint_min 30表示設(shè)置最小關(guān)鍵幀間隔為30幀。

  1. 使用-force_key_frames參數(shù)強制指定關(guān)鍵幀的時間戳:
    假設(shè)我們希望在視頻的第10秒和第30秒位置生成關(guān)鍵幀,可以使用以下命令:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -force_key_frames 10,30 output.flv

在這個命令中,-force_key_frames 10,30表示在時間戳10秒和30秒位置生成關(guān)鍵幀。

  1. 使用-x264opts keyint參數(shù)設(shè)置關(guān)鍵幀間隔(libx264編碼器):
    如果我們使用libx264編碼器,可以使用-x264opts keyint參數(shù)來設(shè)置關(guān)鍵幀間隔。例如,設(shè)置關(guān)鍵幀間隔為30幀的命令如下:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -x264opts keyint=30 output.flv

以上四個案例分別演示了如何使用不同參數(shù)來控制關(guān)鍵幀的生成和間隔,以及如何影響視頻編碼和生成帶有關(guān)鍵索引的FLV文件。請根據(jù)你的具體需求選擇適合的參數(shù)設(shè)置。

請注意,生成關(guān)鍵索引可能會導致輸出文件稍微增大一些,但它可以顯著改善視頻的隨機訪問性能。這在視頻網(wǎng)絡(luò)傳輸和流媒體播放中非常有用,特別是對于長時間的視頻文件。


3 視頻文件轉(zhuǎn)M3U8

3.1 M3U8格式簡介

M3U8是一種簡單易懂的文本文件格式,用于描述多媒體播放列表。它是一種基于文本的文件,通常用于流媒體服務(wù)和在線視頻播放。

M3U8文件的內(nèi)容非常簡單,它包含一系列URL地址,這些地址指向不同的媒體文件片段或流。這些媒體文件片段通常是視頻或音頻的分段,每個片段都是一小段連續(xù)的媒體內(nèi)容。通過將這些片段按順序組合在一起,就可以實現(xiàn)流暢的媒體播放。

M3U8文件的結(jié)構(gòu)如下:

#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: 這是一個必需標記,用于指定每個媒體片段的最大持續(xù)時間(以秒為單位)。這個值告訴播放器在請求下一個片段之前等待的最長時間。
  • #EXT-X-MEDIA-SEQUENCE:0: 這是一個必需標記,用于指定第一個媒體片段的序列號。隨著播放,序列號會逐漸遞增。
  • #EXTINF:10.0,: 這是一個必需標記,用于指定下一個媒體片段的持續(xù)時間(以秒為單位)。在逗號后面指定的時間是片段的持續(xù)時間。
  • https://example.com/media/segment-0.ts: 這是一個媒體片段的URL地址,它是實際視頻或音頻內(nèi)容所在的位置。播放器會根據(jù)這些URL逐個加載和播放媒體片段。
  • #EXT-X-ENDLIST: 這是一個可選標記,表示M3U8文件中不再有其他片段,播放到這里就結(jié)束了。

M3U8文件允許播放器動態(tài)地加載并播放媒體片段,從而實現(xiàn)了流媒體的連續(xù)播放。這在實時直播和點播等場景中非常有用。


3.2 FFmpeg轉(zhuǎn)HLS參數(shù)以及舉例

HLS(HTTP Live Streaming)是一種流媒體傳輸協(xié)議,它是由Apple公司開發(fā)的,并被廣泛用于實時直播和點播服務(wù)。M3U8是HLS使用的一種播放列表文件格式,用于描述HLS媒體流的切片和播放順序。

HLS協(xié)議將媒體文件切片成小段(通常是10秒左右)的TS(Transport Stream)分片,然后將這些分片以M3U8文件的形式組織成一個播放列表。M3U8文件是一個簡單的文本文件,其中包含了一系列URL地址,每個地址指向一個TS分片。播放器根據(jù)M3U8文件中的信息按順序加載和播放這些分片,從而實現(xiàn)流暢的媒體播放。

在FFmpeg中,你可以使用一些特定的參數(shù)來將視頻轉(zhuǎn)換為HLS格式并生成M3U8播放列表文件。

以下是一些常見的FFmpeg參數(shù),用于將視頻轉(zhuǎn)換為HLS格式:

  1. -i input.mp4: 這是輸入文件的路徑和名稱。在這個例子中,input.mp4是你要轉(zhuǎn)換為HLS的原始視頻文件。
  2. -c:v libx264: 這是視頻編碼器選項。這里我們使用libx264編碼器,它是H.264視頻編碼器,廣泛用于HLS。
  3. -c:a aac: 這是音頻編碼器選項。我們使用AAC音頻編碼器,因為它是HLS所支持的常用音頻格式。
  4. -hls_time 10: 這是設(shè)置HLS切片時長的選項,以秒為單位。在這個例子中,我們將切片時長設(shè)置為10秒。
  5. -hls_list_size 0: 這是設(shè)置HLS播放列表中切片數(shù)量的選項。0表示生成無限大小的播放列表。
  6. -hls_segment_filename “output_%03d.ts” : 這是設(shè)置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

運行上述命令后,F(xiàn)Fmpeg會讀取input.mp4文件,并將其轉(zhuǎn)換為HLS格式,生成HLS播放列表文件output.m3u8和對應(yīng)的媒體切片文件output_001.tsoutput_002.ts等等。這樣就可以通過HTTP服務(wù)器或其他支持HLS的平臺進行流媒體播放。


4 視頻文件切片

4.1 FFmpeg切片segment參數(shù)

在FFmpeg中,切片(segment)是指將輸入視頻或音頻文件切分為多個固定長度的小段,每個小段稱為一個切片。切片在流媒體傳輸中非常有用,可以實現(xiàn)平滑的播放和快速的隨機訪問。FFmpeg提供了一些參數(shù)來控制切片的生成。

下面是常見的切片相關(guān)參數(shù):

  1. -segment_time duration: 這是設(shè)置每個切片的時長的選項,以時間值duration表示。例如,-segment_time 10表示每個切片的時長為10秒。
  2. -segment_time_delta duration: 這是設(shè)置切片時長的偏差的選項,以時間值duration表示。默認情況下,切片時長是固定的,但使用這個選項可以讓切片的時長在一定范圍內(nèi)浮動。例如,-segment_time_delta 2表示切片的時長可以在10秒上下浮動2秒。
  3. -segment_format format: 這是設(shè)置切片文件格式的選項??梢允褂?code>mp4、avits等格式。例如,-segment_format ts表示生成TS格式的切片文件。
  4. -segment_list file: 這是設(shè)置輸出切片列表文件的選項。切片列表文件是一個M3U8格式的文本文件,包含所有切片文件的URL地址。例如,-segment_list playlist.m3u8表示生成名為playlist.m3u8的切片列表文件。
  5. -segment_list_type type: 這是設(shè)置切片列表文件的類型的選項??梢允褂?code>m3u8或mpegts。m3u8表示生成HLS播放列表文件,mpegts表示生成MPEG-TS格式的切片列表文件。
  6. -segment_list_size size: 這是設(shè)置切片列表文件的最大大小的選項。如果切片列表文件的大小超過這個值,將重新生成一個新的切片列表文件。例如,-segment_list_size 10M表示切片列表文件的最大大小為10MB。

這些參數(shù)可以根據(jù)你的需求來調(diào)整切片的生成方式。通過合理設(shè)置切片參數(shù),你可以實現(xiàn)適合不同應(yīng)用場景的切片策略,從而更好地控制生成的切片文件。


4.2 FFmpeg切片segment舉例

假設(shè)你有一個名為input.mp4的視頻文件,并且你希望將它切片為每個切片時長為10秒的TS格式文件,并生成一個HLS播放列表文件。

你可以使用以下命令來實現(xiàn):

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: 這是設(shè)置每個切片的時長的選項,這里我們將切片時長設(shè)置為10秒。
  • -segment_format mpegts: 這是設(shè)置切片文件格式的選項,我們選擇生成MPEG-TS格式的切片文件。
  • -segment_list output.m3u8: 這是設(shè)置輸出切片列表文件的選項,我們將切片列表保存為output.m3u8。
  • output_%03d.ts: 這是設(shè)置切片文件名的模板,%03d表示使用三位數(shù)的數(shù)字遞增命名切片文件。例如,生成的切片文件名可能是output_001.ts、output_002.ts等等。

運行這個命令后,F(xiàn)Fmpeg會讀取input.mp4文件,并將其切片為每個時長為10秒的TS格式文件。同時,它會生成一個名為output.m3u8的HLS播放列表文件,其中包含了所有切片文件的URL地址。切片文件會以output_001.tsoutput_002.ts等格式存儲在同一目錄中。

你可以將生成的切片文件和output.m3u8播放列表文件部署在支持HLS播放的HTTP服務(wù)器上,然后就可以通過HLS協(xié)議進行流媒體播放。播放器將根據(jù)output.m3u8中的信息逐個加載和播放這些切片文件,實現(xiàn)流暢的視頻播放和隨機訪問。


4.3 FFmpeg使用ss與t參數(shù)進行切片

在FFmpeg中,你可以使用-ss參數(shù)來指定從輸入文件的哪個時間點開始切片,使用-t參數(shù)來指定切片的持續(xù)時間。

以下是一個示例命令,假設(shè)你有一個名為input.mp4的視頻文件,你想從第10秒開始切片,并切片10秒鐘的內(nèi)容,然后保存為一個新的文件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秒開始切片的參數(shù)。00:00:10表示時間點為10秒。
  • -i input.mp4: 這是輸入文件的路徑和名稱,表示要切片的原始視頻文件。
  • -t 10: 這是指定切片的持續(xù)時間的參數(shù),這里我們設(shè)置切片持續(xù)時間為10秒。
  • -c:v copy: 這是視頻編碼器選項,copy表示直接復制視頻流而不重新編碼。因為我們只是進行簡單的切片操作,所以不需要重新編碼視頻。
  • -c:a copy: 這是音頻編碼器選項,copy表示直接復制音頻流而不重新編碼。同樣,由于我們只是進行切片,不需要重新編碼音頻。
  • output.mp4: 這是輸出文件的路徑和名稱,表示保存切片后的內(nèi)容為新的文件output.mp4。

運行這個命令后,F(xiàn)Fmpeg會從input.mp4文件的第10秒開始,切片10秒鐘的內(nèi)容,并將結(jié)果保存為output.mp4文件。

請注意,使用-ss參數(shù)進行切片時,F(xiàn)Fmpeg會盡可能地尋找最近的關(guān)鍵幀(I幀)作為切片的起始點,以確保切片的質(zhì)量和準確性。如果你需要更精確的切片起始點,可以使用-ss參數(shù)和-i參數(shù)的順序調(diào)換,即將-ss參數(shù)放在輸入文件之前,這樣可以更精確地控制切片起始時間點。


5 音視頻文件音視頻流抽取

5.1 FFmpeg抽取音視頻文件中的AAC音頻流

要從音視頻文件中抽取AAC音頻流,你可以使用FFmpeg并指定輸出的音頻編碼器為AAC。

以下是一個示例命令,假設(shè)你有一個名為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: 這是一個可選選項,用于設(shè)置編碼器的嚴格程度。在此情況下,我們設(shè)置為-2表示允許實驗性的非標準AAC編碼器。
  • output.aac: 這是輸出文件的路徑和名稱,表示保存抽取的AAC音頻流為output.aac文件。

運行這個命令后,F(xiàn)Fmpeg會從input.mp4文件中抽取AAC音頻流,并將結(jié)果保存為output.aac文件。

如果你需要重新編碼音頻流為其他格式或調(diào)整音頻參數(shù),可以使用不同的音頻編碼器和選項。在上述示例中,我們選擇了copy選項,這適用于直接復制原始的AAC音頻流。如果需要進行其他音頻處理,可以選擇不同的音頻編碼器并調(diào)整相應(yīng)參數(shù)。


5.2 FFmpeg抽取音視頻文件中的H.264視頻流

要從音視頻文件中抽取H.264視頻流,你可以使用FFmpeg并指定輸出的視頻編碼器為H.264。

以下是一個示例命令,假設(shè)你有一個名為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文件。

運行這個命令后,F(xiàn)Fmpeg會從input.mp4文件中抽取H.264視頻流,并將結(jié)果保存為output.h264文件。

如果你需要重新編碼視頻流為其他格式或調(diào)整視頻參數(shù),可以使用不同的視頻編碼器和選項。在上述示例中,我們選擇了copy選項,這適用于直接復制原始的H.264視頻流。如果需要進行其他視頻處理,可以選擇不同的視頻編碼器并調(diào)整相應(yīng)參數(shù)。


5.3 FFmpeg抽取音視頻文件中的H.265數(shù)據(jù)

要從音視頻文件中抽取H.265(也稱為HEVC)視頻數(shù)據(jù),你可以使用FFmpeg并指定輸出的視頻編碼器為H.265。

以下是一個示例命令,假設(shè)你有一個名為input.mp4的視頻文件,并且你希望從中抽取H.265視頻數(shù)據(jù),并保存為一個獨立的視頻文件output.h265

ffmpeg -i input.mp4 -c:v copy -an output.h265

解釋一下這個命令:

  • -i input.mp4: 這是輸入文件的路徑和名稱,表示要從中抽取視頻數(shù)據(jù)的原始視頻文件。
  • -c:v copy: 這是視頻編碼器選項,copy表示直接復制視頻流而不重新編碼。由于我們只是抽取H.265視頻數(shù)據(jù),不需要重新編碼。
  • -an: 這是禁止音頻流選項,表示不處理音頻流,只處理視頻流。
  • output.h265: 這是輸出文件的路徑和名稱,表示保存抽取的H.265視頻數(shù)據(jù)為output.h265文件。

運行這個命令后,F(xiàn)Fmpeg會從input.mp4文件中抽取H.265視頻數(shù)據(jù),并將結(jié)果保存為output.h265文件。

請注意,H.265是一種視頻編碼標準,它可以用于多種封裝格式,比如MP4、MKV等。上述命令中使用的-c:v copy選項表示直接復制原始視頻流而不重新編碼,因此輸出的output.h265文件中的數(shù)據(jù)將與原始視頻的H.265數(shù)據(jù)一致。如果你需要將H.265數(shù)據(jù)重新封裝到其他格式或進行其他視頻處理,可以使用不同的視頻編碼器和選項。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容