목차
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)
1. 영상 데이터에 대한 개념
영상 데이터의 구조
https://bradbury.tistory.com/211
영상 데이터는 Video Stream + Audio Stream + Metadata 등의 구성으로 이루어져있다. 각 스트림은 바이너리 코드(0110100...)로 구성된 데이터의 집합이며, Metadata는 영상 촬영 일자등의 정보 뿐아니라 각 스트림을 제어할 수 있는 여러 정보들을 담는다. 이런 모든 데이터를 담는 단위를 컨테이너(Container)라고 한다.
아래 스트림에 대한 설명을 읽어보면 알 수 있지만, 이런 바이너리 코드는 엄청나게 많은 숫자로 이루어져있고, 용량이 큰 편이다. 따라서 이런 파일을 다른 곳으로 이동하거나 보관하기 쉽게 하기 위해서 코덱(Codec = Encoder + Decoder)를 사용한다. 인코딩(Encoding)한다는 것은 억지로 예를 들자면 0111011101010100110011-> A 로 압축하여 압축해주는 것이 인코더이고, 이와 반대로 압축을 푸는 것이 디코더이다. 압축 방식이나 데이터의 표현방식을 다양하게 할 수 있기 때문에 비디오 코덱은 H.264, VC-1 등.. 오디오 코덱은 AAC, WMA 등 여러 가지가 있는 것이다. 이런 코덱 중 어떤 코덱을 쓰고 어떤 양식으로 표현하느냐에 따라 컨테이너의 확장자(흔히 .avi, .mp4, .mov 등...)가 달라진다.
Stream and Chunk
비디오 스트림
좀 더 깊이 이해하기 위해서 아래 Quora의 질문에 대한 답변 글들을 참고하였다.
가장 요약이 잘 된 설명은 다음과 같다.
Videos are just a sequence of frames...
Frames are just arrays of pixels...
Pixels are just a bunch of numbers..
and Numbers may be represented by a string of binary ones and zeros.-Glyn Williams 님의 답변
한 번쯤 fps(frame per second)라는 단위가 있어서, 초당 최소 24 프레임(사진)이 넘어가면 인간이 이를 영상으로 인지한다는 이야기를 들어봤을 것이다. 그리고 해상도가 FHD = 1920 x 1080 이라서 모니터의 가로가 1920개의 픽셀로, 세로가 1080개의 픽셀로 표현된다는 것도 한 번쯤은 들어봤을 것이다. 이 픽셀마다 RGB = (255, 128, 0)등의 숫자로 표현되고, 그것은 다시 011001...과 같은 바이너리 코드로 표현된다. 이런 영상 정보를 바이너리 코드로 표현한 것이 비디오 스트림이다.
오디오(사운드) 스트림
위 비디오 스트림에 대한 글에서, 오디오 스트림에 대한 원리 이해 글도 가져왔다.
우리 귀의 고막과 같이 diaphragm 막이 있어서 이것이 진동하면 붙어있는 전자기코일(간단하게는 자석에 구리선 두른 것)이 움직이면서 연결된 전선에 전자기 유도에 의한 전류가 흐른다. 이 전선 끝에 컴퓨터가 붙어서 전류값을 읽어 들이면, 위에서 왼쪽의 그래프와 같이 아날로그 신호가 추출된다. 만약 컴퓨터에게 1초마다 한번 전류값을 읽어들여라 라고 시킨다면, 위에서 오른쪽의 그래프와 같이 값을 샘플링할 수 있을 것이다. 이 값들을 0~10까지 표현해본다면, 십진수로 0 은 이진수로 0000, 8은 1000 으로 표현되므로 결국 바이너리 코드로 표현될 수 있을 것이다.
참고로 컴퓨터는 1초마다 한번 전류값을 읽어들이는 것이 아니라, CD 품질의 고해상도 오디오는 초당 44,100번 읽어들인다(샘플링한다).
2. AWS S3 Presigned URL
AWS에서 보통 파일들을 보관하는 리소스(서비스)로 S3를 많이 사용한다. 우선 S3 서비스에 접근하기 위해서 AWS IAM(Identity and Access Management)에서 AmazonS3FullAccess 권한을 취득해야한다.
https://dev.classmethod.jp/articles/create-pre-signed-url-in-s3/
그리고 S3에서 저장소인 버킷에 접근하면 저장된 파일의 URL을 얻을 수 있다.
S3 내부에서는 이 객체 URL을 이용해서 파일을 다운로드 받을 수 있으나, 외부(예를 들어 각자가 작성하는 프로그램)에서는 직접 접근이 제한된다. 이를 위해서 필요한 것이 Presigned URL이다.
https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html
파이썬이라면 위 사진과 같이 boto3를 import하고, BUCKET_NAME과 OBJECT_KEY 값을 넣어주어서 파일에 접근이 가능한 url을 얻을 수 있다. 여기서 BUCKET_NAME은 S3에서 만드는 폴더와 같은 bucket의 이름이고, OBJECT_KEY는 bucket 아래에 있는 file의 path 정보이다. 예를 들어 media 라는 bucket에 files/2022/11/test.jpg 라는 path로 저장했다면 'files/2022/11/test.jpg'가 object key가 될 수 있다.
'Programming-[Backend] > Python' 카테고리의 다른 글
[TIL] python 빈 리스트/None check, django test request값 안 변할 때 -> 테스트 메서드 이름 중복 (0) | 2022.11.02 |
---|---|
[탐험] ffmpeg-ffprobe로 AWS S3에 있는 Video 파일 메타데이터 추출: 비디오 스트림, AWS Presigned URL 방식 이해 2 (0) | 2022.11.01 |
파이썬 중급 - 10. 멀티 스크래핑 실습 : asyncio, beautifulsoup (0) | 2022.07.31 |
파이썬 중급 - 9. 동시성과 병렬성 : Futures (0) | 2022.07.31 |
파이썬 중급 - 8. 제너레이터 개념 되짚기, 코루틴 이해하기 (0) | 2022.07.24 |