ffprobe -show_streams [테스트영상]

라고 치면 동영상 정보들이 쭈루루룰루루루룩 나온다..

[root@centos-s-1vcpu-1gb-sfo3-01 file]# ffprobe -show_streams M_20080305000300000047731701.flv

나는 폴더 안에있는 영상들을 하나하나씩 다 읽어들여서 비교한다음에 인코딩을 할건지 안할건지 정할거기떄문에...

결국.. 이 ffprobe 결과값을 변수값에 넣던가 해야한다.. 흐엉..

 

ffprobe 로 일반 동영상 정보를 확인하면

[STREAM] 값 아래로

index=0 비디오 스팩정보 ,

index=1 audio 스팩정보

 

이렇게 두개의 대전재값으로 정보들이 보여진다.

이 모든값을 내가 손으로 꽉 쥐고싶다.

 

시나리오

 

1.[STREAM] 아래에 있는 정보 값만 먼저 잘라낸다.

2.index=0 ,1 로 오디오와 비디오 정보값만 잘라낸다

3.정규식으로 값만 뽑아 본다

4.배열에 값을 넣는다.

 

 

1.[STREAM] 아래에 있는 정보 값만 먼저 잘라낸다.

$alldata = substr( $output, strpos($output,"[STREAM]"), -1);

2.index=0 ,1 로 오디오와 비디오 정보값만 잘라낸다

$a=substr( $alldata, strpos($alldata,"index=0"), strpos($alldata,"[/STREAM]"));
$b=substr( $alldata, strpos($alldata,"index=1"), -1);

 

3.정규식으로 값만 뽑아 본다

4.배열에 값을 넣는다.

preg_match_all('/(.*)=(.*)/i', $a, $matches);
$video_info = [];
if(!empty($matches)) {
    foreach($matches[1] as $k => $v) {
        $video_info[$v] = $matches[2][$k];
    }
}

preg_match_all('/(.*)=(.*)/i', $b, $matches);
$video_info2 = [];
if(!empty($matches)) {
    foreach($matches[1] as $k => $v) {
        $video_info2[$v] = $matches[2][$k];
    }
}

 

 

실행값

print_r($video_info);
print_r($video_info2);

video값.

audio값.

풀코드

$output= shell_exec('/usr/bin/ffprobe -show_streams M_20080305000300000047731701.flv 2>&1;');
//
//STREAM 기준으로 자르기
$alldata = substr( $output, strpos($output,"[STREAM]"), -1);


$a=substr( $alldata, strpos($alldata,"index=0"), strpos($alldata,"[/STREAM]"));
$b=substr( $alldata, strpos($alldata,"index=1"), -1);

preg_match_all('/(.*)=(.*)/i', $a, $matches);
$video_info = [];
if(!empty($matches)) {
    foreach($matches[1] as $k => $v) {
        $video_info[$v] = $matches[2][$k];
    }
}

preg_match_all('/(.*)=(.*)/i', $b, $matches);
$video_info2 = [];
if(!empty($matches)) {
    foreach($matches[1] as $k => $v) {
        $video_info2[$v] = $matches[2][$k];
    }
}
print_r($video_info);
print_r($video_info2);
반응형
<?php   
$dir = "/var/www/html/uploadfile/file/"; 
if (is_dir($dir)){                              
  if ($dh = opendir($dir)){                     
    while (($file = readdir($dh)) !== false){   		
		//뒤에 확장자 때고 원본 이름 가져오기.
		$uploadfile = str_replace('.mp4', '', $file);  
		shell_exec('/usr/bin/ffmpeg -i '.$dir.$file.' -an '.$dir.$uploadfile.'.flv 2>&1;');

    }                                           
    closedir($dh);                              
  }                                             
}      

?>

is_dir로 파일을 가져오고

open_dir로 열고

readdir로 읽어서

 

shell_exec로 커맨드를 날려서

모두 인코딩해버린다.

 

반응형

동영상을 변환 시켜서 저장하 려고 한다.

 

시나리오.

1. 웹에서 파일선택후

 

2. form으로 원하는 값을 입력

 

3. 버튼을 누르면

선택된 파일 + form 에서 받은 입력값이 ajax 와 post 로 변수에 값 전달

 

4. 받은 값으로 exec 함수를 사용. ffmpeg 구문을 넣고 그 안에 변수값을 전달하여서 원하는 파일로 변경.

 

4.php 코드

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>변환 코드</title>
</head>
<body>
<script src="https://code.jquery.com/jquery-latest.js"></script>
<script>
	function file_frm_submit(frm) {

		var fileCheck = frm.upload_file.value;

		if(!fileCheck) {
			alert("업로드할 파일을 선택하세요.");
			return false;
		}

		var formData = new FormData(frm);			

		formData.append("message", "ajax로 파일 전송하기");
		

		$.ajax({
			url			: 'ajax_file_upload.php',
			type		: 'POST',
			dataType	: 'html',
			enctype		: 'multipart/form-data',
			processData	: false,
			contentType	: false,
			data		: formData,
			async		: false,
			success		: function(response) {
				console.log(response);	
		if(response == "failed") {				
          alert("파일 업로드에 문제가 발생하였습니다."); 
          return false;						
        } else {						
          alert("파일 업로드가 완료되었습니다.");		
          return true;
        }
			}
		});
	}

</script>
<div style = "display: flex;  width: 100%; height: 60em; align-items: center; justify-content: center;">

