FFmpeg常見命令行(四):FFmpeg流媒體

前言

在Android音視頻開發中,網上知識點過于零碎,自學起來難度非常大,不過音視頻大牛Jhuster提出了《Android 音視頻從入門到提高 - 任務列表》,結合我自己的工作學習經歷,我準備寫一個音視頻系列blog。本文是音視頻系列blog的其中一個, 對應的要學習的內容是:如何使用FFmpeg命令行進行流媒體的處理。


音視頻系列blog

音視頻系列blog: 點擊此處跳轉查看.


目錄

在這里插入圖片描述


1 FFmpeg發布與錄制RTMP流

1.1 什么是流媒體

流媒體是一種通過互聯網或網絡傳輸的多媒體數據,例如視頻、音頻和其他媒體內容。與傳統的下載方式不同,流媒體允許用戶在數據傳輸的同時邊播放邊觀看或聽取,而無需等待完整文件下載完成。

想象一下你正在觀看一部在線視頻,當你點擊播放按鈕時,視頻并不會立即下載到你的設備上。相反,視頻數據會以流的形式傳輸到你的設備,并在接收到足夠的數據后立即開始播放。這種實時傳輸使得觀看體驗更加流暢,因為你不需要等待整個視頻下載完成才能開始觀看。

流媒體的優勢在于它可以根據你的設備和網絡條件動態調整傳輸速度和質量,以確保你能夠獲得最佳的觀看或聽取體驗。這也意味著你可以在不同的設備上觀看流媒體內容,比如在智能手機、電腦、平板電腦或智能電視上。

流媒體在現代互聯網中扮演著重要角色,它使我們能夠在任何時間、任何地點,通過互聯網享受高質量的視頻和音頻內容,比如觀看電影、電視節目、直播活動,或者收聽音樂和播客等。


1.2 什么是RTMP流

  • RTMP流簡介

RTMP是Real-Time Messaging Protocol(實時消息傳輸協議)的縮寫,它是一種用于傳輸流媒體數據的網絡協議。簡單來說,RTMP流就是通過RTMP協議傳輸的流媒體數據。

RTMP流通常用于直播和實時視頻傳輸。當你觀看一個直播視頻或在線直播時,你實際上是通過RTMP流接收視頻數據。這種流媒體傳輸方式允許視頻數據在傳輸的同時被實時播放,就像電視直播一樣。

想象一下,有人正在進行直播,他的攝像頭捕捉到視頻,然后這個視頻通過RTMP協議實時傳輸到一個流媒體服務器上。同時,你在觀看直播的時候,你的設備通過RTMP協議從服務器上接收這個視頻流,并在你的屏幕上實時播放。

RTMP流具有低延遲和高可靠性的特點,這使得它成為實時傳輸視頻和音頻的理想選擇。過去,RTMP流在視頻直播領域非常流行,但是隨著技術的發展,現在也有其他更先進的流媒體傳輸協議出現,比如HLS(HTTP Live Streaming)和DASH(Dynamic Adaptive Streaming over HTTP)。

  • 生活中的例子解釋RTMP流

想象你正在觀看一個網絡上的實時直播,比如英雄聯盟全球總決賽。RTMP(Real-Time Messaging Protocol)流就好像是你和比賽現場之間的一條虛擬連接,讓你能夠幾乎實時地看到比賽畫面,就像你坐在現場觀眾席上一樣。

這里有一個簡單的例子來解釋:

  1. 比賽錄制: 在比賽現場,攝像機正在錄制選手的比賽過程,同時捕捉他們的畫面和聲音。
  2. RTMP 服務器: 錄制的比賽畫面會通過 RTMP 協議傳輸到一個專門的服務器上,這個服務器負責分發直播內容。
  3. 創建 RTMP 流: 服務器將視頻和音頻合并成一個實時的 RTMP 流,這個流有一個特定的名字,比如 “esports_tournament”。
  4. 生成 RTMP URL: 當你想觀看比賽直播時,你會得到一個 RTMP URL,比如 rtmp://server_address/live/esports_tournament
  5. 播放器連接: 你的設備(手機、電腦等)上的播放器會使用這個 RTMP URL 連接到服務器上的 RTMP 流。
  6. 觀看比賽: 一旦連接建立,你的播放器會接收服務器傳來的實時視頻和音頻數據,然后解碼并在你的設備上顯示。你會幾乎實時地看到選手的比賽,就像你在現場一樣。

通過這個例子,你可以將 RTMP 流想象成一個虛擬的通道,讓你能夠在不在比賽現場的情況下,通過網絡實時觀看電子競技比賽或其他直播活動。


1.3 RTMP參數說明

RTMP(Real-Time Messaging Protocol)是一個相對復雜的協議,它涉及許多參數用于配置連接、傳輸和交互。以下是一些常見的 RTMP 參數:

  1. rtmp://server_address/app_name/stream_name: RTMP URL 格式,用于指定服務器地址、應用程序名稱和流的名稱。
  2. -i: 輸入參數,指定要連接的 RTMP 流的 URL。
  3. -c copy: 復制流而不進行轉碼,用于保留原始流。
  4. -t: 指定流的持續時間,用于限制播放或錄制的時長。
  5. -f: 指定輸出文件格式,例如 -f flv 表示輸出為 FLV 格式。
  6. -c:v、-c:a: 分別用于指定視頻編碼器和音頻編碼器。
  7. -r: 設置輸出視頻的幀率。
  8. -s: 設置輸出視頻的分辨率。
  9. -y: 強制覆蓋輸出文件,不詢問確認。
  10. -rtmp_pageurl: 指定播放器所在頁面的 URL 地址。
  11. -rtmp_swfurl: 指定 Flash 播放器的 URL 地址。
  12. -rtmp_teurl: 啟用加密的 URL 地址,用于加密保護。

這些參數在不同的情境下用于控制 RTMP 的連接、推流、播放和錄制過程。但要注意,隨著技術的發展,RTMP 在一些場景中逐漸被其他流媒體協議取代,如 HLS 和 DASH。


1.4 RTMP參數舉例

當使用 FFmpeg 進行 RTMP 播放、錄制或推流時,以下是一些示例命令行,說明如何使用常見的 RTMP 參數:

  1. RTMP 播放示例:

播放一個 RTMP 流并保存為本地文件:

ffmpeg -i rtmp://server_address/app_name/stream_name -c copy output_file.flv
  1. RTMP 推流示例:

推送本地視頻文件到 RTMP 服務器上:

ffmpeg -i input_file.mp4 -c:v libx264 -c:a aac -f flv rtmp://server_address/app_name/stream_name
  1. RTMP 錄制示例:

從 RTMP 流錄制為本地文件:

ffmpeg -i rtmp://server_address/app_name/stream_name -c copy output_file.flv
  1. 指定幀率和分辨率示例:

指定輸出視頻的幀率為 30 幀/秒,分辨率為 1280x720:

ffmpeg -i rtmp://server_address/app_name/stream_name -c:v libx264 -c:a aac -r 30 -s 1280x720 -f flv rtmp://new_server_address/new_app_name/new_stream_name
  1. 指定頁面 URL 和 Flash 播放器 URL 示例:

指定播放器所在頁面的 URL 和 Flash 播放器的 URL,用于服務器交互:

