

目的：pythonで複数のmp4動画を結合したい。映像も音声もそのままです。

元の動画は、実行ファイルと同じ階層にあるmovies_inフォルダの中にあります。  
comb_movie()で、元の音声付き動画を結合し、いったん音声なしで出力しています。  
set_audio()で、元の動画から抽出した音声を結合し先ほど出力した動画に付加しています。

コード全文：

[code]

    import cv2
    import glob
    import moviepy.editor as mp
    from pydub import AudioSegment
    
    # ファイル名
    input_folder = "movies_in"#読み込む動画があるフォルダ
    sound_out = "sound_out.mp3"#音声のみの出力
    movie_out = "movie_out.mp4"#映像と音声の出力
    
    #元の動画を結合し音声なしで出力
    def comb_movie(movies_in, image_out):
    
        # 形式はmp4
        fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
    
        # 動画情報の取得
        movie = cv2.VideoCapture(movies_in[0])
        fps = movie.get(cv2.CAP_PROP_FPS)
        height = movie.get(cv2.CAP_PROP_FRAME_HEIGHT)
        width = movie.get(cv2.CAP_PROP_FRAME_WIDTH)
    
    
        # 出力先のファイルを開く
        out = cv2.VideoWriter(image_out, int(fourcc), fps, (int(width), int(height)))
    
        for movie_in in movies_in:
            # 動画ファイルの読み込み，引数はビデオファイルのパス
            movie = cv2.VideoCapture(movie_in)
    
            # 正常に動画ファイルを読み込めたか確認
            if movie.isOpened() == True: 
                # read():1コマ分のキャプチャ画像データを読み込む
                ret, frame = movie.read()
            else:
                ret = False
                print(movie_in + "：読み込めませんでした")
    
            while ret:
                # 読み込んだフレームを書き込み
                out.write(frame)
                # 次のフレーム読み込み
                ret, frame = movie.read()
    
    
    #元の動画の音声を結合し映像のみの動画に付加
    def set_audio(movies_in, movie_out, sound_out):
    
        clip = mp.VideoFileClip(movie_out).subclip()
    
        sound = None
    
        #元のファイルから音声を一つずつ抽出して結合
        for movie_in in movies_in:
            sound += AudioSegment.from_file(movie_in)
    
        #結合した音声を出力
        sound.export(sound_out, format="mp3")
    
        #結合した音声を動画に付加
        clip.write_videofile(movie_out, audio = sound_out)
    
    
    #フォルダ内のmp4ファイルを名前順でソート
    movies_in = sorted(glob.glob(input_folder + "\*.mp4"))
    
    comb_movie(movies_in, movie_out)
    
    set_audio(movies_in, movie_out, sound_out)
    
    print("終了")
    
    
[/code]

エラーが出る行は`set_audio()`内の`sound += AudioSegment.from_file(movie_in)`です。  
変数soundに元のファイルから取り出した音声を一つずつ継ぎ足しています。

以下のようなエラーが出ます。

