成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

神器 ffmpeg :操作視頻,極度舒適

開發(fā) 后端
本以為是個一次性的工作,結果賽事視頻數據巨大,視頻文件長短不一,完全沒法手工處理,于是 Python 又一次拯救了我。

[[438178]]

 最近有了一個新任務,需要將賽事視頻,拆分成兩分鐘以內的小段,用于發(fā)布到短視頻平臺上。

本以為是個一次性的工作,結果賽事視頻數據巨大,視頻文件長短不一,完全沒法手工處理,于是 Python 又一次拯救了我。

還等什么,開始干吧!

最重要的事

無論做什么事情,都要去分析一下最重要的是什么,然后集中精力攻克,再繼續(xù)找最重要的事。

對我們這個任務來說,不算是個大項目,不過呢,還是要找最重要的事開始,步步為營,最終將整個問題解決了。

整體來來看,我們需要從一個目錄中讀取視頻文件,然后,對每個視頻文件進行裁剪,最后將處理好的文件保存好。

在這個過程中,最重要的是什么呢?我覺得,是視頻裁剪,如果不能方便的裁剪視頻,其他的一切工作都是白費的,是吧。

裁剪視頻

現在短視頻很流行,有很多視頻編輯軟件,功能豐富,而我們需要的只是裁剪功能,而且需要用編程的方式調用,那么最合適的莫過于 ffmpeg[1] 了。

ffmpeg 是一個命令行工具,功能強大,可以編程調用。

從 ffmpeg 官網上下載對應操作系統(tǒng)的版本,我下的是 Windows 版[2]。

下載后解壓到一個目錄,然后將目錄下的 bin,配置到環(huán)境變量里。然后打開一個命令行,輸入: 

  1. > ffmpeg -version  
  2. ffmpeg version 2021-10-07-git-b6aeee2d8b-full_build- ... 

測試一下,能顯示出版本信息,說明配置好了。

現在讀一下文檔,發(fā)現拆分視頻文件的命令是: 

  1. ffmpeg -i [filename] -ss [starttime] -t [length] -c copy [newfilename] 
  •  i 為需要裁剪的文件
  •  ss 為裁剪開始時間
  •  t 為裁剪結束時間或者長度
  •  c 為裁剪好的文件存放

好了,用 Python 寫一個調用: 

  1. import subprocess as sp  
  2. def cut_video(filename, outfile, start, length=90):  
  3.     cmd = "ffmpeg -i %s -ss %d -t %d -c copy %s" % (filename, start, length, outfile)  
  4.     p = sp.Popen(cmd, shell=True 
  5.     p.wait()  
  6.     return 
  •  定義了一個函數,通過參數傳入 ffmpeg 需要的信息
  •  將裁剪命令寫成一個字符串模板,將參數替換到其中
  •  用 subprocess 的 Popen 執(zhí)行命令,其中參數 shell=True 表示將命令作為一個整體執(zhí)行
  •  p.wait() 很重要,因為裁剪需要一會兒,而且是另起進程執(zhí)行的,所以需要等執(zhí)行完成再做后續(xù)工作,否則可能找不到裁剪好的文件

這樣視頻裁剪工作就完成了,然后再看看什么是最重要的。

計算分段

視頻裁剪時,需要一些參數,特別是開始時間,如何確定呢?如果這件事做不好,裁剪工作就很麻煩。

所以看看如何計算裁剪分段。

我需要將視頻裁剪成一分半的小段,那么將需要知道目標視頻文件的時間長度。

獲取視頻長度

如何獲得長度呢?ffmpeg 提供了另一個命令 —— ffprobe。

找了一下,可以合成一個命令來獲取: 

  1. > ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=11:nokey=1 -i a.flv  
  2. 920.667 

命令比較復雜哈,可以先不用管其他參數,只要將要分析的視頻文件傳入就好了。命令的結果是顯示一行視頻文件的長度。

于是可以編寫一個函數: 

  1. import subprocess as sp  
  2. def get_video_duration(filename):  
  3.     cmd = "ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i %s" % filename  
  4.     p = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE)  
  5.     p.wait()  
  6.     strout, strerr = p.communicate() # 去掉最后的回車  
  7.     ret = strout.decode("utf-8").split("\n")[0]  
  8.     return ret 
  •  函數只有一個參數,就是視頻文件路徑
  • 合成命令語句,將視頻文件路徑替換進去
  •  用 subprocess 來執(zhí)行,注意這里需要設置一下命令執(zhí)行后的輸出
  •  用 wait 等待命令執(zhí)行完成
  •  通過 communicate 提取輸出結果
  •  從結果中提取視頻文件的長度,返回

分段

得到了視頻長度,確定好每個分段的長度,就可以計算出需要多少分段了。

