- リンクを取得
- ×
- メール
- 他のアプリ
ffmpegを使った音声&映像ミキシング
ffmpegを使って音声ファイル(mp3)と映像ファイル(mp4)をミキシングします。ライブラリの追加
$ sudo apt install ffmpeg
Pythonプログラム
test.pyに以下のコードを記述します。
subprocessを使ってffmpegをpythonから起動させます。
元となる映像データ(input.mp4)は著作権フリーのものから拾ってきてください。
※映像の長さと音声の長さのより短い方に合わせた動画が作成されます。
またHWエンコードの対応があれば、SWエンコーダー(libx264)ではなくHWエンコーダ―(h264_nvenc)を指定してください。
test.pyに以下のコードを記述します。
subprocessを使ってffmpegをpythonから起動させます。
元となる映像データ(input.mp4)は著作権フリーのものから拾ってきてください。
※映像の長さと音声の長さのより短い方に合わせた動画が作成されます。
またHWエンコードの対応があれば、SWエンコーダー(libx264)ではなくHWエンコーダ―(h264_nvenc)を指定してください。
test.pyimport subprocess
from subprocess import PIPE
def makeVideo():
cmd = 'ffmpeg -y -i /tmp/input.mp4 -i /tmp/temp.mp3 '
cmd += ' -movflags +faststart -c:a aac -profile:a aac_low -ac 2 -ar 48000 -c:v libx264'
cmd += ' -vf yadif=0:-1:1 -profile:v high -bf 2 -g 30 -coder 1 -b:v 1M -b:a 384k'
cmd += ' -pix_fmt yuv420p -map 0:v:0 -map 1:a:0 -shortest '
cmd += ' /tmp/output.mp4 '
rtn = subprocess.run(cmd, shell=True, stdout=PIPE, stderr=PIPE, text=True)
return
以前のgetRss()から上記のmakeVideo()を呼び出します。test.py
import subprocess
from subprocess import PIPE
def makeVideo():
cmd = 'ffmpeg -y -i /tmp/input.mp4 -i /tmp/temp.mp3 '
cmd += ' -movflags +faststart -c:a aac -profile:a aac_low -ac 2 -ar 48000 -c:v libx264'
cmd += ' -vf yadif=0:-1:1 -profile:v high -bf 2 -g 30 -coder 1 -b:v 1M -b:a 384k'
cmd += ' -pix_fmt yuv420p -map 0:v:0 -map 1:a:0 -shortest '
cmd += ' /tmp/output.mp4 '
rtn = subprocess.run(cmd, shell=True, stdout=PIPE, stderr=PIPE, text=True)
return
逐一動画にしても良いですが、PodcastやYoutubeにアップロードできる回数が限りがありますので、ある程度まとめた音声にしてから作成します。
test.pydef getRss():
rssUrl = 'https://news.google.com/news/rss/headlines/section/topic/TECHNOLOGY'
rssLang = '?hl=en-US&gl=US&ceid=US:en'
feed = feedparser.parse(rssUrl + rssLang)
for entry in feed.entries:
link = entry.get('link')
getBody(link)
makeVideo()
これで動画を作成できました。次はこの動画をYoutubeにアップロードします。test.py
def getRss():
rssUrl = 'https://news.google.com/news/rss/headlines/section/topic/TECHNOLOGY'
rssLang = '?hl=en-US&gl=US&ceid=US:en'
feed = feedparser.parse(rssUrl + rssLang)
for entry in feed.entries:
link = entry.get('link')
getBody(link)
makeVideo()