<form id="file_frm" style=" width: 50%; height: 50%; text-align: center; ">
	<input type="file" name="upload_file" id="upload_file">
	<br><br>

	<INPUT TYPE="text" name="testa" id ="texta">
	
	
	<button type="button" onClick="file_frm_submit(this.form)">ajax 업로드</button>
</form>
</div>

</body>
</html>

ajax_file_upload.php 코드

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
</head>   
<body>
<?php

$testa = $_POST["testa"];

ini_set("display_errors", "1");
//저장 경로
$uploaddir = '/var/www/html/uploadfile/file/';
$uploadfile = $uploaddir . basename($_FILES['upload_file']['name']);
echo '<pre>';


if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $uploadfile)) {
    
	// command 조절
	shell_exec('/usr/bin/ffmpeg -i '.$uploadfile.' -an /var/www/html/uploadfile/file/'.$_POST['testa'].'.mp4 2>&1;');
	//원본 삭제
	unlink($uploadfile);
	
} else {
    echo "failed";
}
print_r($_FILES);
print "</pre>";


echo $uploadfile;

?>


</body>
</html>

 

이러면 원하는 파일을 가져와서

ffmpeg로 커맨드를 만들어서 파일을 마음대로 변형할수있다. (시간, 썸내일 등)

 

 

결과값.

원하는 시간과 이름값 확장자 변환까지 할수있다.

 

 

2022.04.22 - [이과/ffmpeg] - FFmpeg 명령어 사용하기.

 

FFmpeg 명령어 사용하기.

이전 시간에 ffmpeg 다운을 받았다면 사용을 해봐야겠죠. 일단 테스트를 할만한 영상하나를 골라주세요 저는 test.mp4 라는 영상을쓰겠습니다. 동영상 일부 클립으로 자르기 test.mp4는 2분 34초로짜리

sesangcoding.tistory.com

 

반응형

이전 시간에 ffmpeg 다운을 받았다면

 

사용을 해봐야겠죠.

 

일단 테스트를 할만한 영상하나를 골라주세요 저는 test.mp4 라는 영상을쓰겠습니다.

 

동영상 일부 클립으로 자르기

 

test.mp4는 2분 34초로짜리입니다.


 

1. 일부 영상만 짤라서 가져오기

ffmpeg -i test.mp4 -ss 00:00:50.0 -codec copy -t 20 output.mp4

*해석

-ss :start time stamp (HH:MM:SS.ms) 짜르고싶은 시작시간

-t : duration of the clip (seconds) 그리고 몇초 정도 짜를건지

결과 자료 


2. 비디오 코덱 변경

ffmpeg -i test.mp4 -c:v libx264 file.flv

* 해석

c:v ( or -vcodec): video encoding output format

3. 비디오만 저장

ffmpeg -i test.mp4 -an mute-video.mp4

-vn: disable video

-ab : audio bitrate

 

4. 오디오만 저장

ffmpeg -i video.mp4 -vn -ab 256 audio.mp3

-vn: disable video

-ad : audio bitrate

 

5. 동영상 파일을 ani GIF 파일로 변환

-vf scale (or-s): scale filter

-t : duration

-r : frame rate

ffmpeg -i test.mp4 -vf scale=500:-1 -t 10 -r 10 image.gif

6. 썸네일 이미지 추출

-vf scale(or -s): scale filter

ffmpeg -ss 00:00:15 -i video.mp4 -vf scale=800:-1 -vframes 1 image.jpg

 

7. 동영상에 자막 추가

ffmpeg -i test.mp4 -i subtitles.srt -map 0 -map 1 -c copy -c:v libx264 -crf 23 -preset veryfast output.mkv

 

8. 비디오 화면 회전 (핸드폰으로 찍으면 새로 로 보일수있으니까 바꿔줄때 쓸려고한다)

ffmpeg -i test.mp4 -filter:v 'transpose=1' rotated-video.mp4
90도 회전
ffmpeg -i test.mp4 -filter:v 'transpose=2,transpose=2' rotated-video.mp4
180도회전

 

9. 비디오 해상도 변경

ffmpeg -i test.mp4 -s 480x320 -c:a copy output.mp4

 

 

[출처] nframe99님 

https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=nframe99&logNo=70189415674 

 

유용한 FFmpeg 명령어

유용한 FFmpeg 명령어 1. 동영상 중 일부를 작은 클립으로 자르기 ffmpeg -i input.mp4 -ss 00:00:50.0 -...

blog.naver.com

 

반응형

ffmpeg 는 미디어의 확장자명을 변환해줄수 있는 소프트웨어이다.

 

ex)

avi to mp4 

mp4 to flu ..

등 동영상을 다룬다면 금방 들을수있는 소프트웨어 이름이다.

 

또하나 들을수있는 말이 ffprobe 인데

간단히 말하면

ffmpeg고 미디어의 확장자명을 변환해주고

ffprobe는 미디어의 정보를 확인할수있다.

 

 

나는 영상을 인코딩하여서 내가 원하는 영상 코덱으로 포맷을 하기 위한 프로그램을 만들려한다.

 

기본 설치 방법.

wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz

 

자 설치 끝났고 압축 풀어야겠죠?

 tar xf ffmpeg-release-amd64-static.tar.xz

풀린것 확인.

자 파일 들어가서 

안에 뭐뭐있나 확인하기

안에있는 파일들을 모두

/usr/bin 으로 카피 시킨다.

cp -a ffmpeg ffprobe /usr/bin/

자 그리고 어느 위치에서든 한번 ffmpeg을 실행시켜보자

정상적으로 설치된것을볼수있다.

자. 인제 시작이다.

반응형

+ Recent posts