0

FFmpeg でビデオを変換しようとしていますが、すべて正常に動作しますが、現在はバックグラウンドで変換プロセスを実行しようとしているため、プロセスが 1 分ほどで完了するのを待つ必要はありません。

これを行う方法について何か提案はありますか?

これは、コントローラーの現在のコードです。

$urlGenerator = new urlGenerator();
$user = $this->getUser ();
$userid = $user->getid ();
$username = $user->getFullname ();
$emailcomment = $this->container->getParameter ( 'mailer_sender_address' );

$ffmpeg = $this->get ( 'dubture_ffmpeg.ffmpeg' );
$ffprobe = $this->get ( 'dubture_ffmpeg.ffprobe' );

$currentDateTime = date ( 'YmdHis' );
$upload = new UploadVideo();

$em = $this->getDoctrine ()->getManager ();
$form = $this->createForm ( new UploadVideoType(), $upload );
$userids = $em->getReference ( 'HotelPlanBundle\Entity\User', $userid );
$form->handleRequest ( $request );

if ( $form->isValid () || TRUE ) {
    $upload->upload ($userid);

    // Start transcoding and save video
    $upload->setUserid ( $userids );
    $upload->setTitle ( 'No title' );
    $upload->setCreatedDate ( new \DateTime() );

    $duration = $ffprobe
        ->format ( $upload->getWebPath () )// extracts file informations
        ->get ( 'duration' );

    $video = $ffmpeg->open ( $upload->getWebPath () );
    $video
        ->frame ( TimeCode::fromSeconds ( 10 ) )
        ->save ( __DIR__ . '/../../../web/uploads/documents/' . $currentDateTime . '.png' );

    $upload->setThumbnail ( $currentDateTime . '.png' );

    //here is where the converting takes too long !!
    $video->save ( new X264(), __DIR__ . '/../../../web/uploads/documents/' . $currentDateTime . '.mp4' );

    $upload->setVideoPath ( $currentDateTime . '.mp4' );
    $upload->setLink ( $urlGenerator->generateUrl () );
    $upload->setResetLink ( $urlGenerator->generateUrl () );

    try {
        $em->persist ( $upload );
        $em->flush ();
    } catch ( \Exception $e ) {
        if ( $e->getPrevious ()->getCode () == '23000' ) {
            $upload->setLink ( $urlGenerator->generateUrl () );
            $em->persist ( $upload );
            $em->flush ();
    }
}
$em->persist ( $upload );
$em->flush ();

return new JsonResponse( array (
    'message' => 'Sucessfully Uploaded',
    'last_id' => $upload->getId ()
), 200 );
}
4

1 に答える 1

0

最初に、ffmpeg ロジックをコントローラーからサービスに移動する必要があります。「アップロード」を新しい「未変換」フラグでフラッシュします。

新しいサービスは、渡された ID (フラッシュ後に生成されたもの) によって「アップロード」エンティティを取得する必要があります。

次に、そのサービスを取得し、渡された ID をパラメーターとして使用して「convert」パブリック メソッドを呼び出すコンソール コマンドを作成する必要があります。

サービスは、コントローラーにあるのと同じ ffmpeg ロジックを作成し、「未変換」フラグを更新します (この状態を追跡する必要がある場合は ofc)

コントローラーはバックグラウンドで新しいコンソール コマンドを呼び出す必要があります。詳細については、この回答で私の提案を参照してください。Symfony2 でコマンドを非同期に呼び出す

于 2016-03-04T16:09:24.910 に答える