代碼很簡單: 

  1. import math  
  2. duration = math.floor(float(get_video_duration(filename)))  
  3. part = math.ceil(duration / length) 

注意,計算分段時,需要進行向上取整,即用 ceil,以包含最后的一點尾巴。

得到了需要的分段數,用一個循環(huán)就可以計算出每一段的起始時間了。

獲取文件

因為處理的文件很多,所以需要自動獲取需要處理的文件。

方法很簡單,也很常用,一般可以用 os.walk 遞歸獲取文件,還可以自己寫,具體根據實際情況。 

  1. for fname in os.listdir(dir):  
  2.     fname = os.path.join(dir, os.path.join(dir, fname))  
  3.     basenames = os.path.basename(fname).split('.')  
  4.     mainname = basenames[0].split("_")[0]  
  5.     ... 

提供視頻文件所在的目錄,通過 os.listdir 獲取目錄中的文件,然后,合成文件的絕對路徑,因為調用裁剪命令時需要絕對路徑比較方便。

獲取文件名,是為了在后續(xù)對裁剪好的文件進行命名。

代碼集成

現在每個部分都寫好了,可以將代碼集成起來了: 

  1. def main(dir):  
  2.     outdir = os.path.join(dir, "output")  
  3.     if not os.path.exists(outdir):  
  4.         os.mkdir(outdir)  
  5.     for fname in os.listdir(dir):  
  6.         fname = os.path.join(dir, os.path.join(dir, fname))  
  7.         if os.path.isfile(fname):  
  8.             split_video(fname, outdir) 
  •  main 方法是集成后的方法
  •  先創(chuàng)建一個裁剪好的存儲目錄,放在視頻文件目錄中的 output 目錄里
  •  通過 listdir 獲取到文件后,對每個文件進行處理,其中判斷了一下是否為文件
  •  調用 split_video 方法開始對一個視頻文件進行裁剪

總結

總體而言,這是個很簡單的應用,核心功能就是調用了一個 ffmpeg 命令。

相對于技術,更重要的是如何對一個項目進行分析和分解,以及從什么地方開始。

這里的方式起始時,不斷地找最重要地事情,以最重要的事情為線索不斷地推進,最終以自下而上地方式解決整個問題。

期望這篇文章對你有所啟發(fā),比心。 

 

責任編輯:龐桂玉 來源: Python編程
相關推薦

2022-11-30 07:23:39

2024-02-27 13:03:38

前端視頻合成FFmpeg

2012-11-07 10:27:20

2017-04-05 16:30:09

Node.jsFFmpeg Canvas

2022-06-23 09:17:07

PythonGUIPyAutoGUI

2022-08-29 10:39:32

FFmpeg多媒體框架開源

2023-09-26 17:14:15

2020-06-09 08:05:11

Android 代碼操作系統(tǒng)

2021-03-15 06:49:03

Ffmpeg項目轉換庫

2009-11-11 08:54:27

Windows 7系統(tǒng)漏洞補丁下載

2013-07-25 14:00:18

AndroidGenymotion模擬器

2025-05-21 08:23:52

IO開發(fā)Java

2020-05-14 13:35:59

開源視頻 技術

2023-11-28 10:17:37

2018-08-15 15:23:48

視頻

2020-12-28 13:55:11

云邊緣5G視頻云

2022-03-15 16:53:12

FFmpeg視頻解碼Android

2023-08-12 11:40:11

命令行生存

2022-08-12 08:38:52

FFmpegLinux命令

2025-02-04 10:23:56

C#視頻版權
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 有码在线 | 成人伊人 | 九九热九九 | 伦理片97 | 天天躁日日躁狠狠躁白人 | 一级毛片免费完整视频 | 国产欧美一区二区三区在线看蜜臀 | 欧美一区在线看 | 在线看亚洲 | 韩国主播午夜大尺度福利 | 99re在线视频观看 | 青青草中文字幕 | 久草综合在线视频 | 久久久久久久久一区 | 精品国产一区二区三区四区在线 | 午夜影院在线观看免费 | 日本免费一区二区三区 | 91精品国产综合久久久久久漫画 | 中文字幕av一区二区三区 | 91精品久久久久久久 | 婷婷国产一区二区三区 | 91在线免费观看 | 国产精品视频一区二区三 | 欧美在线网站 | 国产精品视频yy9299一区 | 特级一级黄色片 | 日韩在线小视频 | 超碰综合 | 精品久久99 | 精品一区视频 | 久久久久九九九女人毛片 | 国产亚洲欧美在线 | 日韩快播电影网 | 一区二区免费在线 | 国产精品一区二区三区久久 | 不卡一二三区 | 亚洲精品一区二区 | 日韩在线免费电影 | 久久精品欧美一区二区三区不卡 | 日韩精品一区二区三区在线 | 欧美一级免费观看 |