2017-04-06 3 views
1

ffmpeg 및 php를 사용하여 큰 (40MB) mov 파일을 mp4로 변환하려고합니다.대용량 파일의 경우 shell_exec 시간 초과를 사용하는 FFMPEG 변환

하지만 서버에서 504 시간 초과 오류가 발생합니다. 변경하지 않고도이 문제를 해결할 수 있습니까? set_time_limit?

여기 내 PHP 코드입니다.

shell_exec($this->getFFmpegPath() . ' -i ' . $path . ' -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -preset slower -crf 18 -vf "scale=trunc(in_w/2)*2:trunc(in_h/2)*2" ' . $convertedPath . '.mp4'); 

그래서 시간 초과없이 변환하는 방법에 대한 아이디어가 있으십니까? 어떤 도움을 많이 주시면 감사하겠습니다.

답변

1

백그라운드에서 변환을 실행하는 것이 좋습니다. 주소가있는 this question을 찾았지만 그 주제에 대해 좀 더 조사하십시오. 그런 다음 사용자가 새로 고침하여 프로세스가 완료되었는지 확인할 수 있습니다.

더 나은 사용자 환경을 제공 할 수 있습니다 (장시간 페이지 로딩을 더 잘 볼 수 있습니다.) 연결에서 PHP 엔진, 웹 서버, 프록시, 브라우저와 같이 시간 초과를 고려해야 할 장소가 많이 있습니다. 의 인프라에 따라 달라집니다.

을 또한 당신이 정말 조심shell_exec으로해야합니다. 누군가의 기회를 웹에 기계와 그들이 원하는 무엇이든 그것을 악용 상당히 높은. 방법으로 사용하는 아마되지 않습니다 오늘은 ($path$convertedPath의 출처에 따라 다르지만) 사용자가 결과 파일 이름을 지정하도록 허용하는이 코드의 향후 업데이트에서

+0

폴 감사합니다, 나는 약간의 조사를했고 내가 백그라운드에서 프로세스를 실행할 수 있지만 지금은 백그라운드 프로세스의 상태를 알아야한다는 것을 알아 냈습니다. –

+0

나는 나 자신과 비슷한 것을 시도하지 않았기 때문에 어떤 이슈를 실행할 지 모른다. 연결된 질문은 PID를 저장하도록 제안합니다. 여러 parralel 사용자가있을 수 있으므로 세션에 저장하는 것이 좋은 옵션 일 수 있습니다. 그런 다음 상태를 보여주는 페이지를 원합니다. 프로세스가 여전히 실행 중인지 확인하려면이 응답에서 제안하는대로 if (file_exists ("/ proc/$ pid")) {'를 사용할 수 있습니다. http://stackoverflow.com/a/9874592/2799887 –

+0

백그라운드 프로세스로 변환하면 더 이상 stdout 및 stderr에 액세스 할 수 없게됩니다 (또한 진행 정보를 결정할 능력도 없습니다). 따라서 stdout과 stderr을'$ tempdir/$ pid.stdout.log'와'$ tempdir/$ pid.stderr.log' 또는 이와 비슷한 것으로 작성하는 것이 좋습니다. –