[python+you_get+moviepy] ゴースト ビデオを取得し、オーディオを抽出します -- プレーヤーによって音楽への愛情が制限されることはありません

I.はじめに

1.1 需要の源泉

音楽を聴くのが好きな人は多いと思いますが、今では音楽の形式もどんどん豊富になってきており、例えばDouyinのショートビデオやStation Bの心霊ビデオなどには優れた音源が数多く存在しており、これらの作品は大人になっても楽しめる一種の楽しみとなっています。ビデオを見ずに音だけを聞いてください。しかし、これらの音源は、一部のニッチなオーディオはもちろん、主要な音楽プラットフォームでも見つけるのが困難です。
では、ビデオリンクに基づいて音声を取得するにはどうすればよいでしょうか?

1.2 準備

 Python: 3.11.3 (≥3.7)
 入手ライブラリ: 0.4.1650
 moviepy ライブラリ: 1.0.3

1.3 アイデアの分析

you-get は、多数の Web リンクからのビデオ ファイルの抽出をサポートする非常に人気のあるビデオ抽出プロジェクトです。moviepy は、Python オーディオおよびビデオ処理によく使用されるライブラリで、ffmpeg に似ていますが、インストールと使用がより便利で高速です。 MP4ファイルをMP3ファイルとして変換できます。
歌詞を追加したい場合は、後でフォルダー内に同じ名前の lrc ファイルを追加することもできます。

1.4 アルゴリズムプロセスの設計

 1). ビデオ ダウンロード関数を作成し、プロセス プールを使用して同期ダウンロードを実現します
 2). ダウンロード前後のフォルダー内の変更を記録し、flv ファイルを特定して MP4 形式に変換します
 3). ビデオをオーディオに書き込みます機能を利用し、プロセスプールを介して同期変換を実現します。

2. コード分析

2.1 入手したものをインストールする

ファイル内で実行します。

os.system("pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ you-get")

cmd ウィンドウにコマンド ラインを入力することもできます。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ you-get

初めてのインストール:
最初のインストールを取得します

初回以外のインストール:
初回以外のインストールが可能
初回インストール後にこのコードをコメントアウトできます。

2.2 ビデオダウンロードを実装するプロセスプール

リンクに従ってビデオ ファイルをダウンロードし、保存パスを指定します。

def downloadMp4(filePath, url):
    os.system(f"you-get -o {
      
      filePath} {
      
      url}")
    print(f"{
      
      url} 下载完成")

プロセス プールを使用してコンピューター リソースを使用し、複数のビデオのダウンロードを高速化します。

def manyDownload(filePath, mp4Urls):
    p = Pool(4)
    for url in mp4Urls:
        p.apply_async(downloadMp4, args=(filePath, url,))
    p.close()
    p.join()

2.3 flv ファイルを認識して MP4 形式に変換する

フォルダーのファイル リストはビデオの前後に記録する必要があります。そうしないと、以前に保存したビデオ ファイルが抽出される可能性があります。

files_before = os.listdir(filePath)
...
files_after = os.listdir(filePath)

認識関数を定義し、新しい MP4 形式でファイル名のリストを返すように形式を変更します。

def getMp4List(files_before, files_after):
    flvList = []
    mp4List = []
    # 找到刚下载的 flv 文件
    for file in files_after:
        if file not in files_before:
            if file.split('.')[-1] in ['flv', 'mp4']:
                flvList.append(file)
    # 将 flv 后缀改为 mp4
    for file in flvList:
        if file.split('.')[-1] == 'flv':
            new_name = file[:-3] + "mp4"
            os.rename(f"{
      
      filePath}{
      
      file}", f"{
      
      filePath}{
      
      new_name}")
            mp4List.append(new_name)
        elif file.split('.')[-1] == 'mp4':
            mp4List.append(file)
    return mp4List

2.4 プロセスプールにより複数のビデオファイルのオーディオへの同時変換を実現

ビデオからオーディオへの機能:

# 从视频文件中提取音频
def getMp3(filePath, mp4File):
    video = VideoFileClip(f"{
      
      filePath}{
      
      mp4File}")
    audio = video.audio
    mp3File = mp4File[:-1] + "3"
    audio.write_audiofile(f"{
      
      filePath}{
      
      mp3File}")
    print(f"{
      
      mp3File}音频提取完成!")

プロセス プールは同期アクセラレーションを実装します。

# 利用进程池同时从视频中提取音频
def manyTransfer(filePath, mp4List):
    p = Pool(4)
    for mp4File in mp4List:
        p.apply_async(getMp3, args=(filePath, mp4File,))
    p.close()
    p.join()

3. スクリーンショットを実行する

ビデオを同時にダウンロード:
動画を同時にダウンロードする
なお、同期はされていますが、表示に問題があり、2番目のファイルをダウンロードすると、1番目のファイルもダウンロードされてしまいます。
同期的にオーディオに変換:
同時にオーディオに変換する
この時点でフォルダーを表示します:
フォルダーの状態

4. 完全なコード

4.1 ヘビー級

プロセス プールを使用すると、大量のビデオがダウンロードされ変換されるシナリオに適しています。

import os
from moviepy.editor import *
from multiprocessing import Pool


# 根据链接下载视频文件
def downloadMp4(filePath, url):
    os.system(f"you-get -o {
      
      filePath} {
      
      url}")
    print(f"{
      
      url} 下载完成")


# 使用进程池,利用电脑资源加速多个视频的下载
def manyDownload(filePath, mp4Urls):
    p = Pool(4)
    for url in mp4Urls:
        p.apply_async(downloadMp4, args=(filePath, url,))
    p.close()
    p.join()