ffmpeg -i rtmp://server_address/app_name/stream_name -c copy -rtmp_pageurl http://example.com/playerpage -rtmp_swfurl http://example.com/player.swf output_file.flv

這些示例主要用于說明如何使用常見的 RTMP 參數進行操作。?


2 FFmpeg錄制RTSP流

使用 FFmpeg 錄制 RTSP 流是一個常見的任務,下面一個錄制 RTSP 流的示例命令行。在這個例子中,演示如何從一個 RTSP URL 錄制視頻流并將其保存為本地文件:

ffmpeg -i rtsp://your_rtsp_stream_url -c:v copy -c:a copy output_file.mp4

這個命令行的含義解釋如下:

  • -i rtsp://your_rtsp_stream_url:這是輸入參數,指定要錄制的 RTSP 流的 URL。替換 your_rtsp_stream_url 為實際的 RTSP 流的 URL。
  • -c:v copy:這表示對視頻流進行復制而不進行重新編碼。這樣可以保留原始的視頻編碼。
  • -c:a copy:類似于視頻,對音頻流進行復制,保留原始的音頻編碼。
  • output_file.mp4:這是輸出文件的名稱和格式。在這個示例中,將錄制的視頻和音頻保存為 MP4 文件。

2.1 什么是RTSP流

  • RTSP流簡介

RTSP(Real-Time Streaming Protocol)流是一種用于實時傳輸音視頻數據的協議。它允許用戶通過網絡獲取實時的音視頻內容,類似于觀看直播或者實時監控畫面。RTSP 流可以用于在不同設備之間傳輸音視頻數據,比如攝像頭、網絡攝像機、流媒體服務器等。

RTSP 不同于一般的下載或傳輸文件協議,它的主要特點是能夠支持實時的音視頻流。當你觀看實時直播、視頻會議、監控畫面等時,很可能正在使用 RTSP 流來獲取數據。

RTSP 流的工作方式大致如下:

  1. 客戶端請求連接: 用戶的設備(比如電腦、手機、平板等)通過 RTSP 請求與音視頻源(比如服務器、攝像頭)建立連接。
  2. 獲取音視頻流: 一旦連接建立,音視頻源就會開始傳輸實時的音視頻數據。這些數據被切分成小塊,按照特定的格式傳送給客戶端。
  3. 解碼和播放: 客戶端的音視頻播放器接收到這些數據,會進行解碼并實時播放出來。這就使你能夠在屏幕上看到實時的視頻畫面和聽到實時的音頻聲音。
  4. 交互和控制: 在某些情況下,RTSP 還允許用戶進行互動和控制,比如通過應用程序控制攝像頭的方向。

總之,RTSP 流是一種用于實時傳輸音視頻數據的協議,允許用戶在不同設備之間獲取實時的音視頻內容,為直播、視頻會議、監控等應用提供了重要的基礎。

  • RTSP 流與RTMP流的區別

RTSP(Real-Time Streaming Protocol)流和 RTMP(Real-Time Messaging Protocol)流都是用于傳輸實時音視頻數據的協議,但它們有一些關鍵的區別:

  1. 協議類型:
    • RTSP 是一種用于流媒體傳輸的應用層協議,主要用于控制和傳輸實時的音視頻流。它通常用于獲取流的控制信息、描述和傳輸媒體數據的位置。
    • RTMP 也是一種用于實時傳輸的協議,但它更為綜合,不僅傳輸音視頻流,還包括控制信息和其他元數據。
  2. 使用場景:
    • RTSP 通常用于監控系統、視頻會議、IP 攝像頭等實時傳輸應用,可以用于獲取實時的音視頻流并進行播放。
    • RTMP 在過去常用于直播、實時視頻聊天等場景,但隨著時間推移,它在一些環境中被更先進的協議如 HLS 和 DASH 替代。
  3. 工作方式:
    • RTSP 主要用于控制和描述音視頻流,它的焦點在于控制命令,而實際的媒體數據通常使用 RTP(Real-Time Transport Protocol)進行傳輸。
    • RTMP 則在一個協議中結合了控制和傳輸,包括了媒體數據的傳輸、元數據和控制命令。
  4. 支持和兼容性:
    • RTSP 在很多設備上都有基本的支持,但其傳輸效率和性能相對較低,尤其在不穩定的網絡環境中可能表現不佳。
    • RTMP 在過去非常流行,但隨著技術的發展,特別是移動設備的興起,它的使用逐漸減少。很多設備和瀏覽器不再原生支持 RTMP,這導致了其使用限制。

總之,RTSP 流和 RTMP 流都有各自的優點和適用場景,但隨著技術的進步,尤其是 HTTP 協議在流媒體傳輸中的廣泛應用,它們在一些情況下可能會被更先進的協議取代。?


2.2 RTSP參數說明

RTSP(Real-Time Streaming Protocol)是一種用于流媒體傳輸的協議,它涉及一些參數來配置連接和交互。以下是一些常見的 RTSP 參數:

  1. rtsp://server_address/resource_path: RTSP URL 格式,用于指定服務器地址和資源路徑。
  2. DESCRIBE: 用于請求描述性的媒體信息,通常返回一個 SDP(Session Description Protocol)描述文件。
  3. SETUP: 用于請求建立傳輸會話,指定傳輸方式和端口。
  4. PLAY: 用于請求開始媒體傳輸,即開始播放。
  5. PAUSE: 用于請求暫停媒體傳輸。
  6. TEARDOWN: 用于請求關閉媒體傳輸會話。
  7. OPTIONS: 用于查詢服務器支持的方法和參數。
  8. CSeq: 指定請求的序列號,用于跟蹤請求和響應的對應關系。
  9. Session: 標識會話的唯一標識符。
  10. Transport: 用于指定媒體傳輸的方式、傳輸層協議(如 RTP/UDP)和端口。
  11. Range: 用于指定媒體播放的時間范圍。
  12. User-Agent: 表示客戶端的用戶代理,用于識別客戶端應用。
  13. Authorization: 用于身份驗證和授權,確保訪問權限。
  14. Content-Length: 指定請求或響應的消息體長度。
  15. Content-Type: 指定請求或響應的消息體類型,通常用于指示 SDP 描述文件的類型。

這些參數用于在 RTSP 會話中進行控制、傳輸和交互。?


2.3 RTSP參數使用舉例

以下是一些常見的 RTSP 參數使用示例,展示了不同的 RTSP 命令和參數:

  1. DESCRIBE 請求示例:
    請求獲取媒體的描述信息(通常是 SDP 描述文件),以便了解媒體的屬性和參數。

    DESCRIBE rtsp://server_address/resource_path RTSP/1.0
    CSeq: 1
    User-Agent: YourUserAgent
    
  2. SETUP 請求示例:
    請求建立媒體傳輸會話,指定傳輸方式、傳輸協議和端口。

    SETUP rtsp://server_address/resource_path/trackID=1 RTSP/1.0
    CSeq: 2
    Transport: RTP/UDP;unicast;client_port=5000-5001
    User-Agent: YourUserAgent
    
  3. PLAY 請求示例:
    請求開始媒體傳輸,即開始播放媒體。

    PLAY rtsp://server_address/resource_path RTSP/1.0
    CSeq: 3
    Session: 123456
    Range: npt=0.000-
    User-Agent: YourUserAgent
    
  4. PAUSE 請求示例:
    請求暫停媒體傳輸。

    PAUSE rtsp://server_address/resource_path RTSP/1.0
    CSeq: 4
    Session: 123456
    User-Agent: YourUserAgent
    
  5. TEARDOWN 請求示例:
    請求關閉媒體傳輸會話。

    TEARDOWN rtsp://server_address/resource_path RTSP/1.0
    CSeq: 5
    Session: 123456
    User-Agent: YourUserAgent
    
  6. OPTIONS 請求示例:
    查詢服務器支持的方法和參數。

    OPTIONS rtsp://server_address/resource_path RTSP/1.0
    CSeq: 6
    User-Agent: YourUserAgent
    

