2015-07-18 3 views
0

У меня проблема для моего сайта. Я пытаюсь поместить потоковое видео на свой сайт. Эта часть работает хорошо. Я использовал эту тему, чтобы сделать мой код: Symfony2 video streaming.Принимать запросы во время потоковой передачи в Symfony2

Я использую внешний видеофайл, а не локальный файл, но он работает.

Но пока видео не полностью загружено для клиента, я не могу выполнить какой-либо запрос (например, отправить комментарий или перейти на другую страницу (даже если действие приведет к поломке потоковой передачи, чтобы перейти на другую страницу)). Я попробовал функцию stream_context_create, но я не понимаю, как это работает.

Я не знаю, как это сделать, чтобы «передать» потоковое вещание и продолжить навигацию.

Не могли бы вы помочь мне, потому что клиент заблокирован, пока не загрузится его видео.

ответ

0

Я бы превратил вашу поточную логику в консольную консоль Symfony и запустил демон с помощью скрипта upstart или bash. Вы можете взаимодействовать с демоном, используя задачи в Redis или Mysql.

UPD: Создать объект Task в папке AppBundle/Entity:

<?php 
namespace AppBundle\Entity; 
use Doctrine\ORM\Mapping as ORM; 
/** 
* @ORM\Entity 
* @ORM\Table 
*/ 
class Task 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="bigint") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @var int 
    */ 
    private $id;  
    /** 
    * @ORM\Column(type="text") 
    * @var string 
    */ 
    private $fileName; 
    /** 
    * @var boolean 
    * @ORM\Column(type="string", length=50) 
    */ 
    protected $status = 'new'; 
    /** 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
    /** 
    * @param string $status 
    */ 
    public function setStatus($status) 
    { 
     $this->status = $status; 
    } 
    /** 
    * @return string 
    */ 
    public function setStatus($status) 
    { 
     return $this->status; 
    } 
} 

схемы обновления базы данных и убедитесь, что таблица была создана:

app/console doctrine:schema:update --force 

Создать Symfony Command.

namespace AppBundle\Command; 

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; 
use Symfony\Component\Console\Input\InputArgument; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Input\InputOption; 
use Symfony\Component\Console\Output\OutputInterface; 

class VideoDaemonCommand extends ContainerAwareCommand 
{ 
    protected function configure() 
    { 
     $this->setName('app:video-daemon'); 
    } 

    /** @var EntityManager */ 
    private $em; 

    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     $this->em = $this->getContainer()->get('doctrine.orm.entity_manager'); 
     while (true) { 
      $task = $this->em->getRepository('AppBundle:Task')->findOneBy(['status' => 'new']); 
      if (is_null($task)) { 
       sleep(5); 
       continue; 
      } 
      $this->setTaskStatus('processing', $task); 
      $this->processTask($task); 
     } 
    } 

    private function processTask($task) { 
     //here do streaming logic 
     $this->setTaskStatus('completed', $task); 
    } 

    private function setTaskStatus($status, $task) { 
     $task->setStatus($status); 
     $this->em->persist($task); 
     $this->em->flush(); 
    } 
} 

Позволяет создать демона с выскочкой (debian/ubuntu). Поместите следующий контент в /etc/init/video-daemon.conf и перезагрузите компьютер.

start on filesystem or runlevel [2345] 
stop on runlevel [!2345] 

### Keep the process alive, limit to 5 restarts in 60s 

    respawn 
    respawn limit 5 60 

### Start daemon 

script 
    exec /path/to/your/project/app/console app:video-daemon 
end script 

Проверьте демон работает:

ps -aux | grep video-daemon 

Теперь, если все прошло хорошо, вы можете создавать задачи в контроллерах Symfony/услуги по:

$task = new \AppBundle\Entity\Task(); 
$em->persist($task); 
$em->flush(); 
+0

Привет, спасибо за ваш ответ. У вас есть какой-нибудь пример или ссылки, чтобы помочь мне? Я немного новичок в symfony, и я не знаю, как взаимодействовать с консолью, а задачи демона могут отвечать клиенту через mysql? – Lerminou

+0

Спасибо, теперь я могу создавать задачи и выполнять их, но у меня все еще есть вопрос, как команда может вернуть содержимое моему клиенту? потому что контроллер только создаст задачу. С моей ветки, мне нужен контроллер визуализации? для моего балласта

+0

Вы можете выполнить ajax-запрос (/ check-task/{task_id}) сервер 1-2 раза в минуту, чтобы проверить готовность задачи. Если он готов, вы можете сделать запрос видео и вернуть контент своему клиенту. Примите мой ответ, если найдете это правильно. Благодаря! – karser

0

я нашел реальную проблему: она работает хорошо на FF, но в Chrome, запрос остается в ожидании.

мне нужно добавить параметр временных меток на мой запрос, чтобы заставить Chrome повторно загрузить страницу с

тему: HTML5 video element request stay pending forever (on chrome)

Смежные вопросы