linux合並bilibili下載的blv視頻


B站下載的學習視頻,用python+sh合並處理,自己mark一下

手機bilibili下載了視頻,想要搞到電腦上看,結果發現下載下來的都是文件夾里的一堆片段,仔細一看還是 .blv,腦那樣啊! 在虛擬機里邊用win的客戶端試着下載了一個視頻,發現是 .flv,看着好像,結果就是。

blv修改成flv就可以了,它就是flv格式的。遇到的主要為問題就是文件名最好不要有空格,linux下空格文件名處理容易出問題。還有os.chdir()是否一定需要絕對路徑沒有研究,剛開始寫的是相對路徑,結果有問題

為了排除問題修改為絕對路徑,但是相對路徑好像也可以,當然絕對路徑可定不會出問題。

#!/usr/bin/env python
# coding=utf-8

import os
import sys
import json
import os.path

def get_video_name(d):
    ''' b站下載的視頻都分割成小片段放在文件夾里,第一層文件夾中有entry.json文件,記錄了視頻名稱 '''
    if os.path.exists('entry.json'):
        with open('entry.json', 'r') as f:
            data = json.load(f)
    return data['page_data']['part']

def merge_flv(d, video_name, output_path):
    try:
        os.chdir(list(os.walk(d))[1][0])
        os.system("bash ~/Desktop/temp/merge.sh %s %s" % (video_name.replace(' ', '_'), output_path))
        os.chdir(os.pardir)
    except Exception as e:
        print("%s Bash腳本執行失敗!\n" % (base_path + '/' + d), e)

def get_all_videos(base_path, output_path):
    dirs = os.listdir(base_path)
    for d in dirs:
        try:
            os.chdir(base_path + '/' + d)
            video_name = get_video_name(d)
            merge_flv(base_path + '/' + d, video_name, output_path)
        except Exception as e:
            print("%s不是文件夾或者無權限進入!\n" % (base_path + '/' + d), e)

if __name__ == "__main__":
    ''' 如果沒有在腳本中指定路徑,可以在腳本參加中指定,參數1:根目錄,參數2:輸入路徑 '''
    base_path = ""
    output_path = ""
    if not base_path: base_path = sys.argv[1]
    if not output_path: output_path = sys.argv[2]
    get_all_videos(base_path, output_path)

合並處理用的是linux下的ffmpeg工具,參考的(照抄這里的:http://www.songyawei.cn/content/4015)

#!/bin/bash

# 設定腳本需要傳入兩個參數,第一個是合並的視頻名,第二個是合並的視頻存放路徑
# 修改后綴blv為flv
rename .blv .flv *.blv &&\

# bash獲取當前目錄下的所有flv文件
for f in *.flv; do echo "file $f" >> mylist.txt; done

# 合並flv文件
ffmpeg -f concat -i mylist.txt -c copy "$1.flv" &&\

# 經合並生成的文件移動到指定的文件夾
mv "$1.flv" $2

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM