Categories
FFmpeg

FFmpeg 으로 동영상의 비디오 해상도 변경하기

FFmpeg 으로 동영상의 비디오 해상도를 변경하는 방법을 알아보자.

1. scale 필터

비디오 해상도를 변경할 때는 scale 필터를 쓴다.

ffmpeg -i input.mp4 -vf scale=w=640:h=480 output.mp4

w 옵션은 동영상의 가로 크기를 픽셀 단위로 지정한다.

h 옵션은 동영상의 세로 크기를 픽셀 단위로 지정한다.

2. 동영상 품질의 유지

해상도를 변경하면서 동영상의 품질을 최대한 유지하는 방법을 알아보자.

ffmpeg -i input.mp4 -vf scale=w=640:h=480 -preset slow -crf 18 output.mp4

-preset 옵션은 인코딩 속도를 지정할 때 쓴다. 속도가 느릴수록 동영상의 품질이 좋아진다.

-crf 옵션의 값은 0 ~ 51 범위 안에서 지정한다. 값이 작을수록 동영상의 품질이 좋아진다. 기본값은 23 이다. 17 또는 18 로 지정하면 무손실에 근접한 정도의 품질을 얻을 수 있다.

CRF 는 고정 비율 인자 (Constant Rate Factor) 를 의미한다.

3. 가로세로 비율의 유지

원래의 가로세로 비율 (aspect ratio) 을 유지하면서 비디오 해상도를 변경해 보자.

입력 파일인 input.mp4 의 비디오 해상도가 1920×1080 이라고 하자.

ffmpeg -i input.mp4 -vf scale=w=800:h=-1 output.mp4

가로 크기를 800 으로 지정하고 세로 크기는 -1 로 지정했다. 세로 크기는 원래의 가로세로 비율에 따라 자동으로 계산되어 다시 지정된다. 실제의 세로 크기는 450 이 된다.

ffmpeg -i input.mp4 -vf scale=w=-1:h=600 output.mp4

가로 크기를 -1 로 지정하고 세로 크기는 600 으로 지정했다. 가로 크기는 원래의 가로세로 비율에 따라 자동으로 계산되어 다시 지정된다. 실제의 가로 크기는 1067 이 된다.

Categories
FFmpeg

FFmpeg으로 여러 동영상을 연결하는 2가지 방법

ffmpeg 명령으로 여러 동영상을 연결하는 방법을 알아보자.

1. concat 필터를 이용한 방법

concat 필터를 이용해서 여러 동영상을 연결해 보자.

다음 ffmpeg 명령은 3개의 동영상을 연결하여 하나의 새로운 동영상을 생성한다.

ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 \
  -filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]" \
  -map "[v]" -map "[a]" output.mp4

명령에서 중요한 몇몇 부분들을 살펴보자.

[0:v][0:a] 부분은 첫번째 입력 파일의 비디오 스트림과 오디오 스트림을 가리킨다. 이러한 부분을 세그먼트라고 한다.

[1:v][1:a] 부분은 두번째 입력 파일의 비디오 스트림과 오디오 스트림을 가리킨다.

[2:v][2:a] 부분은 세번째 입력 파일의 비디오 스트림과 오디오 스트림을 가리킨다.

concat 필터에는 3가지 옵션이 있다.

n=3

n 옵션은 세그먼트의 개수를 지정한다.

v=1

v 옵션은 출력 비디오 스트림의 개수를 지정한다. 이것은 각 세그먼트의 비디오 스트림 개수와 일치해야 한다.

a=1

a 옵션은 출력 오디오 스트림의 개수를 지정한다. 이것은 각 세그먼트의 오디오 스트림 개수와 일치해야 한다.

[v] 는 출력 비디오 스트림의 이름이다.

[a] 는 출력 오디오 스트림의 이름이다.

-map “[v]” -map “[a]” output.mp4

출력 비디오 스트림과 출력 오디오 스트림을 매핑한다. 최종 결과물은 output.mp4 파일로 저장된다.

2. cat 명령을 이용한 방법

cat 명령과 중간 (intermediate) 동영상을 이용해서 여러 동영상을 연결해 보자.

중간 동영상으로는 TS (Transport Stream) 포맷의 동영상이 주로 사용된다.

연결할 동영상 중 하나를 TS 포맷으로 변환한다.

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts inter1.ts

명령에서 중요한 부분들을 살펴보자.

-bsf:v h264_mp4toannexb

비트스트림(bitstream) 필터로 h264_mp4toannexb 를 지정한다.

-f mpegts inter1.ts

파일 포맷을 mpegts 로 지정한다. 최종 결과물은 inter1.ts 파일로 저장된다.

나머지 동영상들도 마찬가지 방법으로 변환한다.

ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts inter2.ts
ffmpeg -i input3.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts inter3.ts

변환된 3개의 동영상을 cat 명령으로 연결한다.

cat inter1.ts inter2.ts inter3.ts > inter-all.ts

ts 파일을 mp4 파일로 변환한다.

ffmpeg -i inter-all.ts -c:v libx264 -c:a libfdk_aac output.mp4

Categories
PHP

PHP의 printf() 함수에서 출력 포맷을 지정하는 방법

printf() 함수에서 주어진 값을 여러가지 형식으로 포맷하는 방법을 알아보자.

1. 타입 (type) 의 지정

타입 지정자 d 는 주어진 값을 부호가 있는 십진 정수 타입으로 포맷한다.

printf(“%d<br>”, 255);    // 255 를 출력한다.

printf(“%d<br>”, -255);    // -255 를 출력한다.

타입 지정자 u 는 주어진 값을 부호가 없는 십진 정수 타입으로 포맷한다.

printf(“%u<br>”, 255);    // 255 를 출력한다.

printf(“%u<br>”, -255);    // 18446744073709551361 을 출력한다.

타입 지정자 f 는 주어진 값을 실수 타입으로 포맷한다.

printf(“%f<br>”, 3.14);    // 3.140000 을 출력한다.

타입 지정자 e 는 주어진 값을 과학 표기법에 따라 포맷한다.

printf(“%e<br>”, 1234567890);    // 1.234568e+9 를 출력한다.

타입 지정자 s 는 주어진 값을 문자열로 포맷한다.

printf(“%s<br>”, “xtmci.com”);    // xtmci.com 을 출력한다.

타입 지정자 c 는 주어진 값을 해당 값에 대응하는 아스키 (ASCII) 문자로 포맷한다.

printf(“%c<br>”, 65);    // A 를 출력한다.

printf(“%c<br>”, 90);    // Z 를 출력한다.

타입 지정자 b 는 주어진 값을 이진수 정수 타입으로 포맷한다.

printf(“%b<br>”, 255);    // 11111111 을 출력한다.

타입 지정자 o 는 주어진 값을 8진수 정수 타입으로 포맷한다.

printf(“%o<br>”, 255);    // 377 을 출력한다.

타입 지정자 x 는 주어진 값을 16진수 정수 타입으로 포맷한다. 소문자가 사용된다.

printf(“%x<br>”, 255);    // ff 를 출력한다.

타입 지정자 X 는 주어진 값을 16진수 정수 타입으로 포맷한다. 대문자가 사용된다.

printf(“%X<br>”, 255);    // FF 를 출력한다.

2. 자리수 채우기

자리수를 채우는 문자를 패딩 (padding) 문자라고 부른다.

패딩 문자 0 을 사용하여 자리수를 채워 보자.

printf(“%06d<br>”, 123);    // 000123 을 출력한다.

printf(“%06d<br>”, 1234567);    // 1234567 을 출력한다.

주어진 값의 자리수가 지정한 자리수보다 클 때는 주어진 값의 자리수 만큼 표시된다. 지정한 자리수는 무시된다.

패딩 문자를 지정하지 않으면 공백 문자가 사용된다.

printf(“%6d<br>”, 123);    // ‘   123’ 을 출력한다.

printf(“% 6d<br>”, 123);    // ‘   123’ 을 출력한다.

음수를 지정하면 오른쪽이 채워진다.

printf(“%-6d<br>”, 123);    // ‘123   ‘ 을 출력한다.

0 이나 공백 문자가 아닌 패딩 문자는 홑따옴표 (‘) 와 함께 지정한다. 애스터리스크 (*) 문자를 지정해 보자.

printf(“%’*6d<br>”, 123);    // ***123 을 출력한다.

3. 수의 정밀도 지정

수의 정밀도는 달리 지정하지 않으면 소수점 이하 6 자리로 표현된다.

printf(“%f<br>”, 3.141592654);    // 3.141593 을 출력한다.

점 (.) 과 자리수를 의미하는 숫자를 타입 지정자 앞에 추가하여 정밀도를 변경한다.

printf(“%.8f<br>”, 3.141592654);    // 3.14159265 를 출력한다.

printf(“%.10f<br>”, 3.141592654);    // 3.1415926540 을 출력한다.

4. 양의 부호 표시하기

주어진 값이 양수일 때 양의 부호를 표시하려면 타입 지정자 앞에 플러스 (+) 기호를 추가한다.

printf(“%d<br>”, 255);    // 255 를 출력한다.

printf(“%+d<br>”, 255);    // +255 를 출력한다.

Categories
PHP

PHP에서 문자열을 정수나 실수로 변환하는 방법

문자열을 숫자로 변환하는 방법은 2가지가 있다. 함수를 이용할 수도 있고 타입 (type) 캐스팅을 이용할 수도 있다.

1. 함수를 이용한 방법

intval() 함수는 주어진 값을 정수형으로 변환하여 리턴한다.

floatval() 함수는 주어진 값을 실수형으로 변환하여 리턴한다.

echo intval("3.141592") . "<br>";    // 3 을 출력한다.
echo intval("-3.141592") . "<br>";    // -3 을 출력한다.
echo intval("+3.141592") . "<br>";    // 3 을 출력한다.

echo floatval("3.141592") . "<br>";    // 3.141592 를 출력한다.
echo floatval("-3.141592") . "<br>";    // -3.141592 를 출력한다.
echo floatval("+3.141592") . "<br>";    // 3.141592 를 출력한다.

2. 타입 캐스팅

타입 캐스팅을 통해 문자열을 정수형이나 실수형으로 변환한다.

$pi_str = "3.141592"
echo gettype($pi_str) . "<br>";    // string 을 출력한다.

$pi_int = (int) $pi_str;    // 정수형으로 캐스팅한다.
echo gettype($pi_int) . "<br>";    // integer 를 출력한다.
echo $pi_int . "<br>";    // 3 을 출력한다.

$pi_float = (float) $pi_str;    // 실수형으로 캐스팅한다.
echo gettype($pi_float) . "<br>";    // double 을 출력한다.
echo $pi_float . "<br>";    // 3.141592 를 출력한다.

gettype() 은 변수의 자료형을 리턴하는 함수이다.