這些示例展示了不同 RTSP 命令和參數的用法。每個命令都有不同的目的,通過這些參數,客戶端和服務器可以進行實時流媒體傳輸的控制和交互。 ?


3 FFmpeg錄制HTTP流

3.1 什么是HTTP流

HTTP流(HTTP Streaming)是一種通過HTTP協議傳輸音視頻內容的流媒體技術。與傳統的下載式HTTP傳輸不同,HTTP流允許在數據傳輸的同時進行播放,從而實現了實時的音視頻體驗,類似于傳統的電視廣播。

HTTP流的工作原理是將音視頻數據切分成小塊(通常稱為片段),然后通過HTTP協議逐個片段地傳輸到客戶端,客戶端在接收到一個或多個片段后即可開始播放。這使得HTTP流適合于實時播放、動態自適應流媒體和在線視頻等應用。簡單來說,HTTP流就是把視頻分成很多小塊,每次只下載一小塊,然后播放它,然后再下載下一小塊。這樣做的好處是,如果你的網絡變慢,你不會等很久才能開始看視頻,而是可以立刻看到前面已經下載的部分。而且,如果網絡好,你還可以根據你的設備和網絡狀況來下載適合你的視頻質量,以便獲得更好的觀看體驗。

與HTTP下載不同,HTTP流的主要優勢在于適應性和即時性。客戶端可以根據網絡狀況和設備能力選擇最適合的片段進行播放,從而提供更好的用戶體驗。另外,HTTP流也可以通過普通的HTTP服務器進行傳輸,無需特殊的流媒體服務器。

一些常見的HTTP流協議和技術包括:

  1. HLS(HTTP Live Streaming): 由蘋果公司開發,是一種基于HTTP的流媒體傳輸協議。它將媒體文件切分成短片段,并通過M3U8播放列表文件指示客戶端獲取和播放片段。
  2. DASH(Dynamic Adaptive Streaming over HTTP): 由MPEG制定,是一種動態自適應流媒體協議。它允許根據網絡條件自動調整傳輸質量,提供更平滑的播放體驗。
  3. Smooth Streaming: 由微軟開發,是一種HTTP流媒體協議,類似于HLS和DASH,用于在不同網絡條件下提供平滑的流媒體播放。

總之,HTTP流是一種在實時傳輸音視頻內容時采用HTTP協議的技術,通過切分、傳輸和播放小片段的方式,為用戶提供了更好的流媒體體驗。


3.2 HTTP參數說明

在流媒體中,HTTP流(HTTP Streaming)參數涉及與流媒體傳輸相關的一些參數,這些參數可以用來配置流媒體服務器和客戶端之間的通信。以下是一些常見的與HTTP流相關的參數:

  1. URL(Uniform Resource Locator): 用于指定流媒體的地址,包括協議、主機名、端口和路徑。
  2. MIME Type(多用途互聯網郵件擴展類型): 指示流媒體的數據類型,常見的包括視頻、音頻和圖片等。
  3. Content-Type: 在HTTP頭部中,用于指定響應數據的內容類型,通常與MIME類型相關聯。
  4. Range: 用于指定客戶端請求的媒體范圍,允許客戶端部分下載和播放。
  5. User-Agent: 標識客戶端應用或瀏覽器,可以用來適配不同設備的流媒體傳輸。
  6. Accept: 在HTTP頭部中,指示客戶端可以接受的響應內容類型,幫助服務器適應客戶端需求。
  7. Cookie: 在HTTP頭部中,用于在客戶端和服務器之間傳遞信息,通常用于用戶會話管理。
  8. Cache-Control: 控制客戶端或代理服務器對流媒體內容的緩存行為。
  9. Content-Length: 指示響應內容的長度,對于流媒體可以用來告知客戶端內容的總大小。
  10. Transfer-Encoding: 在HTTP頭部中,指示傳輸編碼,例如分塊傳輸(chunked)。
  11. Referer: 指示當前請求的源頭,用于記錄流媒體播放的來源。
  12. Connection: 控制持久連接或非持久連接,影響客戶端和服務器之間的連接方式。

這些參數可以在HTTP請求和響應中使用,用于控制流媒體的傳輸、播放和交互。在不同的流媒體技術中,可能會涉及特定的參數和頭部信息,以滿足不同的需求和應用場景。


3.3 HTTP參數使用舉例

下面是一些在流媒體中使用的HTTP參數的示例,這些示例涵蓋了流媒體傳輸過程中可能涉及的一些參數和頭部信息。

請求流媒體示例:

假設你要通過HTTP流請求一段視頻片段,你可以使用以下示例:

GET https://streaming.example.com/videos/sample.mp4 HTTP/1.1
Host: streaming.example.com
User-Agent: YourUserAgent
Range: bytes=0-999999

在這個示例中,你正在請求 sample.mp4 視頻片段,使用了 Range 參數來指示請求的數據范圍。

請求響應的流媒體示例:

當服務器響應時,可以使用以下示例:

HTTP/1.1 200 OK
Content-Type: video/mp4
Content-Length: 1000000
Connection: keep-alive
Cache-Control: no-cache
Accept-Ranges: bytes[video data]

在這個示例中,服務器返回了視頻數據,并包含了一些與流媒體傳輸相關的HTTP頭部信息,如 Content-TypeContent-LengthCache-ControlAccept-Ranges

這些示例演示了在流媒體傳輸中使用的HTTP參數。在實際應用中,參數的使用會根據具體的流媒體技術、服務器設置和客戶端需求而有所不同。


3.4 HTTP拉流錄制

在流媒體中,使用HTTP協議進行拉流和錄制是一種常見的操作。這意味著你可以從一個遠程服務器獲取流媒體內容,并將其保存為本地文件。以下是使用HTTP協議進行拉流和錄制的示例:

拉流和錄制示例:

假設你想要從一個HTTP服務器上拉取一個視頻流并將其錄制為本地文件,你可以使用工具如ffmpeg來實現。以下是一個示例命令行:

ffmpeg -i http://streaming.example.com/stream.m3u8 -c:v copy -c:a copy output_file.mp4

解釋這個命令行:

  • -i http://streaming.example.com/stream.m3u8:這是輸入參數,指定要拉取的流媒體的URL。這里使用了HLS格式的URL作為示例。
  • -c:v copy:這表示復制視頻流而不進行重新編碼,保留原始的視頻編碼。
  • -c:a copy:類似于視頻,對音頻流進行復制,保留原始的音頻編碼。
  • output_file.mp4:這是輸出文件的名稱和格式。在這個示例中,將錄制的音視頻保存為MP4文件。

