угловой $sce trustAsResourceUrl из узла

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

для этой цели я загрузил и установил videogular и теперь пытаюсь его настроить, но я знаю, как это сделать.

Согласно документации на videogular для загрузки видео вам понадобится такой синтаксис:

sources: [
    {src: $sce.trustAsResourceUrl(myMp4Resource), type: "video/mp4"}
]

Это хорошо, когда вы хотите загрузить контент без потоковой передачи.

Но скажем, например, у вас есть сервер узла, работающий на порту 8105, и файл, который вы хотите собрать, имеет идентификатор 1, тогда результат может выглядеть примерно так:

sources: [
    {src: $sce.trustAsResourceUrl('http://localhost:8105/loadvideo/1'), type: "video/mp4"}
]

Однако в моей попытке сделать это он просто сказал бы мне, что ресурс не является фактическим ресурсом.

Мой вопрос в том, как вы транслируете видеоконтент (желательно с помощью videogular), и кто-нибудь знает примеры, когда люди сделали это возможным?

Код на стороне сервера

Итак, моя первоначальная идея (и я знаю, что это изменение кода выше) состояла в том, чтобы создать route, который брал бы путь:

    router.route('/retrieveFile')
    .post(function (request, response) {
        var path = '../' + request.body.data;
        var file = fs.createReadStream(path);
        file.pipe(response);
    });

А затем передал вывод файла.

Затем используйте это для потоковой передачи файла


person Marc Rasmussen    schedule 01.06.2015    source источник
comment
А если указать в браузере localhost:8105/loadvideo/1, видео действительно загрузится?   -  person laggingreflex    schedule 01.06.2015
comment
@laggingreflex, например, он должен собирать видео и транслировать его, но я не совсем уверен, куда идти дальше, или если я делаю это правильно, я не могу найти никаких примеров, поэтому я как бы бросаю вещи в темноту.   -  person Marc Rasmussen    schedule 01.06.2015
comment
Можете ли вы создать простую скрипку, чтобы мы могли поработать над ней и посмотреть, чего не будет. Потому что это хорошо работает таким образом.   -  person Kop4lyf    schedule 01.06.2015
comment
я добавил некоторый серверный код, пожалуйста, обратите внимание, что я не совсем уверен, что он будет работать таким образом, поэтому лучшие идеи приветствуются   -  person Marc Rasmussen    schedule 01.06.2015


Ответы (2)


Если у вас есть видеофайлы на жестком диске, и вы хотите обслуживать их все с их именами файлов, вы должны просто использовать Express Static, чтобы обслуживать их так же, как и любой другой ресурс

Вы можете добавить префикс пути «/videos», чтобы отличить их от обычных ресурсов.

app.use('/videos', express.static('videos'));

Тогда видеофайл ./videos/myvid.mp4 будет доступен как http://localhost:8000/videos/myvid.mp4

person laggingreflex    schedule 02.06.2015

Чтобы файл был доступен как файл, вам нужно установить соответствующие заголовки перед конвейером.

И чтобы загрузить файл, вы поместите этот код в свой маршрутизатор и там, где вы используете post, если у вас нет веской причины, я бы просто использовал get или all

Вы также можете захотеть завершить передачу, если клиент решит отключиться в середине потока.

В качестве альтернативы вы можете использовать res.download вместо потоков, и в этом случае соответствующие заголовки и прерывания обрабатываются автоматически.

Таким образом, весь код может выглядеть так:

router.route('/path/to/video.mp4')
.all(function(req, res){
    res.header('content-disposition', 'filename="video.mp4"')
    var stream = fs.createReadStream('./resources/video.mp4');
    stream.pipe(res);
    require('on-finished')(res, stream.abort.bind(stream));

    // or simply
    res.download(fs.readSync('/path'))
});

Затем вы можете использовать http://localhost:8000/path/to/video.mp4, чтобы либо напрямую загрузить видео в ваш браузер, либо он воспроизведет его, если сможет, либо просто предложит загрузить. Или вы можете использовать этот URL в своем videgular

sources: [ {src: $sce.trustAsResourceUrl('http://localhost:8000/path/to/video.mp4'), type: "video/mp4"} ]
person laggingreflex    schedule 01.06.2015
comment
Большое спасибо за ваш ответ. Не могли бы вы сказать мне, как мне загрузить файл из внешнего интерфейса (взяв мой пример, как бы вы назвали поток)? - person Marc Rasmussen; 02.06.2015
comment
это выглядит хорошо, но как мне убедиться, что сервер узла вызывается? скажем, если сервер узла работает на порту 8105, то он не будет запрашиваться при попытке найти источник, поскольку порт по умолчанию — 80? - person Marc Rasmussen; 02.06.2015
comment
я знаю, что могу быть глупым, но путь к URL-адресу будет запускать маршрут ('/retrieveFile'), скажем, например, мой путь к файлу user_resources/module/5/video.mp4? - person Marc Rasmussen; 02.06.2015
comment
@MarcRasmussen Это путь, по которому фактический файл находится на вашем компьютере, или это URL-адрес, по которому вы хотите, чтобы ваш видеофайл обслуживался? Если это первый случай, замените этот путь в вашем fs.readStream(path), но если это последний случай, замените его в вашем маршрутизаторе .router('user_resources/module/5/video.mp4').all(function) (на самом деле я только что понял, что допустил ошибку в этом коде, см. для исправления) - person laggingreflex; 02.06.2015
comment
если это первое, не означает ли это, что мне придется создавать новый маршрут для каждого файла, загруженного в мою систему, если я хочу его обслуживать? - person Marc Rasmussen; 02.06.2015