YouTubeのライブ配信を途中から録画して、後から見返したい場面があります。既存のツールはいくつかありますが、途中で止めると映像と音声が別ファイルになって再生できないことが多い。それを自動で結合してくれるツールをPythonで作りました。GUI付きで操作も簡単です。
完成したツールの機能
✅ URLを貼り付けて録画開始ボタンを押すだけ
✅ 途中で停止しても自動でffmpegが修復・結合
✅ 映像と音声が別ファイルになっても自動でmerged_output.mp4に結合
✅ 手動結合ボタンで既存ファイルも結合できる
✅ フォルダを開くボタンで保存先に即アクセス
✅ exe化すればPython環境なしで動く
作るまでに詰まったこと
1
途中停止すると映像と音声が別ファイルになる
yt-dlpでライブを録画すると、映像(f137)と音声(f140)が別々の.partファイルとして保存されます。そのままでは片方しか再生できないので、ffmpegで結合する処理が必要でした。
yt-dlpでライブを録画すると、映像(f137)と音声(f140)が別々の.partファイルとして保存されます。そのままでは片方しか再生できないので、ffmpegで結合する処理が必要でした。
2
tkinterのスレッドエラー
録画処理をスレッドで動かしながらGUIのログを更新しようとしたら
録画処理をスレッドで動かしながらGUIのログを更新しようとしたら
RuntimeError: main thread is not in main loop が出た。queueを使ってメインスレッドにログを渡す方式に変えて解決しました。
3
ffmpegの文字コードエラー
Windowsのcp932エンコーディングでffmpegの出力が読めずにUnicodeDecodeErrorが出た。subprocessに
Windowsのcp932エンコーディングでffmpegの出力が読めずにUnicodeDecodeErrorが出た。subprocessに
encoding='utf-8', errors='ignore' を追加して解決しました。
コード抜粋:映像と音声の自動結合部分
停止後にffmpegで映像と音声を結合する部分だけ抜粋します。ファイルサイズで映像・音声を自動判定しています。
# サイズで映像・音声を判定(大きい方が映像)
repaired.sort(key=os.path.getsize, reverse=True)
video = repaired[0]
audio = repaired[1]
output = 'recordings/merged_output.mp4'
cmd = [
ffmpeg_path,
'-i', video,
'-i', audio,
'-c:v', 'copy',
'-c:a', 'aac',
'-y',
output
]
result = subprocess.run(
cmd,
capture_output=True,
encoding='utf-8',
errors='ignore'
)
スレッド×GUIのログ更新にはqueueを使う
スレッドからtkinterを直接操作するとエラーになります。queueにメッセージを入れて、メインスレッドが定期的に取り出す方式が安全です。
import queue
log_queue = queue.Queue()
# スレッド側:queueに入れるだけ
log_queue.put("録画開始\n")
# メインスレッド側:200msごとに取り出してGUIに表示
def poll_queue():
while not log_queue.empty():
msg = log_queue.get()
log_text.insert(tk.END, msg)
log_text.see(tk.END)
root.after(200, poll_queue)
必要なもの
📌 Python 3.8以上
📌 yt-dlp(
pip install yt-dlp)📌 ffmpeg(BtbN/FFmpeg-Buildsのgpl版を推奨)
📌 tkinter(Python標準ライブラリ)
まとめ
yt-dlp + ffmpeg + tkinterを組み合わせることで、YouTubeライブの録画から映像・音声の自動結合までをGUIで操作できるツールが作れます。スレッド×GUIのログ更新にはqueueを使う、ffmpegはgpl版を使う、この2点がポイントです。PyInstallerでexe化すればPython環境なしで動きます。
