Linux: ビデオからフレームを抽出する方法 (ロスレス)

Linux: ビデオからフレームを抽出する方法 (ロスレス)

、、などVLCのプログラムの使用に関する回答や記事をいくつか読みましたが、私が見た方法はどれも「ロスレス」ではありません。すべてのフレームをキャプチャするわけではありません。ビデオから各フレームを画像として抽出したいのですが (100% の品質、詳細を失いたくない)、理論的にはそれらの画像を取得して、元のファイルとの違いを区別することなくビデオ ファイルを再作成できます (もちろん、音声がないことは除きます)。MPlayerffmpeg

フレームを取得する開始時間と終了時間を指定できればボーナスポイントになります。そうすれば、事前にビデオ ファイルをトリミングする必要がなくなります。

答え1

フレームはロスレス画像圧縮形式である PNG として抽出できます。たとえば、5 分目から 10 分目までのフレームを抽出するには、次のようにします。

ffmpeg -ss 05:00 -i <input> -t 05:00 filename%05d.png

答え2

ムービー ファイルからすべてのフレームを抽出できるツールがいくつかあります。

avconv
avconv -i file.avi -f image2 Out%00d.jpg

ffmpeg
ffmpeg -i input.file thumb%04d.png -hide_banner

また、PNG や JPG よりも処理時間がはるかに短い BMP をエクスポートすることもできます。

というbashスクリプトもありますmov2frame.shFFMPEG 抽出プロセスを自動化しようとします。

MPlayer プレイヤー
mplayer -ao null -vo png input.file

または別のオプション:

mplayer -nosound -vo png:z=9 my_file.mp4

VLC このメディア プレーヤーは、フィルターを使用して画像セットをエクスポートできるようですが、それが唯一の用途である場合、またはポータブル バージョンを持っている場合を除き、面倒なようです。

  1. フレームを保存するフォルダーを作成し、そのパスをコピーします。Mac OSX/Linux ユーザーの場合、これはフルパス (~ なし) である必要があります。

  2. VLC で [ツール] / [設定] をクリックします。

  3. 「設定を表示」の下の「すべて」をクリックします。

  4. 「ビデオ」の下で、「フィルター」を選択します。「シーンビデオフィルター」にチェックを入れます。

  5. 「フィルター」を展開し、「シーンフィルター」を選択します。

  6. 先ほどのパスを「ディレクトリ パス プレフィックス」に貼り付けます。

  7. 「記録比率」ボックスでエンコードするフレームの割合を選択します。1/12の場合は12フレームごとに出力され、1/1の場合はすべてのフレームがエクスポートされます。

  8. 「保存」をクリックします。

  9. 「メディア / ビデオを開く」をクリックしてビデオを見つけます。最後までじっくりと再生してください。

  10. ツール/設定をクリックします。「設定を表示」の下で「すべて」をクリックします。「ビデオ」の下で「フィルター」を選択します。「シーンビデオフィルター」のチェックを外します。「保存」をクリックします。これは、次回ビデオを再生するときに VLC がサムネイルを生成しないようにするためです。リンク

また、プログラムを初めて実行するときに管理者権限に関して潜在的な問題が発生する可能性もあります。

sudo vlc [sudo] password for mint16: VLC is not supposed to be run as root. Sorry. If you need to use real-time priorities and/or privileged TCP ports you can use vlc-wrapper (make sure it is Set-UID root and cannot be run by non-trusted users first).

VLCはPNGではなくBMPに抽出するとパフォーマンスがはるかに向上します

答え3

ffmpeg でこれを行う場合、多くの場合、オプションを使用する必要があることがわかりました-vsync 0(たとえば、DVD の VOB ファイルを操作する場合)。

ffmpeg -i video.VOB -vsync 0 %06d.bmp

開始時間と終了時間も設定したい場合は、次のようになります。

ffmpeg -i video.VOB -vsync 0 -ss 01:30 -to 01:40 %06d.bmp

答え4

以下は、ビデオからフレームを抽出するために私が使用した opencv のコードです。

import cv2
import os

# Replace 'your_video_file.mp4' with the path to your video file
video_path = 'your_video_file.mp4'

# Create a VideoCapture object
cap = cv2.VideoCapture(video_path)

# Check if the video file is opened successfully
if not cap.isOpened():
    print("Error: Could not open video file.")
    exit()

# Create a directory to store the frames
output_directory = 'frames'
os.makedirs(output_directory, exist_ok=True)

# Loop to read frames from the video
frame_count = 0
while True:
    # Read a frame from the video
    ret, frame = cap.read()

    # Check if the frame is read successfully
    if not ret:
        print("End of video.")
        break

    # Save the frame as an image file
    frame_filename = os.path.join(output_directory, f'frame_{frame_count:04d}.png')
    cv2.imwrite(frame_filename, frame)

    frame_count += 1

# Release the VideoCapture object
cap.release()

print(f"{frame_count} frames saved in '{output_directory}'.")

関連情報