在實際使用中,你需要替換URL、輸出文件名以及可能的參數,以適應你的情況和流媒體的格式。

需要注意的是,HTTP拉流和錄制涉及到流媒體服務器的訪問權限和網絡穩定性。


3.5 拉取HTTP中的流錄制FLV

要從HTTP流中拉取并錄制FLV格式的流媒體,你可以使用工具如ffmpeg來實現。以下是一個示例命令行,展示了如何從一個HTTP流中拉取數據并將其錄制為FLV文件:

ffmpeg -i http://streaming.example.com/stream.flv -c:v copy -c:a copy output_file.flv

解釋這個命令行:

  • -i http://streaming.example.com/stream.flv:這是輸入參數,指定要拉取的流媒體的URL。這里假設你要拉取的是FLV格式的流。
  • -c:v copy:這表示復制視頻流而不進行重新編碼,保留原始的視頻編碼。
  • -c:a copy:類似于視頻,對音頻流進行復制,保留原始的音頻編碼。
  • output_file.flv:這是輸出文件的名稱和格式。在這個示例中,將錄制的音視頻保存為FLV文件。

請確保替換示例中的URL和輸出文件名以適應你的情況和實際流媒體URL。同時要注意,要確保你有合法的權限來訪問流媒體服務器上的內容,并且服務器支持FLV格式的流媒體傳輸。


4 FFmpeg錄制和發布UDP / TCP流

4.1 什么是UDP / TCP流

在流媒體領域,UDP(User Datagram Protocol)和TCP(Transmission Control Protocol)是兩種不同的傳輸協議,用于在網絡上傳輸音視頻內容。它們在性能、可靠性和用途上有一些區別。

UDP流:

UDP是一種無連接的傳輸協議,它更注重傳輸速度而不是數據的可靠性。在流媒體中,UDP流通常用于實時性要求較高的場景,如直播和實時視頻通話。UDP具有以下特點:

  • 速度: 由于沒有連接建立和維護的開銷,UDP傳輸速度較快。
  • 低延遲: 由于無需等待確認和重傳,UDP可以提供較低的傳輸延遲,適用于實時性要求高的應用。
  • 無法保證可靠性: UDP沒有內置的重傳機制,所以在網絡不穩定的情況下可能會丟失數據包。
  • 應用場景: 適用于實時直播、視頻會議等場景,其中速度和低延遲更為重要。

TCP流:

TCP是一種面向連接的傳輸協議,它注重數據的可靠性和完整性。在流媒體中,TCP流通常用于點播和需要穩定傳輸的場景。TCP具有以下特點:

  • 可靠性: TCP通過確認和重傳機制來確保數據的可靠性,適合對數據完整性要求較高的應用。
  • 適合點播: 對于點播(即按需播放)場景,TCP可以確保數據按順序傳輸,不會丟失或重復。
  • 傳輸控制: TCP會自動調整傳輸速率,以適應網絡狀況,但會增加一些傳輸延遲。
  • 應用場景: 適用于點播、文件下載等場景,其中數據的完整性和可靠性更為重要。

在實際應用中,選擇使用UDP還是TCP取決于你的具體需求。如果你需要實時性和低延遲,可以選擇UDP。如果你更關注數據的可靠性和完整性,可以選擇TCP。許多流媒體技術和協議,如HLS、RTMP、RTSP等,都可以在UDP或TCP上運行,具體取決于其設計和用途。


4.2 TCP與UDP參數說明

在流媒體中,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是兩種不同的傳輸協議,它們各自在流媒體傳輸中可能涉及一些參數和設置。以下是一些與TCP和UDP在流媒體中使用相關的參數說明:

TCP參數說明:

  1. 端口號(Port Number): TCP連接使用端口號來標識不同的應用或服務。在流媒體中,服務器和客戶端通常需要協商和指定使用的端口號。
  2. 連接建立(Connection Establishment): 在TCP中,建立連接需要一個三次握手的過程,這可以影響流媒體傳輸的啟動速度和延遲。
  3. 流量控制(Flow Control): TCP使用窗口控制機制來調整傳輸速率,以避免數據丟失和網絡擁塞。這可能會導致一些傳輸延遲,但可以保證數據的可靠性。
  4. 擁塞控制(Congestion Control): TCP使用擁塞控制機制來調整傳輸速率,以避免網絡擁塞。這會對流媒體傳輸的實時性產生影響。

UDP參數說明:

  1. 端口號(Port Number): UDP連接同樣需要端口號來標識不同的應用或服務。在流媒體中,服務器和客戶端也需要指定端口號。
  2. 速度和實時性: 由于UDP沒有連接建立和擁塞控制,它可以提供更高的傳輸速度和低延遲,適用于實時性要求高的場景。
  3. 丟包和重傳: UDP沒有內置的重傳機制,因此在不穩定的網絡環境中,可能會導致數據包的丟失。對于流媒體,可能需要使用額外的容錯機制。
  4. 數據完整性: UDP不會像TCP那樣保證數據的完整性,需要通過應用層來確保數據的正確性。

這些參數和說明涵蓋了在流媒體傳輸中使用的TCP和UDP的一些基本特性。具體的參數設置會因應用、協議和網絡環境的不同而有所變化。選擇合適的協議和參數設置取決于你的流媒體需求,如實時性、可靠性和網絡穩定性等。


4.3 TCP參數使用舉例

在流媒體中,TCP(Transmission Control Protocol)通常用于點播(即按需播放)和需要可靠性傳輸的場景。以下是一個使用TCP參數的流媒體點播示例,假設你要從一個流媒體服務器上拉取一個視頻片段并播放:

使用TCP參數的點播示例:

ffmpeg -i tcp://streaming.example.com:80/video.mp4 -c:v copy -c:a copy output_file.mp4

解釋這個命令行:

  • -i tcp://streaming.example.com:80/video.mp4:這是輸入參數,指定要從服務器上拉取的視頻流的TCP URL。注意,這里使用了TCP協議,端口號是80,視頻文件是video.mp4
  • -c:v copy:這表示復制視頻流而不進行重新編碼,保留原始的視頻編碼。
  • -c:a copy:類似于視頻,對音頻流進行復制,保留原始的音頻編碼。
  • output_file.mp4:這是輸出文件的名稱和格式,將點播的音視頻保存為MP4文件。

這個示例演示了如何使用TCP協議從服務器上拉取視頻片段并將其保存為本地文件。使用TCP可以保證數據的可靠性和完整性,適用于點播場景。請確保替換示例中的服務器地址、端口號和文件名以適應你的實際情況。


4.4 UDP參數使用舉例

在流媒體中,UDP(User Datagram Protocol)通常用于實時性要求較高的場景,如直播和實時視頻通話。以下是一個使用UDP參數的流媒體實時直播示例,假設你要從一個流媒體服務器上接收實時視頻流并播放:

使用UDP參數的實時直播示例:

ffmpeg -i udp://@224.1.1.1:1234 -c:v copy -c:a copy output_file.ts

解釋這個命令行:

  • -i udp://@224.1.1.1:1234:這是輸入參數,指定要從服務器上接收的實時視頻流的UDP URL。在這個示例中,使用了多播地址224.1.1.1和端口號1234
  • -c:v copy:這表示復制視頻流而不進行重新編碼,保留原始的視頻編碼。
  • -c:a copy:類似于視頻,對音頻流進行復制,保留原始的音頻編碼。
  • output_file.ts:這是輸出文件的名稱和格式,將實時接收的音視頻保存為TS格式。

