Linux: 비디오에서 프레임을 추출하는 방법은 무엇입니까? (무손실)

Linux: 비디오에서 프레임을 추출하는 방법은 무엇입니까? (무손실)

VLC, MPlayer, 등과 같은 프로그램 사용에 대한 몇 가지 답변과 기사를 읽었 ffmpeg지만 내가 본 방법 중 "무손실"은 없습니다. 모든 단일 프레임을 캡처하지는 않습니다. 비디오의 각 프레임을 이미지로 추출하고 싶습니다(품질 100%, 세부 사항을 잃고 싶지 않음). 이론적으로 해당 이미지를 가져와서 차이점을 알 수 없이 비디오 파일을 다시 만들 수 있습니다. 원본(물론 오디오 부족 제외).

프레임을 가져오기 위한 시작 및 종료 시간을 지정할 수 있으므로 미리 비디오 파일을 자를 필요가 없다는 점은 보너스입니다.

답변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 -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}'.")

관련 정보