[code]

    Traceback (most recent call last):
      File "C:\Users\(ユーザー名)\OneDrive\デスクトップ\動画テスト\動画テスト.py", line 69, in <module>
        set_audio(movies_in, movie_out, sound_out)
      File "C:\Users\(ユーザー名)\OneDrive\デスクトップ\動画テスト\動画テスト.py", line 55, in set_audio
        sound += AudioSegment.from_file(movie_in)
      File "C:\Users\(ユーザー名)\AppData\Local\Programs\Python\Python39\lib\site-packages\pydub\audio_segment.py", line 728, in from_file
        info = mediainfo_json(orig_file, read_ahead_limit=read_ahead_limit)
      File "C:\Users\(ユーザー名)\AppData\Local\Programs\Python\Python39\lib\site-packages\pydub\utils.py", line 274, in mediainfo_json
        res = Popen(command, stdin=stdin_parameter, stdout=PIPE, stderr=PIPE)
      File "C:\Users\(ユーザー名)\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 951, in __init__
        self._execute_child(args, executable, preexec_fn, close_fds,
      File "C:\Users\(ユーザー名)\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 1420, in _execute_child
        hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
    FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。
    
[/code]

実際には元の動画はmovies_inフォルダ内にあります。  
ファイルの指定方法が悪いのでしょうか。  
直し方についてご教示願います。

コードを書くにあたり、以下のページなどを参考にしました。

動画の結合：  
<https://qiita.com/okamoto441/items/3ada3cad3b6210ca8150>

動画に音声を付加：  
<https://kp-ft.com/684>

音声同士の結合：  
<https://algorithm.joho.info/programming/python/pydub-connection/>


CC BY-SA 4.0
2022-06-18T04:40:35.327
89456
2022-06-18T23:05:18.840
2022-06-18T05:10:49.143
51403
51403
question
python python3 opencv 動画
pythonで動画の結合


jackson様の回答でひとまず解決したため、やり方を載せておきます  
まだ、動画が長時間になると音ズレの問題があるようです。

変更点  
・ffmpegをインストールしてパスを通す  
・映像のみの動画をいったん出力し、音声付きの動画は更に別ファイルとして出力する

コード全文：

[code]

    import cv2
    import glob
    import moviepy.editor as mp
    from pydub import AudioSegment
    import numpy
    
    # ファイル名
    input_folder = "movies_in"#読み込む動画があるフォルダ
    image_out = "image_out.mp4"#映像のみの出力
    sound_out = "sound_out.mp3"#音声のみの出力
    movie_out = "movie_out.mp4"#映像と音声の出力
    
    #元の動画を結合し音声なしで出力
    def comb_movie(movies_in, image_out):
    
        # 形式はmp4
        fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
    
        # 動画情報の取得
        movie = cv2.VideoCapture(movies_in[0])
        fps = movie.get(cv2.CAP_PROP_FPS)
        height = movie.get(cv2.CAP_PROP_FRAME_HEIGHT)
        width = movie.get(cv2.CAP_PROP_FRAME_WIDTH)
    
    
        # 出力先のファイルを開く
        out = cv2.VideoWriter(image_out, int(fourcc), fps, (int(width), int(height)))
    
        for movie_in in movies_in:
            # 動画ファイルの読み込み，引数はビデオファイルのパス
            movie = cv2.VideoCapture(movie_in)
    
            # 正常に動画ファイルを読み込めたか確認
            if movie.isOpened() == True: 
                # read():1コマ分のキャプチャ画像データを読み込む
                ret, frame = movie.read()
            else:
                ret = False
                print(movie_in + "：読み込めませんでした")
                
            while ret:
                # 読み込んだフレームを書き込み
                out.write(frame)
                # 次のフレーム読み込み
                ret, frame = movie.read()
    
            print(movie_in)
    
    #元の動画の音声を結合し映像のみの動画に付加
    def set_audio(movies_in, movie_out, image_out, sound_out):
    
        sound = None
    
        #元のファイルから音声を一つずつ抽出して結合
        for movie_in in movies_in:
            if sound == None:
                sound = AudioSegment.from_file(movie_in,"mp4")
            else:
                sound += AudioSegment.from_file(movie_in,"mp4")
                
        #結合した音声を出力
        sound.export(sound_out, format="mp3")
        
        clip = mp.VideoFileClip(image_out).subclip()
        
        #結合した音声を動画に付加
        clip.write_videofile(movie_out, audio = sound_out)
    
    
    #フォルダ内のmp4ファイルを名前順でソート
    movies_in = sorted(glob.glob(input_folder + "\*.mp4"))
    
    comb_movie(movies_in, image_out)
    
    set_audio(movies_in, movie_out, image_out, sound_out)
    
    print("終了")
    
[/code]

ffmpegのインストールとパスの通し方はこちらを参考にしました。  
[PythonでアニメーションGIFと動画を簡単に作成する方法](https://self-
development.info/python%e3%81%a7%e3%82%a2%e3%83%8b%e3%83%a1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3gif%e3%81%a8%e5%8b%95%e7%94%bb%e3%82%92%e7%b0%a1%e5%8d%98%e3%81%ab%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/)

[Windows
10にFFmpegをインストールし、WindowsパスにFFmpegを追加する方法](https://soundartifacts.com/ja/how-
to/186-how-to-install-ffmpeg-on-windows-10-amp-add-ffmpeg-to-windows-
path.html)


CC BY-SA 4.0
2022-06-18T15:45:43.857
89465
2022-06-18T23:05:18.840
2022-06-18T23:05:18.840
26370
51403
89456
answer