這個示例演示了如何使用UDP協議接收實時視頻流并將其保存為本地文件。使用UDP可以獲得更高的傳輸速度和低延遲,適用于實時直播場景。


5 FFmpeg推多路流

5.1 什么是多路流

多路流(Multistream)是指在一個傳輸通道中同時傳輸多個獨立的數據流,每個數據流可以包含不同類型的信息,如音頻、視頻、文本等。在流媒體中,多路流技術允許將不同媒體數據進行組合和同步,以便在接收端進行播放或顯示。

多路流的應用廣泛,尤其在視頻編碼和傳輸領域中。以下是一些常見的多路流應用場景:

  1. 視頻會議: 在視頻會議中,多個與會者可以同時傳輸視頻和音頻數據,這些數據被合并為一個多路流,以便在接收端顯示每個與會者的畫面和聲音。
  2. 實時直播: 在實時直播中,多個攝像頭可以同時捕捉不同的場景,然后將這些畫面合并為一個多路流,供觀眾觀看。
  3. 多媒體廣播: 多媒體廣播可以在一個頻道中同時傳輸音頻、視頻和文本等不同類型的信息,以滿足不同用戶的需求。
  4. 教育和培訓: 在教育領域,可以同時傳輸老師的演講、演示屏幕、學生的提問等多種信息,形成一個多路流,以便學生遠程參與。
  5. 實時監控: 在監控系統中,可以同時傳輸多個監控攝像頭的畫面,形成一個多路流,以便在監控中心查看多個區域。

多路流技術可以通過不同的協議和編碼方式實現,如RTMP、HLS、RTSP等。它提供了一種靈活的方式來組織和傳輸不同類型的媒體數據,使得在接收端能夠有效地進行處理和展示。

  • 使用生活中的例子來解釋多路流

想象你正在觀看一個多畫面的電視直播節目,比如體育比賽的轉播或新聞報道。在這個例子中,多路流可以被類比為電視屏幕上同時顯示多個不同的畫面,每個畫面代表一個獨立的信息源。以下是這個例子的解釋:

假設你正在觀看一場足球比賽的電視直播。電視屏幕被分成了幾個小窗口,每個窗口顯示不同的畫面:

  1. 主畫面: 這是主要的比賽畫面,顯示整個足球場上的比賽情況,包括球員在移動、射門和進球等。
  2. 解說員畫面: 另一個窗口可能顯示解說員或評論員的畫面,他們正在解說比賽進展、分析戰術和提供背景信息。
  3. 實時統計畫面: 另一個窗口可能顯示比賽的實時統計數據,如球隊得分、控球率、射門次數等。
  4. 替補席畫面: 還可以有一個窗口顯示替補席上的球員和教練,以及他們的反應和交流。

通過這種方式,你可以在同一個屏幕上同時觀看多個不同的畫面,獲取豐富的比賽信息。每個小窗口代表了一個獨立的數據流,這些數據流被合并在一起形成一個多路流,讓你能夠全面地體驗比賽的各個方面。

這個例子中的多路流類比于電視屏幕上的多個畫面,每個畫面對應著一個獨立的信息源,這種方式使得你可以更全面地了解和欣賞比賽的不同維度。


5.2 管道方式輸出多路流

在流媒體中,使用管道(Pipeline)方式輸出多路流通常涉及將不同的媒體源(例如視頻、音頻、字幕等)通過管道連接在一起,以便進行編碼、混合或合并,最終輸出為一個多路流。這種方式通常使用命令行工具如ffmpeg來實現。

以下是一個示例,演示如何使用ffmpeg的管道方式輸出多路流,將視頻和音頻合并為一個文件:

ffmpeg -i input_video.mp4 -i input_audio.mp3 -c:v copy -c:a copy output_combined.mp4

在這個示例中:

  • -i input_video.mp4:表示輸入視頻文件。
  • -i input_audio.mp3:表示輸入音頻文件。
  • -c:v copy -c:a copy:這部分表示使用復制方式將視頻和音頻流合并,以保留原始的編碼。
  • output_combined.mp4:表示輸出合并后的文件名和格式。

這個示例只是展示了如何將視頻和音頻合并成一個文件,實際中你可以根據需求進行更復雜的操作,如將多個視頻、音頻和字幕合并,或者將不同的媒體流進行編碼、混合等處理。

要注意,使用管道方式輸出多路流可能涉及到復雜的編碼、同步和混合工作,取決于具體的需求和流媒體技術。


5.3 tee封裝格式輸出多路流

在流媒體領域,tee 封裝格式通常用于將一個輸入流分成多個輸出流,并將每個輸出流保存到不同的文件或傳輸到不同的位置。這種技術對于需要將同一媒體源輸出到多個目的地的場景非常有用,比如同時錄制和實時傳輸。

以下是一個使用 tee 封裝格式的示例,演示如何將一個輸入流分成多個輸出流:

ffmpeg -i input_video.mp4 -c:v copy -c:a copy -f tee "[f=flv]output_stream1.flv|[f=mp4]output_stream2.mp4"

在這個示例中:

  • -i input_video.mp4:表示輸入視頻文件。
  • -c:v copy -c:a copy:這部分表示使用復制方式將視頻和音頻流保留原始的編碼。
  • -f tee:表示使用 tee 封裝格式進行分流。
  • [f=flv]output_stream1.flv|[f=mp4]output_stream2.mp4:這部分定義了兩個輸出流。[f=flv]output_stream1.flv 表示將一個輸出流保存為 FLV 格式的文件,[f=mp4]output_stream2.mp4 表示將另一個輸出流保存為 MP4 格式的文件。

這個示例中,輸入流被分成兩個輸出流,一個輸出為 FLV 格式,另一個輸出為 MP4 格式。

使用 tee 封裝格式的好處是,它可以同時在一個命令中處理多個輸出流,而不需要多次執行相同的處理操作。這對于同時滿足多種流媒體輸出需求非常方便。


5.4 tee協議輸出多路流

實際情況下,tee 協議可能不是一種常見的流媒體協議或封裝格式。如果你想要在流媒體中實現多路流的輸出,可能需要使用其他的封裝格式或協議。我認為你可能是想使用不同的流媒體協議來輸出多個流。以下是使用常見的流媒體協議進行多路流輸出的示例:

假設你想要同時將一個視頻流分別通過 RTMP 和 HLS 協議輸出,你可以使用 ffmpeg 進行操作。以下是示例命令行:

ffmpeg -i input_video.mp4 -c:v copy -c:a copy -f tee -map 0 -map 0 -flags +global_header \
"[f=flv]rtmp://your_rtmp_server/stream1|[f=hls]output_stream2.m3u8"

在這個示例中:

  • -i input_video.mp4:表示輸入視頻文件。
  • -c:v copy -c:a copy:這部分表示使用復制方式將視頻和音頻流保留原始的編碼。
  • -f tee:表示使用 tee 封裝格式進行分流。
  • -map 0 -map 0:這部分表示將輸入流映射兩次,以便同時輸出到兩個不同的協議。
  • -flags +global_header:這部分指定在輸出的 FLV 流中包含全局頭部信息,以確保正確的播放。
  • [f=flv]rtmp://your_rtmp_server/stream1:這部分定義了第一個輸出流,通過 RTMP 協議輸出到你的 RTMP 服務器。
  • [f=hls]output_stream2.m3u8:這部分定義了第二個輸出流,通過 HLS 協議輸出為 HLS 格式。

請替換示例中的輸入文件、服務器地址以及輸出文件名和格式。


6 FFmpeg生成HDS流

6.1 什么是HDS流

HDS(HTTP Dynamic Streaming)是Adobe公司推出的一種流媒體技術,用于將多個視頻片段(片段化)切分成小塊并通過HTTP協議傳輸。HDS旨在提供更好的流媒體體驗,特別是在HTTP服務器上傳輸和分發視頻內容。這個技術通常被用于Adobe Flash Player和Adobe Media Server之間的流媒體傳輸。

HDS的工作原理如下:

  1. 分段和編碼: 視頻文件被切分成一系列短小的片段,每個片段通常持續幾秒鐘。這些片段可以在編碼后存儲為FLV(Flash Video)或F4F(Fragmented Flash Video)格式。
  2. 播放列表: 在服務器上創建一個包含所有片段信息的播放列表(manifest),通常使用F4M(Fragmented MP4 manifest)格式。這個播放列表告訴客戶端如何獲取和播放各個片段。
  3. HTTP傳輸: 客戶端通過HTTP協議從服務器下載播放列表和片段。每個片段都是一個小文件,可以被獨立下載,這有助于更好地適應網絡變化和帶寬限制。
  4. 自適應比特率: HDS支持自適應比特率(ABR),這意味著根據用戶的網絡狀況,客戶端可以動態地選擇合適的比特率和分辨率來播放片段,以提供更流暢的觀看體驗。

HDS在一段時間內是Adobe Flash平臺上的一種主要流媒體技術,但隨著HTML5和其他流媒體協議的發展,它的使用逐漸減少。Adobe已于2020年停止對Flash Player的支持,這也導致了HDS的逐漸退出流媒體市場。在選擇流媒體技術時,需要考慮當前的市場趨勢和技術發展。

  • 使用生活中的例子來解釋HDS流

想象你正在觀看一個在線視頻平臺上的電影,而這個平臺使用了HDS(HTTP Dynamic Streaming)技術來提供流媒體內容。以下是一個生活中的例子,幫助解釋HDS流:

你正在使用電腦或智能手機訪問一個視頻平臺,決定觀看一部高清電影。當你點擊電影播放按鈕時,以下過程發生:

  1. 分段視頻: 視頻平臺將電影分成多個短的視頻片段,每個片段通常持續幾秒鐘到十幾秒鐘。這些片段按照一定的編碼和格式存儲,可能是FLV(Flash Video)或F4F(Fragmented Flash Video)等格式。
  2. 播放列表: 服務器為這部電影創建一個播放列表,以F4M(Fragmented MP4 manifest)格式呈現。這個播放列表列出了所有片段的順序、位置和屬性。客戶端將通過這個播放列表了解如何按順序下載并播放每個片段。
  3. HTTP傳輸: 當你開始播放電影時,客戶端會根據播放列表從服務器下載每個片段。這些片段作為小文件通過HTTP協議傳輸。因為每個片段都是獨立的,所以即使在網絡狀況不佳時,你仍然可以獲得一些內容并繼續觀看。
  4. 自適應播放: 如果你的網絡連接速度有所變化,HDS技術可以根據當前的帶寬狀況自動選擇適當的片段比特率和分辨率。這使你能夠在不同的網絡條件下獲得最佳的觀看體驗,避免視頻卡頓或加載過慢。

綜上所述,HDS流媒體技術通過將視頻分成小片段并使用HTTP協議傳輸,提供了更流暢的在線觀看體驗。這種方式使得視頻平臺能夠根據網絡情況提供適合的視頻內容,以確保你能夠盡情享受電影的觀看。


6.2 HDS參數說明

HDS(HTTP Dynamic Streaming)是Adobe Flash技術中的一種流媒體協議,用于將視頻切分為片段并通過HTTP協議傳輸。雖然HDS的使用逐漸減少,但以下是一些常見的HDS參數說明,以幫助你了解其基本設置:

  1. F4M 播放列表(Manifest): HDS使用一種稱為F4M(Fragmented MP4 manifest)的播放列表來指導客戶端獲取和播放視頻片段。這個播放列表包含了視頻片段的信息,如URL、時長、分辨率等。
  2. 分段視頻(Fragments): 視頻文件被切分為一系列小片段,每個片段包含一段時間的視頻內容。這些片段通常持續幾秒鐘到十幾秒鐘。片段的切分是為了更好地適應網絡環境和帶寬變化。
  3. 自適應比特率(ABR): HDS支持自適應比特率,可以根據客戶端的帶寬狀況動態地選擇合適的視頻片段比特率和分辨率。這有助于提供更流暢的觀看體驗。
  4. HTTP 傳輸: HDS使用HTTP協議進行傳輸,這意味著視頻片段通過HTTP請求從服務器下載。這種方式使得片段可以被獨立地下載,有助于適應網絡波動。
  5. 編碼格式: HDS可以使用不同的編碼格式,如FLV(Flash Video)或F4F(Fragmented Flash Video),這取決于你所使用的流媒體工具和服務器。
  6. 多路流: HDS技術允許你在同一個播放列表中包含多個視頻流,以適應不同的分辨率或音頻選項。
  7. 加密和安全性: HDS支持加密以保護流媒體內容的安全性,這對于付費內容和敏感信息的傳輸非常重要。

需要注意的是,由于HDS的使用逐漸減少,很多流媒體平臺已經采用其他更現代的流媒體協議,如HLS(HTTP Live Streaming)和DASH(Dynamic Adaptive Streaming over HTTP)。


6.3 HDS使用舉例

生成HDS流需要一些復雜的設置和配置,以下是一個示例命令行,演示如何使用ffmpeg工具生成HDS格式的流。請注意,這只是一個基本示例,實際操作可能會因使用的工具和服務器而有所不同。

ffmpeg -i input_video.mp4 -c:v libx264 -c:a aac -f hds -hls_playlist 1 output_hds

解釋這個命令行:

  • -i input_video.mp4:表示輸入視頻文件。
  • -c:v libx264 -c:a aac:這部分表示使用H.264編碼視頻和AAC編碼音頻。
  • -f hds:指定輸出格式為HDS。
  • -hls_playlist 1:指定生成F4M播放列表。
  • output_hds:指定輸出文件名(實際上會生成多個片段文件和一個F4M播放列表文件)。

這個示例將會將輸入視頻文件轉碼為H.264視頻和AAC音頻,然后將視頻切分為HDS格式的片段,同時生成一個F4M播放列表。請注意,實際使用時你需要根據你的服務器和流媒體工具的要求進行參數調整。

但是要注意的是,HDS技術已經逐漸退出流媒體市場,很多平臺已經不再使用它。大多數流媒體平臺已經轉向使用其他流媒體協議,如HLS(HTTP Live Streaming)和DASH(Dynamic Adaptive Streaming over HTTP)。


7 FFmpeg生成DASH流

7.1 什么是DASH流

