2013-03-14 1 views
2

나는 최근에 사용자가 비디오를 업로드 할 수있는 웹 사이트에서 작업하기 시작했으며, 나는 ffmpeg로 초보자이지만 내가 원하는 이러한 것들을 어떻게 수행하는지 검색하고 찾고있다. 그 중 대부분은 나를 위해 일하지 않습니다.FFmpeg와 PHP는 MP4 및 스냅 샷으로 비디오를 변환

모든 비디오 유형을 .mp4으로 변환하고 가능한 한 품질을 좋게 유지하고 싶습니다. 현재 코드는 .mov.mp4 개의 업로드에 대해서만 작동하지만 .avi은 변환되지 않습니다 (해당 파일을 새로 만들지도 않음).

나는 또한 비디오에서 고화질 스크린 샷을 찍고 싶지만, 지금 얻고있는 스크린 샷은 정말로 저품질 인 것처럼 보이므로 그걸로 무엇이 있는지 모른다.

내가 지금 사용하고 코드는 이것이다 :

$ffmpeg = "/Users/USERNAME/ffmpeg/ffmpeg"; 
$src = "/Applications/MAMP/htdocs/lounge/videos/".$filename."_original.".$ext; 
$img = "/Applications/MAMP/htdocs/lounge/videos/thumbnails/".$filename."_1.jpg"; 
$img2 = "/Applications/MAMP/htdocs/lounge/videos/thumbnails/".$filename."_2.jpg"; 
$img3 = "/Applications/MAMP/htdocs/lounge/videos/thumbnails/".$filename."_3.jpg"; 
$video = "/Applications/MAMP/htdocs/lounge/videos/".$filename.".mp4"; 

$src = preg_replace("/ /", "\ ", $src); 
$img = preg_replace("/ /", "\ ", $img); 

$imgOutput = shell_exec("$ffmpeg -ss 1 -i $src -s 960x540 -f image2 -vframes 1 $img"); 
$imgOutput2 = shell_exec("$ffmpeg -ss 15 -i $src -s 960x540 -f image2 -vframes 1 $img2"); 
$imgOutput3 = shell_exec("$ffmpeg -ss 30 -i $src -s 960x540 -f image2 -vframes 1 $img3"); 

$videoOuput = shell_exec("$ffmpeg -y -i $src 2>&1 -s vga $video"); 

가 어떻게 720p 및 1080p의 비디오 출력에 대해 갈 수

?

+0

정말 좋은 화질의 스크린 샷을 원한다면 .jpg를 버리고 .png를 사용하십시오. – Havenard

+0

1080p 비디오는'-s 1920x1080'이고 720p 비디오는'-s 1280x720'입니다 – Havenard

+0

좋아, 글쎄, 720p 비디오를 사용했지만 여전히 원본보다 약간 픽셀 화되어 있습니다. –

답변

4

FFMpeg는 매우 강력한 솔루션이지만 원하는 것을 얻으려면 매우 다양한 옵션에 익숙해 야합니다.

무엇보다도 필요한 것은 어떤 소프트웨어/하드웨어가 비디오를 재생할 것인지 식별하는 것입니다.

여기서는 동영상이 웹 플레이어에서 플래시 플레이어 나 HTML5 플레이어 (예 : JWPlayer)를 사용하는 것으로 가정합니다.

그런 다음 필요한 품질을위한 최상의 비디오 및 오디오 형식을 찾아야합니다. .mp4은 다양한 비디오 및 오디오 형식을 포함 할 수있는 하나의 컨테이너 일뿐입니다. FFMpeg는 비디오 용으로 기본적으로 AVC (H.264)를 사용하고 오디오 용 AAC를 사용하기에 충분히 똑똑하지만, 원하는 비트 전송률이나 품질을 지정하지 않으면 완벽한 결과를 얻지 못할 수도 있습니다.

계속 진행하기 전에 매우 유용한 링크 http://ffmpeg.org/trac/ffmpeg/wiki/x264EncodingGuide을 읽어보십시오.

네트워크 처리량을 예측하려면 ABR 또는 CBR 모드를 사용하고 품질을 중요시하는 경우 CRF 모드 (18 ~ 20은 좋은 품질을 제공)를 사용해야합니다.

크기 조정 비디오는 그 자체로 복잡한 주제입니다. 정사각형이 아닌 샘플 화면 비율을 사용하여 비디오에 직면하고 있음을 알 수 있습니다. 즉, 비디오는 실제 폭 또는 높이와 다른 크기로 보거나, 시도 할 비율이 4 : 3 인 비디오를 의미합니다. 16 : 9 비율로 크기를 조정하면 변형이 발생합니다.

-s 옵션을 사용하면 기본적으로 양방향 선형 필터링 알고리즘을 사용하여 비디오 프레임의 크기를 조정하는 scale 필터를 실제로 삽입합니다. 이것은 일반적으로 사용자의 요구에 충분히 적합하지만 비디오에서 다른 처리 단계를 수행하려는 경우 필터를 명시 적으로 사용하는 것이 더 재미있을 때가 있습니다. 이것은 720 픽셀 높이 강제되지만 출력 비가 입력 비율과 동일하므로 비디오는 변형되지 않도록 보장

-vf "scale=-1:720" 

예 :.

실제로 비디오를 크게 만들면 품질이 향상되지 않으므로 파일 크기뿐만 아니라 처리 시간도 늘어납니다.

마지막으로 HTTP를 통해 재생할 파일에 대해 MP4 인코딩 후에 처리해야하는 문제가 있습니다. MP4 파일에는 파일 내용을 설명하는 데이터 블록 인 MOOV라는 아톰이 들어 있습니다. 플레이어 소프트웨어는 재생을 시작할 수 있도록이 블록을 읽어야합니다. 파일을 디스크에 저장 한 경우 로컬에서 문제가되지 않지만 파일 끝에 파일이 있으면 HTTP에서 다운로드 할 때 파일 재생을 차단합니다. 왜냐하면 재생을 시작하기 전에 전체 파일을 다운로드해야하기 때문입니다. FFMpeg는 MOOV 아톰을 파일의 끝에 넣으므로 기본적으로 HTTP 순차 재생에 적합하지 않습니다.

Qt-faststart 또는 MP4Box와 같은 도구를 사용하여 MOOV 원자를 처음에 배치하도록 파일을 수정해야합니다.

1

-preset veryslow -qp 0을 사용해 보셨습니까? SirDarius의 suggested link을 무손실 H.264 최고의 압축을위한 사전 설정으로 읽으십시오.