# 获取新增的 flv 文件,并转化为 MP4 格式
def getMp4List(files_before, files_after):
    flvList = []
    mp4List = []
    # 找到刚下载的 flv 文件
    for file in files_after:
        if file not in files_before:
            if file.split('.')[-1] in ['flv', 'mp4']:
                flvList.append(file)
    # 将 flv 后缀改为 mp4
    for file in flvList:
        if file.split('.')[-1] == 'flv':
            new_name = file[:-3] + "mp4"
            os.rename(f"{
      
      filePath}{
      
      file}", f"{
      
      filePath}{
      
      new_name}")
            mp4List.append(new_name)
        elif file.split('.')[-1] == 'mp4':
            mp4List.append(file)
    return mp4List


# 从视频文件中提取音频
def getMp3(filePath, mp4File):
    video = VideoFileClip(f"{
      
      filePath}{
      
      mp4File}")
    audio = video.audio
    mp3File = mp4File[:-1] + "3"
    audio.write_audiofile(f"{
      
      filePath}{
      
      mp3File}")
    print(f"{
      
      mp3File}音频提取完成!")


# 利用进程池同时从视频中提取音频
def manyTransfer(filePath, mp4List):
    p = Pool(4)
    for mp4File in mp4List:
        p.apply_async(getMp3, args=(filePath, mp4File,))
    p.close()
    p.join()


if __name__ == "__main__":
    filePath = "D:/Music/"  # 注意,最后“/”要有,否则会导致后续路径错误
    files_before = os.listdir(filePath)  # 获取运行前的文件列表,用于跟下载后的做对比
    # 复制鬼畜《念诗之王》、《敢杀我的马》的视频链接,也可以只有一个视频链接
    mp4Urls = ["https://www.bilibili.com/video/BV1bW411n7fY/?spm_id_from=333.337.search-card.all.click",
               "https://www.bilibili.com/video/BV1yt4y1Q7SS/?spm_id_from=333.337.search-card.all.click"]

    # 第一次运行时安装下面的you-get库,非首次运行时可注释掉;也可以通过命令行安装;还可以通过 PyCharm 或 Anaconda 安装
    os.system("pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/  you-get")

    # 利用进程池同时下载多个视频
    manyDownload(filePath, mp4Urls)

    # 对比文件夹变化,获取 flv 文件,并改为 MP4 格式
    files_after = os.listdir(filePath)
    mp4List = getMp4List(files_before, files_after)

    # 利用进程池同时从视频中提取音频
    manyTransfer(filePath, mp4List)

4.2 軽量

プロセス プールなし、単一のビデオのダウンロードと変換に適しています:

import os
from moviepy.editor import *
from multiprocessing import Pool


# 根据链接下载视频文件
def downloadMp4(filePath, url):
    os.system(f"you-get -o {
      
      filePath} {
      
      url}")
    print(f"{
      
      url} 下载完成")


# 获取新增的 flv 文件,并转化为 MP4 格式
def getMp4List(files_before, files_after):
    flvList = []
    mp4List = []
    # 找到刚下载的 flv 文件
    for file in files_after:
        if file not in files_before:
            if file.split('.')[-1] in ['flv', 'mp4']:
                flvList.append(file)
    # 将 flv 后缀改为 mp4
    for file in flvList:
        if file.split('.')[-1] == 'flv':
            new_name = file[:-3] + "mp4"
            os.rename(f"{
      
      filePath}{
      
      file}", f"{
      
      filePath}{
      
      new_name}")
            mp4List.append(new_name)
        elif file.split('.')[-1] == 'mp4':
            mp4List.append(file)
    return mp4List


# 从视频文件中提取音频
def getMp3(filePath, mp4File):
    video = VideoFileClip(f"{
      
      filePath}{
      
      mp4File}")
    audio = video.audio
    mp3File = mp4File[:-1] + "3"
    audio.write_audiofile(f"{
      
      filePath}{
      
      mp3File}")
    print(f"{
      
      mp3File}音频提取完成!")


if __name__ == "__main__":
    filePath = "D:/Music/"  # 注意,最后“/”要有,否则会导致后续路径错误
    files_before = os.listdir(filePath)  # 获取运行前的文件列表,用于跟下载后的做对比
    # 复制鬼畜《念诗之王》、《敢杀我的马》的视频链接,也可以只有一个视频链接
    mp4Urls = ["https://www.bilibili.com/video/BV1bW411n7fY/?spm_id_from=333.337.search-card.all.click",
               "https://www.bilibili.com/video/BV1yt4y1Q7SS/?spm_id_from=333.337.search-card.all.click"]

    # 第一次运行时安装下面的you-get库,非首次运行时可注释掉;也可以通过命令行安装;还可以通过 PyCharm 或 Anaconda 安装
    os.system("pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/  you-get")

    # 利用进程池同时下载多个视频
    for url in mp4Urls:
        downloadMp4(filePath, url)

    # 对比文件夹变化,获取 flv 文件,并改为 MP4 格式
    files_after = os.listdir(filePath)
    mp4List = getMp4List(files_before, files_after)

    # 利用进程池同时从视频中提取音频
    for mp4 in mp4List:
        getMp3(filePath, mp4)

PS: この方法は営利目的には使用せず、法律で認められる範囲内でインターネットリソースを合理的に使用してください。Python のさらに興味深いアプリケーションについては、今後のアップデートにご注目ください~

おすすめ

転載: blog.csdn.net/weixin_44844635/article/details/131345293