DASH(Dynamic Adaptive Streaming over HTTP)是一種流媒體協議,用于將多個視頻片段切分并通過HTTP協議傳輸。與傳統的流媒體協議不同,DASH允許根據觀眾的網絡帶寬和設備能力,動態地調整傳輸的比特率和分辨率,以提供更好的流媒體體驗。DASH的設計使得它能夠適應不同的網絡狀況和設備類型,從而實現更穩定、高質量的觀看體驗。

DASH的工作原理如下:

  1. 分段視頻: 視頻文件被切分成多個小片段,每個片段包含一段時間的視頻內容。這些片段通常持續幾秒鐘到十幾秒鐘。片段的切分使得視頻適應不同網絡環境和帶寬。
  2. 播放列表(Manifest): DASH使用一個播放列表(通常稱為“manifest”)來指導客戶端獲取和播放視頻片段。這個播放列表是一個XML文件,包含了視頻片段的URL、時長、分辨率等信息。
  3. 自適應比特率(ABR): DASH技術支持自適應比特率,這意味著客戶端可以根據網絡狀況實時地選擇合適的片段比特率和分辨率。這有助于提供更流暢的觀看體驗,避免視頻卡頓或加載緩慢。
  4. HTTP傳輸: 客戶端通過HTTP協議從服務器下載播放列表和片段。每個片段都是一個小文件,可以被獨立下載,這有助于適應網絡波動。
  5. 適應性: DASH可以根據觀眾的設備和網絡情況,自動調整視頻質量,以保證最佳觀看體驗。當網絡帶寬高時,會播放高質量的片段,而在帶寬降低時,會切換到較低質量的片段。

DASH已經成為現代流媒體領域的一種重要技術,被廣泛應用于各種流媒體平臺和服務中,如視頻點播、直播、在線教育等。與傳統的流媒體協議相比,DASH的優勢在于其靈活性、自適應性以及對不同設備和網絡的支持能力。

  • 使用生活中的例子來解釋DASH流

想象你正在使用一個流媒體平臺觀看電影,而這個平臺使用了DASH(Dynamic Adaptive Streaming over HTTP)技術來提供流媒體內容。以下是一個生活中的例子,幫助解釋DASH流:

你正在使用你的智能手機觀看一部電影,而你的手機處于一個移動網絡連接中。當你點擊電影播放按鈕時,以下過程發生:

  1. 分段視頻: 視頻平臺將電影切分為多個小片段,每個片段通常持續幾秒鐘到十幾秒鐘。這些片段被切分為不同的質量級別,從低到高。
  2. 播放列表(Manifest): 服務器創建一個播放列表(通常為XML格式),其中列出了所有片段的URL、時長、質量等信息。這個播放列表告訴客戶端如何獲取和播放這些片段。
  3. HTTP傳輸: 當你開始播放電影時,你的手機會通過HTTP協議從服務器下載播放列表和片段。這些片段作為小文件傳輸,每次下載一個片段。這種方式使得每個片段可以被獨立下載,有助于適應網絡的波動。
  4. 自適應比特率: 當你的手機網絡連接強時,DASH技術會選擇較高質量的片段,提供更清晰的畫面。如果網絡狀況變差,DASH會自動切換到較低質量的片段,以確保不出現視頻卡頓。
  5. 適應性: 如果你從Wi-Fi連接切換到移動數據,DASH技術會根據新的網絡狀況重新選擇合適的片段,以適應不同網絡環境。

綜上所述,DASH流媒體技術通過將視頻切分為小片段并根據網絡狀況自動調整質量,提供了更流暢和高質量的觀看體驗。這使得你無需擔心網絡問題,可以在不同網絡環境下愉快地觀看電影。


7.2 DASH參數說明

DASH(Dynamic Adaptive Streaming over HTTP)是一種流媒體協議,它使用一系列參數來指定視頻的編碼、分辨率、比特率、片段切分等設置。以下是一些常見的DASH參數說明:

  1. -f dash 指定輸出格式為DASH。
  2. -seg_duration 指定每個片段的持續時間。這個參數決定了視頻被切分成多長的片段。
  3. -time_shift_buffer_depth 設置可回溯的時間范圍,允許客戶端回溯一定時間內的片段。
  4. -use_template 使用模板方式生成播放列表。模板方式允許通過變量生成不同質量、分辨率的片段URL。
  5. -adaptation_sets 定義適應性組。一個適應性組可以包含不同質量的視頻和音頻,以供客戶端根據網絡條件進行選擇。
  6. -map 映射輸入流到適應性組。使用不同的輸入流來創建不同質量的適應性組。
  7. -c:v-b:v 指定視頻編碼器和比特率,用于設置視頻的編碼和質量。
  8. -c:a-b:a 指定音頻編碼器和比特率,用于設置音頻的編碼和質量。
  9. -profile:v-level:v 設置視頻的profile和level,影響視頻的編碼和分辨率。
  10. -init_seg_name-media_seg_name 定義初始片段和媒體片段的命名格式。
  11. -mpd_output 指定輸出MPD(Media Presentation Description)文件的名稱,這是DASH播放列表的XML描述文件。

這些參數只是DASH參數中的一部分,實際使用時還需要根據你的具體需求和流媒體工具進行設置。DASH的優勢在于其靈活性,可以根據不同的需求和平臺進行配置,以實現最佳的流媒體體驗。


7.3 DASH參數使用舉例

以下是一個簡單的示例命令行,演示如何使用ffmpeg工具將視頻文件轉換為DASH格式,并生成一個包含多個適應性組的MPD(Media Presentation Description)播放列表。請注意,這只是一個基本示例,實際操作可能會因使用的工具和服務器而有所不同。

ffmpeg -i input_video.mp4 -c:v libx264 -c:a aac -f dash -seg_duration 10 \-use_template 1 -adaptation_sets "id=0,streams=v id=1,streams=a" \-map 0:v -map 0:a -b:v:0 1000k -b:a:0 128k \-b:v:1 500k -b:a:1 64k \-init_seg_name init-stream$RepresentationID$.mp4 \-media_seg_name segment$RepresentationID$-$Number%05d$.mp4 \output_directory

解釋這個命令行:

  • -i input_video.mp4:表示輸入視頻文件。
  • -c:v libx264 -c:a aac:這部分表示使用H.264編碼視頻和AAC編碼音頻。
  • -f dash:指定輸出格式為DASH。
  • -seg_duration 10:每個片段的持續時間為10秒。
  • -use_template 1:使用模板方式生成播放列表。
  • -adaptation_sets "id=0,streams=v id=1,streams=a":定義兩個適應性組,一個用于視頻(id=0)一個用于音頻(id=1)。
  • -map 0:v -map 0:a:將輸入視頻和音頻映射到適應性組。
  • -b:v:0 1000k -b:a:0 128k -b:v:1 500k -b:a:1 64k:定義不同適應性組的比特率。
  • -init_seg_name init-stream$RepresentationID$.mp4:初始片段的命名格式。
  • -media_seg_name segment$RepresentationID$-$Number%05d$.mp4:媒體片段的命名格式。
  • output_directory:指定輸出文件夾,其中會包含多個適應性組的片段文件和一個MPD播放列表文件。

請注意,這個示例中涉及到的參數可能因使用的工具和服務器而有所不同。在實際操作中,你需要根據你的需求和平臺的要求進行相應的設置。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35842.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35842.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35842.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode做題筆記77組合

