@kevingodell/node-red-mp4frag published to npm

Out with the old, ...

npm uninstall node-red-contrib-mp4frag
npm install @kevingodell/node-red-mp4frag

If you have used node-red-contrib-mp4frag in the past, you will notice some changes.


There is a small difference to the node's status:

  • red error
  • yellow ready / reset
  • green after parsing 1st segment / playlist is ready
  • http: on/off, io on/off, buffer: on/off
    Screen Shot 2022-12-17 at 9.40.58 AM
    Screen Shot 2022-12-17 at 9.41.38 AM
    Screen Shot 2022-12-17 at 9.41.11 AM

If you want to use the old version that was available only on github, then you can still install it. It will receive no updates and will eventually be deleted! :

npm install kevinGodell/node-red-mp4frag#node-red-contrib-mp4frag
7 Likes

Hello Kevin,

I'm trying to connect to my rtsp stream of my camera with your node and display it on the UI but no image can be displayed can you please help me with the configuration Mfg EIKSEU

[
    {
        "id": "bb0ae6e2ee973bf8",
        "type": "tab",
        "label": "Flow 1",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "98b9f9b22fb5970c",
        "type": "inject",
        "z": "bb0ae6e2ee973bf8",
        "name": "Start stream",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": "1",
        "topic": "",
        "payload": "true",
        "payloadType": "bool",
        "x": 108,
        "y": 125,
        "wires": [
            [
                "2d2883315a2105e0"
            ]
        ]
    },
    {
        "id": "9104b81dfc826dfe",
        "type": "inject",
        "z": "bb0ae6e2ee973bf8",
        "name": "Stop stream",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "false",
        "payloadType": "bool",
        "x": 99,
        "y": 175.00000190734863,
        "wires": [
            [
                "2d2883315a2105e0"
            ]
        ]
    },
    {
        "id": "2d2883315a2105e0",
        "type": "switch",
        "z": "bb0ae6e2ee973bf8",
        "name": "",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "true"
            },
            {
                "t": "false"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 219,
        "y": 157.9999885559082,
        "wires": [
            [
                "30ba4b55e701d510"
            ],
            [
                "40bce3d55e7b83f1"
            ]
        ]
    },
    {
        "id": "40bce3d55e7b83f1",
        "type": "function",
        "z": "bb0ae6e2ee973bf8",
        "name": "stop",
        "func": "msg = {\n    kill:'SIGHUP',\n    payload : 'SIGHUP'  \n}\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 239,
        "y": 206.9999885559082,
        "wires": [
            [
                "30ba4b55e701d510"
            ]
        ]
    },
    {
        "id": "30ba4b55e701d510",
        "type": "exec",
        "z": "bb0ae6e2ee973bf8",
        "command": " ffmpeg -loglevel quiet -rtsp_transport tcp -i rtsp://10.0.0.152:554/Streaming/Channels/101 -reset_timestamps 1 -an -c:v copy -f mp4 -movflags +frag_keyframe+empty_moov+default_base_moof pipe:1",
        "addpay": false,
        "append": "",
        "useSpawn": "true",
        "timer": "",
        "winHide": false,
        "oldrc": false,
        "name": "Camera",
        "x": 408,
        "y": 177.9999885559082,
        "wires": [
            [
                "066b40f05b1eaeb0"
            ],
            [],
            [
                "066b40f05b1eaeb0"
            ]
        ]
    },
    {
        "id": "a36b32a3eafd508a",
        "type": "debug",
        "z": "bb0ae6e2ee973bf8",
        "name": "debug 2",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 864.6666870117188,
        "y": 159.33333206176758,
        "wires": []
    },
    {
        "id": "066b40f05b1eaeb0",
        "type": "mp4frag",
        "z": "bb0ae6e2ee973bf8",
        "name": "",
        "outputs": 2,
        "basePath": "07a6a2f836edcca1",
        "serveHttp": "false",
        "serveIo": "false",
        "hlsPlaylistSize": "10",
        "hlsPlaylistExtra": "5",
        "autoStart": "true",
        "preBuffer": 1,
        "timeLimit": 10000,
        "repeated": "true",
        "statusData": "playlist",
        "x": 577.6666870117188,
        "y": 131,
        "wires": [
            [
                "a36b32a3eafd508a"
            ],
            [
                "bc8535c8dc20cffe"
            ]
        ]
    },
    {
        "id": "bc8535c8dc20cffe",
        "type": "ui_mp4frag",
        "z": "bb0ae6e2ee973bf8",
        "name": "",
        "group": "8d62c605dcb2294c",
        "order": 0,
        "width": "12",
        "height": "6",
        "readyPoster": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB2aWV3Qm94PSIwIDAgODAwMCA2MDAwIj48dGV4dCBmaWxsPSIjMGYwIiBzdHJva2Utd2lkdGg9IjAiIGR4PSIwIiBkeT0iMCIgZm9udC1mYW1pbHk9IiZxdW90O2UyY3B1d3p4YldsMTo6OlJvYm90byZxdW90OyIgZm9udC1zaXplPSI2MDAiIGZvbnQtd2VpZ2h0PSI3MDAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKCAxMDExLjI0IDMyMDQuODgpIj48dHNwYW4geT0iMCIgc3Ryb2tlLXdpZHRoPSIwIiBmb250LXdlaWdodD0iNzAwIj48IVtDREFUQVsKVmlkZW8gUGxheWJhY2sgUmVhZHkKXV0+PC90c3Bhbj48L3RleHQ+PC9zdmc+Cg==",
        "errorPoster": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB2aWV3Qm94PSIwIDAgODAwMCA2MDAwIj48dGV4dCBmaWxsPSJyZWQiIHN0cm9rZS13aWR0aD0iMCIgZHg9IjAiIGR5PSIwIiBmb250LWZhbWlseT0iJnF1b3Q7ZW42OXdhSUtnN0MxOjo6Um9ib3RvJnF1b3Q7IiBmb250LXNpemU9IjYwMCIgZm9udC13ZWlnaHQ9IjcwMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoIDExODMuOTYgMzIwNC44OCkiPjx0c3BhbiB5PSIwIiBzdHJva2Utd2lkdGg9IjAiIGZvbnQtd2VpZ2h0PSI3MDAiPjwhW0NEQVRBWwpWaWRlbyBQbGF5YmFjayBFcnJvcgpdXT48L3RzcGFuPjwvdGV4dD48L3N2Zz4K",
        "hlsJsConfig": "{\"liveDurationInfinity\":true,\"liveBackBufferLength\":5,\"maxBufferLength\":10,\"manifestLoadingTimeOut\":1000,\"manifestLoadingMaxRetry\":10,\"manifestLoadingRetryDelay\":500}",
        "autoplay": "true",
        "unload": "true",
        "threshold": 0.1,
        "controls": "true",
        "muted": "true",
        "players": [
            "socket.io",
            "hls.js",
            "hls",
            "mp4"
        ],
        "x": 664.6666870117188,
        "y": 196.9999885559082,
        "wires": [
            []
        ]
    },
    {
        "id": "8d62c605dcb2294c",
        "type": "ui_group",
        "name": "Kameras",
        "tab": "7af2d9c8.0a9148",
        "order": 1,
        "disp": true,
        "width": "12",
        "collapse": false,
        "className": ""
    },
    {
        "id": "7af2d9c8.0a9148",
        "type": "ui_tab",
        "name": "RTSP",
        "icon": "dashboard",
        "order": 13,
        "disabled": false,
        "hidden": false
    }
]

