Symfony 后台进程 FFmpeg 视频转换
Symfony Background Process FFmpeg video converting
我正在尝试使用 FFmpeg 转换视频并且一切正常,但现在我正在尝试在后台执行转换过程,因此我不必等待该过程在分钟左右。
关于如何执行此操作有什么建议吗?
这是我当前在控制器中的代码:
$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 );
}
首先,您应该将 ffmpeg 逻辑从控制器移动到服务。
用新的 "unconverted" 标志刷新你的 "upload"。
新服务应通过传递的 id 获取 "upload" 实体(刷新后生成)
然后您应该创建一个控制台命令来获取该服务并调用 "convert" public 方法并将传递的 id 作为参数。
该服务将生成与控制器中相同的 ffmpeg 逻辑 + 更新 "unconverted" 标志(如果您需要跟踪此状态,则为 ofc)
您的控制器应该在后台调用新的控制台命令,有关详细信息,您可以在这个答案中查看我的建议
我正在尝试使用 FFmpeg 转换视频并且一切正常,但现在我正在尝试在后台执行转换过程,因此我不必等待该过程在分钟左右。
关于如何执行此操作有什么建议吗?
这是我当前在控制器中的代码:
$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 );
}
首先,您应该将 ffmpeg 逻辑从控制器移动到服务。 用新的 "unconverted" 标志刷新你的 "upload"。
新服务应通过传递的 id 获取 "upload" 实体(刷新后生成)
然后您应该创建一个控制台命令来获取该服务并调用 "convert" public 方法并将传递的 id 作为参数。
该服务将生成与控制器中相同的 ffmpeg 逻辑 + 更新 "unconverted" 标志(如果您需要跟踪此状态,则为 ofc)
您的控制器应该在后台调用新的控制台命令,有关详细信息,您可以在这个答案中查看我的建议