2013-08-30 2 views
45

나는 (다른 것들 중에서) 사용자가 업로드 한 비디오에서 특정 프레임을 추출해야하는 웹 페이지가 있습니다. 사용자는 플레이어에서 .mp4의 특정 부분을 탐색 한 다음 버튼을 클릭하고 Ajax 호출은 .mp4를 가져 오는 PHP 스크립트와 동영상의 정확한 시간에 해고되고이를 사용하여 추출합니다 "섬네일"프레임.동영상에서 특정 프레임을 추출하는 가장 빠른 방법 (PHP/ffmpeg/anything)

나의 현재 솔루션은 PHP exec 명령을 사용하고 있습니다 : 그것은 당밀처럼 느린 제외하고는 잘 작동

exec("ffmpeg -i $videoPath -ss $timeOffset -vframes 1 $jpgOutputPath");

을 .... 내 추측에 따르면 ffmpeg는 업무에 너무 많은 부분을 차지하고 있으며 기본 라이브러리 또는 무언가를 활용하여 더 잘 수행 할 수 있습니다 ... 그러나 나는 그 일을하는 방법을 전혀 모르고 있습니다.

이상적으로 나는 실제 "설치 프로세스"가 필요한 항목을 설치하고 싶지 않습니다 ... 즉, 웹 응용 프로그램 폴더의 실행 파일을 삭제하는 것이 좋지만 실제로는 필요하지 않습니다. 설치 프로그램을 실행하십시오. 또한 솔루션은 Mac, Linux 및 Windows에서 실행할 수 있어야합니다 (Linux가 최우선 임).

이 프로세스를 빠르게 진행하려면 어떻게해야합니까?

감사합니다.

+0

썸네일 생성 작업을 대기열에 넣고 기다릴 필요가없는 다른 스크립트에 의해 생성되는 동안 사용자가 다른 작업을 할 수있게 할 수 있습니다. – GordonM

+0

ffmpeg c : \ ffmpeg.exe -ic : \ video \ hello.mov - ss 10 - t 4 --f image2 - sameq - vcodec mjpeg img- % 03d.jpg 매우 까다로울 수 있습니다. 몇 가지 다른 속성을 사용하면 성능이 크게 향상 될 수 있습니다 ... –

+0

@DusanPlavak ['-sameq'는 "동일한 품질"을 의미하지 않습니다] (http://superuser.com/a/478550/110524) ffmpeg에서 제거되었습니다. jpg 출력의 경우 유효 범위 2 (최고 품질) ~ 31 (최저 품질) 인'-qscale : v'를 사용하십시오. – LordNeckbeard

답변

67

물론 C/C++ 및 링크를 -lav *로 코딩 할 수 있습니다. 기본적으로 프레임을 추출하기위한 ffmpeg의 단순화 된 버전을 만들고 어쩌면 PHP 확장으로도 할 수 있습니다 (또한 실행하지 않을 것입니다). 동일한 사용자로, 동일한 프로세스에서 제외). 그러나 일부 포크 및 설정 오버 헤드를 피할 수 있기 때문에 결과가 매우 빠를 가능성은 거의 없지만 실제 문제는 디코딩뿐입니다. 이는 여전히 동일합니다.

대신 고속 탐색 모드 (또는 고속/정확한 하이브리드 모드)에서 ffmpeg를 사용해야합니다. 빠른 추구에 대한 Their wiki states는 :

-ss 매개 변수를 지정해야 -i 전에 :

는 FFmpeg 0시 3분 0초 -ss -i Underworld.Awakening.avi -frames : 1 절 OUT1 .jpg

이 예에서는 동영상의 시작 부분에서 세 번째 분인 어딘가에 하나의 이미지 프레임 (out1.jpg)을 생성합니다. 입력은 키 프레임을 사용하여 구문 분석 된 이며 매우 빠릅니다. 단점은 도 지정된 시간 (00:03:00)에 에 위치하지 않아서 일부 키 프레임에서 검색을 완료하므로 검색이 예상대로 정확하게 이되지 않습니다.

빠른 탐색은 덜 정확하지만 ffmpeg는 탐색 중에 영화를 (대부분의) 디코딩 할 필요가 없으므로 빠르고 정확한 하이브리드 모드는 좋은 절충점입니다. 사용 가능한 모든 옵션에 대해서는 the wiki page을 읽으십시오.

편집 14/06/10 : 입력 옵션으로 사용할 때에도 트랜스 코딩 할 때와는 FFmpeg

는 FFmpeg 2.1 바와 같이 (즉, 복사를 스트리밍하지 않음)에 정확한 -ss이다. 이전 동작은 -noaccurate_seek 옵션을 사용하여 복원 할 수 있습니다. (source)

그래서 2.1과는-인코딩을 다시 올 때, "하이브리드"추구 정확한 결과를 위해 더 이상 필요하지 않을한다 (그리고 .jpeg에 저장하여 재 인코딩)입니다. 느린 탐색 (-i ... -ss ...) 대신 일반적인 빠른 탐색 (-ss ... -i ...)을 수행하면 충분합니다.

+1

실행 시간의 차이는 약 20 분 (3GB 비디오)이었습니다. 하루를 구했다. – weisjohn

+3

빠른 탐색은 원격 동영상에도 효과적입니다. http 또는 https를 통해 –

+0

"14/06/10 편집"버전이 저에게 적합합니다. – matt

관련 문제