I can help, but I need you to first edit your post to properly wrap the flow so that I can copy it.
wrap it with 3 leading and 3 trailing back ticks

```
// the flow data goes here
```

@EIKSEU see that you edited it, but the json data is still malformed. Can you please re-export the flow and paste it again. I still have another hour of free time and we should be able to make it work. Thanks.

edit:

I was able to pick through the json and make your json data good enough to import. Assuming you have ffmpeg installed on your system, the flow should work. I changed a few of the settings that were set to false, which actually turned off the http routes.

[{"id":"17b65c21.7ccc04","type":"inject","z":"733f905b5016c737","name":"Start stream","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":"1","topic":"","payload":"true","payloadType":"bool","x":170,"y":180,"wires":[["f5b5c38a.da9e1"]]},{"id":"f5b5c38a.da9e1","type":"switch","z":"733f905b5016c737","name":"","property":"payload","propertyType":"msg","rules":[{"t":"true"},{"t":"false"}],"checkall":"true","repair":false,"outputs":2,"x":370,"y":120,"wires":[["ff51760d.697c18"],["c50afbe.1105d08"]]},{"id":"276bae27.561f22","type":"inject","z":"733f905b5016c737","name":"Stop stream","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"false","payloadType":"bool","x":161,"y":230.00000190734863,"wires":[["f5b5c38a.da9e1"]]},{"id":"ff51760d.697c18","type":"exec","z":"733f905b5016c737","command":" ffmpeg -loglevel quiet -rtsp_transport tcp -i rtsp://10.0.0.152:554/Streaming/Channels/101 -reset_timestamps 1 -an -c:v copy -f mp4 -movflags +frag_keyframe+empty_moov+default_base_moof pipe:1","addpay":false,"append":"","useSpawn":"true","timer":"","winHide":false,"oldrc":false,"name":"Camera","x":560,"y":240,"wires":[["07a6a2f836edcca1"],[],["07a6a2f836edcca1"]]},{"id":"c50afbe.1105d08","type":"function","z":"733f905b5016c737","name":"stop","func":"msg = {\n    kill:'SIGHUP',\n    payload : 'SIGHUP'  \n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":370,"y":300,"wires":[["ff51760d.697c18"]]},{"id":"07a6a2f836edcca1","type":"mp4frag","z":"733f905b5016c737","name":"","outputs":2,"basePath":"07a6a2f836edcca1","serveHttp":"true","serveIo":"true","hlsPlaylistSize":"10","hlsPlaylistExtra":"5","autoStart":"false","preBuffer":1,"timeLimit":10000,"repeated":"true","statusData":"playlist","x":800,"y":160,"wires":[["763ce6b04f7f7590"],[]]},{"id":"763ce6b04f7f7590","type":"ui_mp4frag","z":"733f905b5016c737","name":"","group":"8d62c605dcb2294c","order":0,"width":"12","height":"6","readyPoster":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB2aWV3Qm94PSIwIDAgODAwMCA2MDAwIj48dGV4dCBmaWxsPSIjMGYwIiBzdHJva2Utd2lkdGg9IjAiIGR4PSIwIiBkeT0iMCIgZm9udC1mYW1pbHk9IiZxdW90O2UyY3B1d3p4YldsMTo6OlJvYm90byZxdW90OyIgZm9udC1zaXplPSI2MDAiIGZvbnQtd2VpZ2h0PSI3MDAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKCAxMDExLjI0IDMyMDQuODgpIj48dHNwYW4geT0iMCIgc3Ryb2tlLXdpZHRoPSIwIiBmb250LXdlaWdodD0iNzAwIj48IVtDREFUQVsKVmlkZW8gUGxheWJhY2sgUmVhZHkKXV0+PC90c3Bhbj48L3RleHQ+PC9zdmc+Cg==","errorPoster":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB2aWV3Qm94PSIwIDAgODAwMCA2MDAwIj48dGV4dCBmaWxsPSJyZWQiIHN0cm9rZS13aWR0aD0iMCIgZHg9IjAiIGR5PSIwIiBmb250LWZhbWlseT0iJnF1b3Q7ZW42OXdhSUtnN0MxOjo6Um9ib3RvJnF1b3Q7IiBmb250LXNpemU9IjYwMCIgZm9udC13ZWlnaHQ9IjcwMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoIDExODMuOTYgMzIwNC44OCkiPjx0c3BhbiB5PSIwIiBzdHJva2Utd2lkdGg9IjAiIGZvbnQtd2VpZ2h0PSI3MDAiPjwhW0NEQVRBWwpWaWRlbyBQbGF5YmFjayBFcnJvcgpdXT48L3RzcGFuPjwvdGV4dD48L3N2Zz4K","hlsJsConfig":"{\"liveDurationInfinity\":true,\"liveBackBufferLength\":5,\"maxBufferLength\":10,\"manifestLoadingTimeOut\":1000,\"manifestLoadingMaxRetry\":10,\"manifestLoadingRetryDelay\":500}","autoplay":"true","unload":"true","threshold":0.1,"controls":"true","muted":"true","players":["socket.io","hls.js","hls","mp4"],"x":870,"y":300,"wires":[[]]},{"id":"8d62c605dcb2294c","type":"ui_group","name":"Kameras","tab":"7af2d9c8.0a9148","order":1,"disp":true,"width":"12","collapse":false,"className":""},{"id":"7af2d9c8.0a9148","type":"ui_tab","name":"RTSP","icon":"dashboard","order":13,"disabled":false,"hidden":false}]

Alright, let's start over.

We have to make sure that ffmpeg is even installed on your system.
run this flow:

[{"id":"a8504db9a56cea79","type":"inject","z":"270f26e6bbe4d8ea","name":"","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":130,"y":180,"wires":[["eda6aa42278054df"]]},{"id":"eda6aa42278054df","type":"exec","z":"270f26e6bbe4d8ea","command":"ffmpeg -version","addpay":"","append":"","useSpawn":"true","timer":"","winHide":false,"oldrc":false,"name":"","x":320,"y":180,"wires":[["d8f1887478fbd735"],[],[]]},{"id":"d8f1887478fbd735","type":"function","z":"270f26e6bbe4d8ea","name":"","func":"msg.payload = msg.payload.toString().split('\\n', 1)[0];\n\nmsg.version = msg.payload.split(' ')[2];\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":180,"wires":[["de434f1506d3dfe9"]]},{"id":"de434f1506d3dfe9","type":"debug","z":"270f26e6bbe4d8ea","name":"","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"version","statusType":"msg","x":720,"y":180,"wires":[]}]

@kevinGodell thanks for your help but unfortunately there is no video output in the ui....ffmpeg is installed do I need to install additional software? The Rstp stream runs normally in the VLC player and I also have packets up to the Mp4frag, but after that there is only one output at the start.

ffmpeg version 4.1.10-0+deb10u1+rpt1 Copyright (c) 2000-2022 the FFmpeg developers

1 Like

I have tweaked your flow a little bit:

[{"id":"b8416415380bc57e","type":"inject","z":"7c2bd0de6bfdae88","name":"Start stream","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":"1","topic":"","payload":"true","payloadType":"bool","x":110,"y":60,"wires":[["c3468873dd3ae24f"]]},{"id":"c3468873dd3ae24f","type":"switch","z":"7c2bd0de6bfdae88","name":"","property":"payload","propertyType":"msg","rules":[{"t":"true"},{"t":"false"}],"checkall":"true","repair":false,"outputs":2,"x":310,"y":100,"wires":[["cd01e94181257e66"],["8a8b572230089aa2"]]},{"id":"aaa076d45bae1328","type":"inject","z":"7c2bd0de6bfdae88","name":"Stop stream","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"false","payloadType":"bool","x":110,"y":140,"wires":[["c3468873dd3ae24f"]]},{"id":"cd01e94181257e66","type":"exec","z":"7c2bd0de6bfdae88","command":" ffmpeg -loglevel error -rtsp_transport tcp -i rtsp://10.0.0.152:554/Streaming/Channels/101 -reset_timestamps 1 -an -c:v copy -f mp4 -movflags +frag_keyframe+empty_moov+default_base_moof pipe:1","addpay":false,"append":"","useSpawn":"true","timer":"","winHide":false,"oldrc":false,"name":"Camera","x":500,"y":60,"wires":[["bb6b829e62674813"],["2a60647176ef9673"],["bb6b829e62674813"]]},{"id":"8a8b572230089aa2","type":"function","z":"7c2bd0de6bfdae88","name":"stop","func":"msg = {\n    kill:'SIGHUP',\n    payload : 'SIGHUP'  \n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":490,"y":140,"wires":[["cd01e94181257e66"]]},{"id":"bb6b829e62674813","type":"mp4frag","z":"7c2bd0de6bfdae88","name":"","outputs":2,"basePath":"id","serveHttp":"true","serveIo":"true","hlsPlaylistSize":"10","hlsPlaylistExtra":"5","autoStart":"false","preBuffer":1,"timeLimit":10000,"repeated":"true","statusData":"playlist","x":770,"y":60,"wires":[["5301cb808261fec3"],[]]},{"id":"2a60647176ef9673","type":"debug","z":"7c2bd0de6bfdae88","name":"ffmpeg stderr","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":720,"y":140,"wires":[]},{"id":"5301cb808261fec3","type":"ui_mp4frag","z":"7c2bd0de6bfdae88","name":"","group":"8d62c605dcb2294c","order":0,"width":"12","height":"6","readyPoster":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB2aWV3Qm94PSIwIDAgODAwMCA2MDAwIj48dGV4dCBmaWxsPSIjMGYwIiBzdHJva2Utd2lkdGg9IjAiIGR4PSIwIiBkeT0iMCIgZm9udC1mYW1pbHk9IiZxdW90O2UyY3B1d3p4YldsMTo6OlJvYm90byZxdW90OyIgZm9udC1zaXplPSI2MDAiIGZvbnQtd2VpZ2h0PSI3MDAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKCAxMDExLjI0IDMyMDQuODgpIj48dHNwYW4geT0iMCIgc3Ryb2tlLXdpZHRoPSIwIiBmb250LXdlaWdodD0iNzAwIj48IVtDREFUQVsKVmlkZW8gUGxheWJhY2sgUmVhZHkKXV0+PC90c3Bhbj48L3RleHQ+PC9zdmc+Cg==","errorPoster":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB2aWV3Qm94PSIwIDAgODAwMCA2MDAwIj48dGV4dCBmaWxsPSJyZWQiIHN0cm9rZS13aWR0aD0iMCIgZHg9IjAiIGR5PSIwIiBmb250LWZhbWlseT0iJnF1b3Q7ZW42OXdhSUtnN0MxOjo6Um9ib3RvJnF1b3Q7IiBmb250LXNpemU9IjYwMCIgZm9udC13ZWlnaHQ9IjcwMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoIDExODMuOTYgMzIwNC44OCkiPjx0c3BhbiB5PSIwIiBzdHJva2Utd2lkdGg9IjAiIGZvbnQtd2VpZ2h0PSI3MDAiPjwhW0NEQVRBWwpWaWRlbyBQbGF5YmFjayBFcnJvcgpdXT48L3RzcGFuPjwvdGV4dD48L3N2Zz4K","hlsJsConfig":"{\"liveDurationInfinity\":true,\"liveBackBufferLength\":5,\"maxBufferLength\":10,\"manifestLoadingTimeOut\":1000,\"manifestLoadingMaxRetry\":10,\"manifestLoadingRetryDelay\":500}","autoplay":"true","unload":"true","threshold":0.1,"controls":"true","muted":"true","players":["socket.io","hls.js","hls","mp4"],"x":1050,"y":60,"wires":[[]]},{"id":"8d62c605dcb2294c","type":"ui_group","name":"Kameras","tab":"7af2d9c8.0a9148","order":1,"disp":true,"width":"12","collapse":false,"className":""},{"id":"7af2d9c8.0a9148","type":"ui_tab","name":"RTSP","icon":"dashboard","order":13,"disabled":false,"hidden":false}]

A few settings had to be changed and some wires moved. Now, if your ffmpeg command is correct, then the exec node's status should have a pid and the mp4frag node's status should turn green after receiving the first segment and maybe look a little like this.


Thank you for your effort..... unfortunately no output in the ui ....... wish you a happy new year 2023

Well, the good news is that your screenshot shows that the flow loaded ok. Can you post another screenshot of the node-red-dashboard where you have the ui_mp4frag widget loaded? If the video element is not playing the mp4 video in your browser, then we may have to troubleshoot your browser and see if it is compatible.

Happy new year to you. May your new year be filled with streaming video.

1 Like

Hello and happy new year,
Thank you for your help so far. I have now found out that the mp4 run under ip:1880/ui. However, I have the whole thing running on my own apacheconf, so the playback isn't running... do you have any info on what I have to set in the config to get it working?
Kind regards

Unfortunately, I have no experience with apache. I didn't even know it was possible to run a node.js application with it. But I ran a quick search and found this link that suggests it might be possible Configuring Apache for Node.js - LogRocket Blog.

I would suggest that you open a new thread titled "How to run node-red with apache?" and maybe you will get the attention of somebody that has done this. Please include as much info as you can, such as apache version, node.js version, operating system, etc.

Hi @kevinGodell ,
I just noticed this novelty when I wanted to update my packages. So if I summarize it is necessary to do, for those who have the old node-red-contrib-mp4frag:

cd ~/.node-red
npm install kevinGodell/node-red-contrib-ffmpeg-spawn

npm install kevinGodell/node-red-contrib-mp4frag DON'T USE IT : END OF SERVICE !!

npm uninstall node-red-contrib-mp4frag
npm install @kevingodell/node-red-mp4frag
npm install kevinGodell/node-red-contrib-ui-mp4frag

Which give :

@kevingodell/node-red-ffmpeg@0.1.1-beta.3       17 jan 2023
@kevingodell/node-red-mp4frag@0.1.1-beta.1      17 jan 2023
@kevingodell/node-red-ui-mp4frag@0.1.1-beta.1   17 jan 2023

I'm right ? the old ones stay ?

I cant remember exactly, but some had the repo named changed. GitHub will automatically forward from the old name to the new name unless you reuse the old repo name. I tried to leave some of it available for anybody using the old test versions. Currently, I would recommend only using the published versions which should be available through the pallette installer built in to node-red. The old packages would probably have to be uninstalled with npm first.

Just to be clear, the 4 nodes that I had worked on were all published and added to the flows section Library - Node-RED

ah great, it's better to go through the palette since the time I've been waiting for this :wink:

Yeah, sorry it took so long. I was never very satisfied with my code, but at some point I decided it was good enough for publishing.

2 Likes

Better late than never :slightly_smiling_face:
I'll finish on this: we had to add a CSS to the <head> site section Dashboard so that the video is not stretched / crushed:

<style>
  .ui-mp4frag-video {
    object-fit: contain !important;
    /*object-fit: scale-down !important;*/
  }
</style>

https://discourse.nodered.org/t/beta-testing-nodes-for-live-streaming-mp4/33743/293?u=superninja

Is it still necessary or did you integrate it into the latest ui-mp4frag?

Adding a dashboard template set as "head" is still necessary to override the default class styles. I have not put any extra dev time into ui-mp4frag since it is my least favorite node and probably doesn't really need to exist since it really could just be built as a regular template node. There is one more feature that I might add and that is for being able to dynamically set the poster image to better integrate it with my pipe2jpeg node.

1 Like