2013-07-12 2 views
0

저는 YouTube와 마찬가지로 웹 사이트 www.goploom.com을 소유하고있어 사용자가 비디오를 업로드하고 볼 수 있습니다. 업로드 된 동영상은 YouTube 사이트의 html5 동영상 플레이어와 호환되도록 mp4 형식으로 변환됩니다. 내 문제는 FFmpeg 성공적으로 업로드 된 비디오에서 비디오 축소판을 생성하고 적절한 디렉터리에 이미지를 저장하는 동안 내 코드의 비디오 변환 측면에서 출력을 생성하지 않습니다. 몇 시간 동안 코드를 수정했는데이 문제를 해결할 수 없었지만 html, php 및 ffmpeg로 비디오 변환을 수행 할 수 있다고 들었습니다.FFmpeg가 작동하지 않습니다.

썸네일 생성이 완벽하게 작동하기 때문에 ffmpeg 로의 내 경로가 정확합니다.

** 업로드시 업로드 된 비디오의 정보. $ name = $ _FILES [ 'video'] [ 'name']; $ title = $ _POST [ 'videotitle']; $ type = explode ('.', $ name);
$ type = end ($ type); $ size = $ _FILES [ 'video'] [ 'size']; $ random_name = rand(); $ tmp = $ _FILES [ 'video'] [ 'tmp_name'];

   if($type != 'mp4' && $type != 'MP4' && $type != 'flv' && $type != 'FLV' && $type != 'mov' && $type != 'MOV'){ 
        $message = "Video Format Not Supported<br>"; 
       } else { 
      $username_query = mysql_query("SELECT `username` FROM `users` WHERE `user_id` = $session_user_id"); 
        $username = mysql_fetch_assoc($username_query); 
        $username = $username['username']; 

** 완벽하게 작동하는 엄지 손톱 생성. $ ffmpeg = "/ usr/local/bin/ffmpeg"; $ videoFile = $ _FILES [ 'video'] [ 'tmp_name']; $ imageFile = "업로드 /".$ 사용자 이름. "/ 축소판 /". $ 임의의 이름. ". jpg"; $ size = "160x90"; $ getFromSecond = 5; $ cmd = "$ ffmpeg -i $ videoFile -an -ss $ getFromSecond -s $ size $ imageFile"; if (! shell_exec ($ cmd)) { echo "미리보기 이미지 생성 됨
";
else { echo "미리보기 이미지를 만드는 중 오류가 발생했습니다!"; }

** 업로드 한 파일을 동영상 변환을위한 영구 디렉토리로 이동합니다. $ newFileLocation = "업로드 /".$ 사용자 이름. "/ temp". $ random_name. ".". $ type; move_uploaded_file ($ tmp, $ newFileLocation);

* 비디오 변환 코드. $ outputFile = "업로드 /".$ 사용자 이름. "/". $ random_name. ".mp4"; $ databaseStoredVideoUrl = "업로드 /". 사용자 이름. "/". $ random_name. ".mp4"; $ video_cmd = "$ ffmpeg -i $ newFileLocation $ outputFile"; echo $ video_cmd; if (! shell_exec ($ video_cmd)) { echo "Video Converted!
"; } else { echo "미리보기 이미지를 만드는 중 오류가 발생했습니다!";

** 제대로 출력 된 src 링크를 데이터베이스에 저장하지만 비디오가 존재하지 않기 때문에 볼 수 없습니다. // 올바른 사용자 이름과 사용자 디렉토리에있는 데이터베이스에 비디오 저장 mysql_query ("INSERT INTO videos VALUES ('$ session_user_id', '' '$ name', '$ outputFile', '$ title', '', $) imageFile ') "); $ message = "업로드 성공
";

어떤 도움이나 통찰력이 우수 할 것입니다. 감사합니다. .

** 편집 : 다음 줄을 사용하여 수정. $ video_cmd = "$의는 FFmpeg -i $ newFileLocation -vcodec libx264 -vpre 정상 -acodec libfaac의 $의 출력 _를";

다음 shell_exec

답변

0

몰라에 $ video_cmd를 입력. 는 FFMPEG와 PHP와 함께 몇 번 나 자신을 열심히 당신이로 실행 할 수있는 몇 가지 문제점은 다음과 같습니다 :

  1. 메모리 한계는 당신이 내가 오히려 권하고 싶지 않다 비디오 인코딩 서버 측을 실행하는 것 때문이다. 자체가 너무 오래 이후 비디오 enconding의 실행이 더 이상 최대 스크립트 실행이 웹 서버 아파치/Nginx에 의해 허용되는 그 무엇을 수있는 기간이 걸릴 수 있습니다
  2. 둘째는 FFmpeg 과정.

당신은 당신이 아니라이 자제하고, 대신 cron 작업 또는 처리 및 인코딩해야 새로운 동영상이있는 경우 (비디오 큐 서비스를 확인하는 별도의 서비스를해야 웹 요청으로 인코딩을 실행하는 경우).

단계는이 대략 수 있도록 보장하기 위해 다음있는 CmdLine에서 직접

  1. 첫 번째 테스트 인코딩을.
  2. 는 비디오 테이블 플래그 processsed해야하는 사람들을 업데이트하거나 비디오 큐 테이블을 확인합니다.
  3. 은 cron 작업 또는 새로운 비디오 처리 한 다음 하나씩 처리 할를 확인하는 서비스가있다.

PHP에 가장 익숙한 경우 스크립트가 시간 초과되지 않도록 ini_set ("set_time_limit", 0)을 사용하여 PHP 스크립트를 만드십시오. 다른 옵션은 bash 스크립트 일 수도 있고, 예를 들어 foreverffmpeg library과 함께 node.js를 사용하여 처리 서비스를 작성할 수도 있습니다.

관련 문제