寫了一個回收利用某站視頻緩存的程序

video-concreter guide

緣起

在很多很多年前... 這個平臺的客戶端曾經提供“轉碼至mp4”功能,甚至運算速度還很快。

但是隨著歷史的磨洗,很多東西,包括這個小小的轉碼按鈕,都已經化作了塵埃。

image.png

緩存下來的視頻,又是一個亟待拯救的時代。

細看緩存,flv流的被分成了數段,而mp4流則將視頻流和音頻流分成了兩個部分。如此使得直接使用顯得尤爲麻煩。

image.png

image.png

我們的目標就是使用一個自動化的脚本去批量將flv流的數段進行合并,將mp4流的視頻和音頻軌進行合并。

使用方法

install ffmpeg

參照ffmpeg download以及How to Install FFmpeg on Windows

事實上,下載到的ffmpeg工具就是已經編譯過,可以直接使用的。但是需要確保能在任何目錄下都能直接訪問ffmpeg工具,則需要將其添加至Path目錄

在Windows下,右鍵點擊我的電腦,進入設置,找到高級系統設置>高級>環境變量,在Path變量中新建一欄,添加ffmpeg/bin的路徑,如:“C:\apps\ffmpeg\bin”,確認后退出。

image.png

在隨意的目錄中進入命令行,輸入ffmpeg命令,確認其正常即可。

me@host:~$ ffmpeg --version ffmpeg version git-2020-01-29-de1b2aa Copyright (c) 2000-2020 the FFmpeg developers

prepare for videos

手機的 Android/data/tv.danmaku.bili/download目錄中可以找到視頻文件緩存。將其複製到隨意創建的目錄中,即可。

比如這裏叫做Videos目錄,像這樣:

Videos ├───2045104 ├───19923713 └───99999999

image.png

展示文件樹,可以使用tree命令。

download code and install requirements

需要確保您的 Python version >= 3.6!

在各個視頻文件夾所處的目錄中,直接地下載代碼。進入代碼文件夾並安裝依賴:

me@host:~/Videos$ git clone https://github.com/kumolab/video-concrete.git me@host:~/Videos$ cd video-concrete me@host:~/Videos/video-concrete$ pip install -r requirements.txt

image.png

run it

直接運行即可。

可以擕帶的參數有:

  • -n:一次處理的視頻數量,以av編號爲準。默認為5。

舉例:

me@host:~/Videos/video-concrete$ python edit.py me@host:~/Videos/video-concrete$ python edit.py -n 3

image.png

開發指南

感謝您的興趣!您可以fork本repo,提交您的代碼,然後創建一個Pull Request 來讓我們將您的代碼合并進去。

程序結構

主class中包括以下函數:

  • get_file_tree():提取整個目錄中的文件樹,并且分辨哪些目錄是符合av號命名標准的。同時也需要提取每個視頻下的part數。會以是否有edit_av號文件夾判斷是否已經處理過。
  • apply_handle_num():設置處理的集數,集數由命令行參數中提取。
  • generate...():拼接源路徑、視頻文件夾名等而形成可用路徑。
  • read_video_info():讀取每個video的part數、流模式、flv分段數、文件結構等信息。
  • check_exp_path():檢查輸出文件夾,無則需要創建。
  • handle_m4():對mp4流的audio-video對進行合并。要點在write_videofile(寫,同時指定音頻軌)函數。
  • handle_flv():對於flv流的數段,分別轉碼至mp4,然後讀取,合并。要點在ffmpy.FFmpeg(轉碼)和concatenate_videoclips(合并)函數。
  • move_conf_files():重命名與移動index.json、danmaku.xml文件
  • deal_all():最終的執行。會直接或間接調用上述函數。

變量解釋

  • handle_num:一次處理的視頻數量
  • video_index:目前處理的video在隊列裏面的排序
  • epi_index:分part目前的號碼
  • episode_offset:分part對於0的起始編號偏移,例如有的視頻為30、31、32這樣編號,但是實際上30是爲第一part,偏移即爲30
  • episode_count:總共的分part數量

故事和展望

事實上,一般認爲這樣做的意義並不大。由網頁深入研究從而獲取視頻流和彈幕,或者直接在下載站和up主其他有分享的地方獲取視頻都是更加好的方式。

似乎還是來源於早期一臺手機的數據備份,由此想來而製作這個脚本程式。

還有著很多的問題,比如説:

  • 配給需要執行的任務量,這裏直接用了視頻數量,事實上因爲視頻本身長度和體量、再加上分part數量,實際每個視頻會執行分鐘至數小時不等。需要更好的預測及分配給每次啓動的量。
  • !當part不是連續編號時,程式固執會認爲是連續編號。
  • 沒有保存index.json。
  • 如何在中斷后續傳。
  • 如何做成網絡服務。
  • 如何以獲取的數據再次營造社區。

以上。更新與2020/08/25。

About Author:

https://www.kumo-yzx.com/

https://www.matataki.io/user/54

评论

此博客中的热门博文

又一个建站碎碎念

【これ】我收集的Hackathon時間表