搜尋
首頁後端開發Python教學透過ffmpeg子進程進行視訊資料IO

當我重新開始找工作時(是的,我仍然#OpenToWork,請告訴我!),在一份工作申請中,我被要求實現一個處理視訊資料的原型。在完成該專案的過程中,由於我在該領域相對缺乏經驗,我意外地從生成式 AI 聊天機器人那裡得到了很多幫助。

Video data IO through ffmpeg subprocess

如標題所述,使用ffmpeg進行一些預處理工作。該專案的目標之一是能夠依序播放多個影片檔案。雖然有多種方法可以實現這一目標,但我決定採用最明顯的解決方案,將它們連接在一起。

為了實現這一目標,我首先必須將文件重新編碼為允許的格式。在與 Google Gemini 對此進行「討論」後,聊天機器人建議我使用 MPEG-TS。

MPEG 傳輸流 (MPEG-TS) 透過封裝分組基本流來運作。這些串流包括音訊、視訊和 PSIP 數據,它們被打包成小段。每個流被切成 188 位元組的部分並交織在一起。此過程可確保更短的延遲和更高的容錯能力,使其成為大幀可能導致音訊延遲的視訊會議的理想選擇。

引用自 https://castr.com/blog/mpeg-transport-stream-mp​​eg-ts/

還有其他文件格式可用於此目的,但它們與討論無關。當我將視訊重新編碼為這種格式後,視訊資料將被傳送到佇列,供其他進程中運行的其他模組使用。

定義了輸入(要在線獲取的視訊檔案清單)和輸出(重新編碼的視訊檔案內容)後,是時候弄清楚如何做到這一點了。不幸的是,ffmpeg 是一個非常複雜的實用程序,可以做很多事情。有多次嘗試提供一些介面來幫助用戶使用它(我真的很想嘗試這個,但顯然它現在已經死了)。然而,如今生成式人工智慧的幫助非常大,只需幾個提示即可獲得正確的命令。

它甚至解釋了每個參數的含義,如下面的螢幕截圖所示。

Video data IO through ffmpeg subprocess
Gemini 嘗試解釋 ffmpeg 指令

簡而言之,該命令透過 stdin 接受視訊檔案內容,並將重新編碼的視訊檔案內容輸出為 stdout。

現在是時候編寫實作程式碼了,因為我想同時讀取和寫入 ffmpeg,所以這將是一個非同步應用程式。我們這次使用的http客戶端函式庫是httpx,它有一個小批量取得下載的方法:

我們稍後擔心實際處理,現在我們只需取得將區塊列印到螢幕上的程式碼。

接下來我們寫一個函式來呼叫ffmpeg,透過asyncio.create_subprocess_exec

理想情況下,我們會按照文件中的建議在此處使用process.communicate(file_content) ,不幸的是,如果我們這樣做,我們將不得不首先下載整個文件,這不可避免地會延遲回應,這並不理想。

我們可以使用 process.stdin.write(),讓我們更新原來的 write_input 函數:

每下載一個區塊,

  1. 我們透過 process.stdin.write(chunk) 提供給進程。
  2. 完成後,我們將寫一個 EOF (process.stdin.write_eof()) 來表示檔案輸入的結束,
  3. 後面接著 .close() (和對應的await .wait_angled())

回到video_send函數,我們透過讀取process.stdout來繼續函數。能夠同時進行讀取和寫入正是我們透過 asyncio 執行此操作的原因。以前在同步設定中,我們只能按照固定的順序一個接一個地執行,但現在我們可以讓調度程序來關心順序。現在該函數添加了以下程式碼,用於讀取重新編碼的檔案內容,並將其發佈到佇列中:

在一個循環中,我們

  1. 從 ffmpeg stdout 取得一大塊資料
  2. 如果 chunk 是空字串,則退出循環
  3. 否則,將區塊推送到佇列(透過 asyncio.to_thread,因為我們在這裡使用進程安全版本)
  4. 然後我們透過process.wait()等待指令優雅退出

現在看起來很簡單,但我花了整整一個晚上才真正正確地完成了這件事(而且我在寫這篇文章時仍在修改程式碼)。有一半的時間我會檢查文件以確保沒有遺漏任何內容,其他時間我會讓 Gemini 審查我的程式碼。

希望您覺得本文有用,今天就到此為止,希望我們下週能回到先前承諾的「程式碼降臨」內容。

以上是透過ffmpeg子進程進行視訊資料IO的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python是否列表動態陣列或引擎蓋下的鏈接列表?Python是否列表動態陣列或引擎蓋下的鏈接列表?May 07, 2025 am 12:16 AM

pythonlistsareimplementedasdynamicarrays,notlinkedlists.1)他們areStoredIncoNtiguulMemoryBlocks,mayrequireRealLealLocationWhenAppendingItems,EmpactingPerformance.2)LinkesedlistSwoldOfferefeRefeRefeRefeRefficeInsertions/DeletionsButslowerIndexeDexedAccess,Lestpypytypypytypypytypy