給定兩個整數 n 和 k,返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 思路一:直接求出組合數將每個組合放進數組中 int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {int size 0, num 1, i;in…

Rust中的智能指針:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak<T>

Rust中的智能指針是什么 智能指針(smart pointers)是一類數據結構,是擁有數據所有權和額外功能的指針。是指針的進一步發展 指針(pointer)是一個包含內存地址的變量的通用概念。這個地址引用,或 ” 指向”…

UML 類圖的畫法

1.類圖的畫法 類 整體是個矩形,第一層類名,第二層屬性,第三層方法。 :public- : private# : protected空格: 默認的default 對應的類寫法。 public class Student {public String name;public Integer age;protected I…

2023杭電第七場補題報告1002 1004 1011 1013

2023杭電第七場補題報告1002 1004 1011 1013 1002 B. Random Nim Game (hdu.edu.cn) 思路 手推一下就可以發現其實除了一次必定結束的其他情況概論都是 1 2 \frac{1}{2} 21? 代碼 #include <bits/stdc.h> using namespace std; #define int long long void solve()…

【hello C++】特殊類設計

目錄 一、設計一個類&#xff0c;不能被拷貝 二、設計一個類&#xff0c;只能在堆上創建對象 三、設計一個類&#xff0c;只能在棧上創建對象 四、請設計一個類&#xff0c;不能被繼承 五、請設計一個類&#xff0c;只能創建一個對象(單例模式) C&#x1f337; 一、設計一個類&…

Sentinel使用實例

不說了&#xff0c;直接上官方文檔 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md Sentinel Example 項目說明 本項目演示如何使用 Sentinel starter 完成 Spring Clo…

【金融量化】對企業進行估值的方法有哪些?

估值的方法有哪些&#xff1f; 如何對企業進行估值&#xff1f;有2個方法估算。 1 絕對估值法 它是一種定價模型&#xff0c;用于計算企業的內在價值。 比如說你可以根據公司近N年的現金流情況。借此去預測未來N年的現金流情況。所有的現金流數據都可以在年報上查詢到。最后…

ios 知識

IOS 類文件.h和.m中interface的區別 大家都知道我們在創建類文件時會發現&#xff1a; #import <UIKit/UIKit.h>interface ViewController : UIViewControllerend和 #import "ViewController.h"interface ViewController ()end那么他們之間有何區別呢&#x…

【Ajax】回調地獄解決方法

回調地獄&#xff08;Callback Hell&#xff09;是指在異步編程中&#xff0c;特別是在嵌套的回調函數中&#xff0c;代碼變得深度嵌套、難以閱讀和維護的現象。這通常發生在處理多個異步操作時&#xff0c;每個操作都依賴于前一個操作的結果。回調地獄使代碼變得難以理解、擴展…

顯卡服務器適用于哪些場景

顯卡&#xff08;GPU&#xff09;服務器&#xff0c;簡單來說&#xff0c;GPU服務器是基于GPU的應用于視頻編解碼、深度學習、科學計算等多種場景的快速、 穩定、彈性的計算服務。那么壹基比小鑫告訴你顯卡服務器主要的用途有哪一些。 一、運行手機模擬器 顯卡服務器可支持…

力扣:62. 不同路徑(Python3)

題目&#xff1a; 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&…

WebRTC音視頻通話-WebRTC本地視頻通話使用ossrs服務搭建

iOS開發-ossrs服務WebRTC本地視頻通話服務搭建 之前開發中使用到了ossrs&#xff0c;這里記錄一下ossrs支持的WebRTC本地服務搭建。 一、ossrs是什么&#xff1f; ossrs是什么呢&#xff1f; SRS(Simple Realtime Server)是一個簡單高效的實時視頻服務器&#xff0c;支持RTM…

STM32CubeIDE的安裝和黑色主題及自動補全代碼

STM32CubeIDE之前用過一點時間&#xff0c;但后來因為不習慣放棄了最近在新電腦上又用起來了&#xff0c;感覺相對之前好了很多&#xff0c;其實如果在工作中基本使用的是STM32,用意法的生態軟件也挺好的&#xff0c;意法最近在這塊也在大力發展&#xff0c;STM32CubeIDE安裝包…

【BASH】回顧與知識點梳理(十三)

【BASH】回顧與知識點梳理 十三 十三. 文件內容查閱13.1 直接檢視文件內容&#xff1a;cat, tac, nlcat (concatenate)tac (反向列示)nl (添加行號打印) 13.2 可翻頁檢視&#xff1a;more, lessmore (一頁一頁翻動)less (一頁一頁翻動) 13.3 資料擷取&#xff1a;head, tailhea…

【Linux】云服務器自動化部署VuePress博客(Jenkins)

前言 博主此前是將博客部署在 Github Pages&#xff08;基于 Github Action&#xff09;和 Vercel 上的&#xff0c;但是這兩種部署方式對于國內用戶很不友好&#xff0c;訪問速度堪憂。因此將博客遷移到自己的云服務器上&#xff0c;并且基于 Jenkins&#xff08;一款開源持續…

浪涌保護器中SPD防雷模塊的主要應用方案

浪涌保護器&#xff08;Surge Protective Device&#xff0c;SPD&#xff09;是一種用于限制瞬態過電壓和導引泄放電涌電流的非線性防護器件&#xff0c;用以保護耐壓水平低的電器或電子系統免遭雷擊及雷擊電磁脈沖或操作過電壓的損害。SPD可以將過電壓泄放到地線或限制過電壓到…

類與對象(入門)

目錄 1.前言 2.類的引入 3.類的定義 4.類的訪問限定符及封裝 4.1 訪問限定符 4.2 封裝 5.類的作用域 6.類的實例化 7. 結構體內存對齊規則 8.this指針 8.1 this指針的引出 8.2 this指針的特性 1.前言 C 是 基于面向對象 的&#xff0c; 關注 的是 對象 &#xff0c;…

【Spring】核心容器——依賴自動裝配

Spring容器根據bean所依賴的資源在容器中自動查找并注入bean的過程叫做自動裝配自動裝配的方式 1、按類型 2、按名稱&#xff08;耦合性較高&#xff09; 3、按構造方法 自動裝配特點 1、自動裝配用于對引用類型進行依賴注入&#xff0c;不能對簡單類型進行操作 2、自動裝配的…

多元最短路(Floyd)

是一個基于動態規劃的全源最短路算法。它可以高效地求出圖上任意兩點之間的最短路 時間復雜度 O(n^3) 狀態轉移方程 f[i][j]min(f[i][j],f[i][k]f[k][j]) 核心代碼 void floyd(){for(int k1;k<n;k)for(int i1;i<n;i)for(int j1;j<n;j)s[i][j]min(s[i][j],s[i][k…

Vue前端 更具router.js 中的meta的roles實現路由衛士,實現權限判斷。

參考了之篇文章 1、我在登陸時獲取到登錄用戶的角色名roles&#xff0c;并存入sessionStorage中&#xff0c;具體是在login頁面實現&#xff0c;還是在menu頁面實現都可以。在menu頁面實現&#xff0c;可以顯得登陸快一些。 2、編寫router.js&#xff0c;注意&#xff0c;一個…