본문 바로가기
관리자

Programming-[Backend]/Python

[탐험] ffmpeg-ffprobe로 AWS S3에 있는 Video 파일 메타데이터 추출: 비디오 스트림, AWS Presigned URL 방식 이해 2

728x90
반응형

목차

 

1. 영상 데이터에 대한 개념

2. AWS Presigned URL

3. 파이썬 서브프로세스, os.system 차이

4. ffmpeg, ffprobe, 메타데이터, 멀티미디어 파일 분석의 한계

 

 


참고: 사용 코드(파이썬, ffprobe)

video_object_key = settings.AWS_MEDIA_LOCATION + "/" + copy_upload_path

##AWS에서 영상에 대한 presigned url 가져오기
location = boto3.client("s3").get_bucket_location(
    Bucket=settings.AWS_STORAGE_BUCKET_NAME
)["LocationConstraint"]
url = boto3.client(
    "s3", config=Config(signature_version="s3v4", region_name=location)
).generate_presigned_url(
    "get_object",
    Params={
        "Bucket": settings.AWS_STORAGE_BUCKET_NAME,
        "Key": settings.AWS_MEDIA_LOCATION + "/" + copy_upload_path,
    },
    ExpiresIn=3600,
)
## FFPROBE 적용하여 메타데이터만 가져오기
metadata_stream = subprocess.Popen(
    ["ffprobe", "-show_streams", "-print_format", "json", url],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
)
out, err = metadata_stream.communicate()
metadata_string = out.decode("utf-8")

## creation_date 추출
datetime_original = None
for line in metadata_string.split("\n"):
    line = line.strip()
    if line.startswith('"creation_time"'):
        datetime_original = ":".join(line.split(":")[1:])
    if datetime_original:
        break
print(datetime_original)

 


 

 

3. 파이썬 서브프로세스, os.system과의 차이

 

subprocess

위 코드에 보면 subprocess.Popen, subprocess.PIPE라는 구문이 나온다. 이것들은 무엇일까?

 

subprocess는 이름 그대로 어떤 프로세스를 실행하는 도중, 다른 자식 프로세스를 실행하는 것을 의미한다. 

 

shell에서 아래 구문을 실행해보면 자세한 설명을 볼 수 있다.

>> import subprocess
>> help(subprocess.Popen)

 

인자값으로 stdin, stdout, stderr도 받을 수 있는 것을 볼 수 있다. Popen으로 기존 프로세스에서 자식 프로세스로 표준 입-출력 데이터를 전송하여 프로세스끼리 데이터를 주고 받게 할 수 있다는 것이다. 컴퓨터 공학에서 배운 바로는 이렇게 프로세스끼리 데이터를 주고받다보면 데이터가 꼬이거나 교착 상태(deadlock)가 발생할 수도 있는데, subprocess는 이런 위험성을 최대한 배제할 수 있도록 도와준다고 한다. 자세한 예제나 좀 더 상세한 내용은 아래 링크에 잘 나와있다.

 

ref) 네이버 블로그: 일본에서 일하는 엔지니어, 날아가다

https://blog.naver.com/sagala_soske/222131573917

 

 

 

위 코드에서 작성한 내용은 영상에서 썸네일을 추출하는 프로세스를 진행하는 중간에 subprocess로 ffprobe를 실행해서 영상의 메타정보(creation_time, 촬영일)를 비동기적으로 가져오는 것이다. 다시 말해 기존 프로세스는 쭉 진행하면서, 자식 프로세스를 하나 열어서 메타 정보를 얻어오도록 처리를 맡긴 뒤, 기존 프로세스의 남은 과정을 진행하는 것이다.

 

 

 

 

os.system과의 차이

 

결론부터 말하면 os.system은 사용하지 말라고 한다. subprocess.run, subprocess.Popen이 더 나은 기능을 제공하고, 보안상에도 유리하며 사용하기도 편리하기 때문이다. 각종 근거들에 대해서는 'os.system, subprocess 차이' 라고 검색해보면 더 자세히 알 수 있다.

 

 