如何從python列表中刪除元素?如何從python列表中刪除元素?May 07, 2025 am 12:15 AM

pythonoffersFourmainMethodStoreMoveElement Fromalist:1)刪除(值)emovesthefirstoccurrenceofavalue,2)pop(index)emovesanderturnsanelementataSpecifiedIndex,3)delstatementremoveselemsbybybyselementbybyindexorslicebybyindexorslice,and 4)

試圖運行腳本時,應該檢查是否會遇到'權限拒絕”錯誤?試圖運行腳本時,應該檢查是否會遇到'權限拒絕”錯誤?May 07, 2025 am 12:12 AM

toresolvea“ dermissionded”錯誤Whenrunningascript,跟隨台詞:1)CheckAndAdjustTheScript'Spermissions ofchmod xmyscript.shtomakeitexecutable.2)nesureThEseRethEserethescriptistriptocriptibationalocatiforecationAdirectorywherewhereyOuhaveWritePerMissionsyOuhaveWritePermissionsyYouHaveWritePermissions,susteSyAsyOURHomeRecretectory。

與Python的圖像處理中如何使用陣列?與Python的圖像處理中如何使用陣列?May 07, 2025 am 12:04 AM

ArraysarecrucialinPythonimageprocessingastheyenableefficientmanipulationandanalysisofimagedata.1)ImagesareconvertedtoNumPyarrays,withgrayscaleimagesas2Darraysandcolorimagesas3Darrays.2)Arraysallowforvectorizedoperations,enablingfastadjustmentslikebri

對於哪些類型的操作,陣列比列表要快得多?對於哪些類型的操作,陣列比列表要快得多?May 07, 2025 am 12:01 AM

ArraySaresificatificallyfasterthanlistsForoperationsBenefiting fromDirectMemoryAcccccccCesandFixed-Sizestructures.1)conscessingElements:arraysprovideconstant-timeaccessduetocontoconcotigunmorystorage.2)iteration:araysleveragececacelocality.3)

說明列表和數組之間元素操作的性能差異。說明列表和數組之間元素操作的性能差異。May 06, 2025 am 12:15 AM

ArraySareBetterForlement-WiseOperationsDuetofasterAccessCessCessCessCessCessCessCessAndOptimizedImplementations.1)ArrayshaveContiguucuulmemoryfordirectAccesscess.2)列出sareflexible butslible butslowerduetynemicizing.3)

如何有效地對整個Numpy陣列進行數學操作?如何有效地對整個Numpy陣列進行數學操作?May 06, 2025 am 12:15 AM

在NumPy中进行整个数组的数学运算可以通过向量化操作高效实现。1)使用简单运算符如加法(arr 2)可对数组进行运算。2)NumPy使用C语言底层库,提升了运算速度。3)可以进行乘法、除法、指数等复杂运算。4)需注意广播操作,确保数组形状兼容。5)使用NumPy函数如np.sum()能显著提高性能。

您如何將元素插入python數組中?您如何將元素插入python數組中?May 06, 2025 am 12:14 AM

在Python中,向列表插入元素有兩種主要方法:1)使用insert(index,value)方法,可以在指定索引處插入元素,但在大列表開頭插入效率低;2)使用append(value)方法,在列表末尾添加元素,效率高。對於大列表,建議使用append()或考慮使用deque或NumPy數組來優化性能。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)