여러 이유들 중 ffprobe만 어떻게든 써볼려는 나에게 가장 편했던 점은 명령어를 문자열의 나열로 실행할 수 있다는 점이였다. 아래 스택 오버 플로우 참조 링크의 답변(abarnert의 답변)을 보면 subprocess를 사용하면 따옴표나 줄바꿈 등을 신경 쓸 필요가 없다고 한다. 

ref) 스택 오버 플로우

https://stackoverflow.com/questions/51368481/python-url-breaks-system-command

 

 

좀 더 자세하게는 아래 참조 링크를 보면 상세히 알 수 있다. 아래 코드가 정확하지 않을 수 있으나, 요는 List[str]의 형태로 인자를 받기 때문에 작성하기가 편하다는 것이다.

os.system(" ".join(['/usr/bin/ffmpeg', '-i \"' + files[0] + '\"', files[0][:-4].replace(' ', '_') + '.mp3']))

subprocess.call(['/usr/bin/ffmpeg', '-i', 'files[0]', 'files[0][:-4].replace(' ', '_')', '.mp3'])

 

ref) os.system 구문

https://stackoverflow.com/questions/36201865/executing-ffmpeg-from-python

 

 


 

4. FFMPEG, FFPROBE, 메타데이터, 멀티미디어 파일 분석의 한계

 

FFMPEG

FFMPEG에 대한 자세한 설명은 아래 사이트에서 확인 가능하다.

 

ref) 위키독스-FFMPEG 레퍼런스

https://wikidocs.net/78484

 

비디오, 오디오, 이미지 등의 멀티미디어 파일을 쉽게 인코딩, 디코딩, 먹싱, 디먹싱할 수 있도록 도와주는 프레임워크이다.  대단한 것은 PC 운영체제 뿐아니라 모바일 운영체제에서도 모두 이 FFMPEG을 이용하여 멀티미디어 파일을 처리한다.

 

FFPROBE, 메타데이터, 멀티미디어 파일 분석의 한계

ffprobe는 ffmpeg에서 제공하는 스트림 분석기이다. 0과 1로 이루어진 바이너리 데이터로 저장된 미디어 파일 중 각 프레임에 대한 정보, 촬영일, 촬영 위치 GPS 정보 등 미디어 파일 자체가 아니라 미디어 파일의 주변 정보를 메타데이터라고 한다. 이 메타데이터를 분석하여 유용한 정보들을 산출해주는 툴이 ffprobe이다.

 

아래 참조 사이트를 보면 일반적인 ffprobe 명령어를 볼 수 있다.

https://m.blog.naver.com/jongwon0320/220920837874

 

(분석) https://videocube.tistory.com/entry/MP4-%EB%B6%84%EC%84%9D-%ED%95%98%EA%B8%B0-MPEG4-%ED%8C%8C%ED%8A%B8-14

 

 

멀티미디어 파일 분석의 한계

재미있는 것은 멀티미디어 파일의 일부만 똑 떼서 메타데이터로 저장되어있거나, 그 정보만 받아와서 처리할 수 없다. 예를 들어 해당 파일의 촬영일만 알고 싶더라도 해당 파일 전체를 다 받아와서 ffprobe 등으로 분석해야한다. 즉 나는 10 GB 짜리 영상 파일의 촬영일만 알고 싶어도, 10 GB만큼 영상을 다 다운로드 받고 라이브러리 등을 사용해야만 촬영일 정보를 알 수 있는 것이다.

 

현재까지 .mp4, .mov 등의 영상 파일 확장자들은 메타데이터만 따로 제공하는 기능을 지원하지 않는다. 이런 확장자 및 표준 등은 ISO/IEC 에서 정하고 있다.

 

 

728x90
반응형