Open Sina-KH opened 12 months ago
I've added logType: 4
to config and after checking FFmpeg logs and the flows, I found that the problem was that fission was not working correctly.
To solve the problem, I added -threads 1
to fission's ffmpeg command. A quick workaround can be forking the project and adding '-threads', '1'
to the argv
array in the node_fission_session.js
file.
I'm not aware what causes this issue on my machines yet, because the hardwares were totally similar!
@Sina-KH I had the same problem on M1 Max and solved it by brew install ffmpeg
which installed v6 and then used:
ffmpeg: process.env.FFMPEG_PATH || '/opt/homebrew/Cellar/ffmpeg/6.0/bin/ffmpeg'
as the path.
Now fission folders and files are created, but they still do not fuse in the main index.m3u8.
Any ideas why or is this behaviour correct and I need to change the stream on the client side player?
const NodeMediaServer = require('node-media-server');
const config = {
logType: 4,
rtmp: {
port: 1935,
chunk_size: 100,
gop_cache: false,
ping: 30,
ping_timeout: 60,
},
http: {
port: 8000,
mediaroot: __dirname+'/media',
webroot: __dirname+'/www',
allow_origin: '*',
api: true
},
fission: {
ffmpeg: process.env.FFMPEG_PATH || '/opt/homebrew/Cellar/ffmpeg/6.0/bin/ffmpeg',
tasks: [
{
rule: "live/*",
model: [
{
ab: "128k",
vb: "3500k",
vs: "1920x1080",
vf: "30",
},
{
ab: "128k",
vb: "1500k",
vs: "1280x720",
vf: "30",
}
]
},
]
},
trans: {
ffmpeg: process.env.FFMPEG_PATH || '/opt/homebrew/Cellar/ffmpeg/6.0/bin/ffmpeg',
tasks: [
{
app: 'live',
vc: "copy",
ac: "copy",
hls: true,
hlsFlags: '[hls_time=1:hls_list_size=3:hls_flags=delete_segments]',
mp4: true,
mp4Flags: '[movflags=frag_keyframe+empty_moov]',
},
]
},
};
const nms = new NodeMediaServer(config);
nms.run();
Also I noticed that the main incoming stream does not have a resolution. Maybe that plays a role:
@Sina-KH I had the same problem on M1 Max and solved it by
brew install ffmpeg
which installed v6 and then used:ffmpeg: process.env.FFMPEG_PATH || '/opt/homebrew/Cellar/ffmpeg/6.0/bin/ffmpeg'
as the path.Now fission folders and files are created, but they still do not fuse in the main index.m3u8.
Any ideas why or is this behaviour correct and I need to change the stream on the client side player?
const NodeMediaServer = require('node-media-server'); const config = { logType: 4, rtmp: { port: 1935, chunk_size: 100, gop_cache: false, ping: 30, ping_timeout: 60, }, http: { port: 8000, mediaroot: __dirname+'/media', webroot: __dirname+'/www', allow_origin: '*', api: true }, fission: { ffmpeg: process.env.FFMPEG_PATH || '/opt/homebrew/Cellar/ffmpeg/6.0/bin/ffmpeg', tasks: [ { rule: "live/*", model: [ { ab: "128k", vb: "3500k", vs: "1920x1080", vf: "30", }, { ab: "128k", vb: "1500k", vs: "1280x720", vf: "30", } ] }, ] }, trans: { ffmpeg: process.env.FFMPEG_PATH || '/opt/homebrew/Cellar/ffmpeg/6.0/bin/ffmpeg', tasks: [ { app: 'live', vc: "copy", ac: "copy", hls: true, hlsFlags: '[hls_time=1:hls_list_size=3:hls_flags=delete_segments]', mp4: true, mp4Flags: '[movflags=frag_keyframe+empty_moov]', }, ] }, }; const nms = new NodeMediaServer(config); nms.run();
Also I noticed that the main incoming stream does not have a resolution. Maybe that plays a role:
Did you try hlsKeep: true
to prevent hls file delete after end of the stream?
And did you change node_fission_session.js
to have -threads 4
(4 is number of required threads) as I've mentioned?
@Sina-KH, yes but maybe I'm missing something. My solution was to create a custom master.m3u8 and link the streams through it:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=1500000,RESOLUTION=1280x720
stream_720/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3500000,RESOLUTION=1920x1080
stream/index.m3u8
Did you manage to fuse the fission's m3u8 on your main stream? if so can you please paste here the output as to know what to expect?
Also do you have size
on your main stream or is it 0x0?
I have a feeling it has to do with the ffmpeg version...
@cliqer
Exactly, I've created the primary .m3u8 file just like you did.
In the node_fission_session.js
file, change line 23 to:
let outPath = ['-threads', '4', '-f', 'flv', 'rtmp://127.0.0.1:' + this.conf.rtmpPort + '/' + this.conf.streamApp + '/' + this.conf.streamName + '_' + m.vs.split('x')[1]];
And 4
is the number of threads. (maybe you can try adding this flag to line 19 and it work, also.)
I have no idea about your problem (size issue you mentioned) but with these changes my stream is working fine.
It also worth mentioning that the main hls output did not respect hls_time I passed to its flags, so I had to use fission and recreate my original resolution hls, also.
hi, I have tried on react-native-nodemediaclient version 0.3.3 here
<NodePublisher ref={np} style={{flex: 1}} url={url} audioParam={{ codecid: NodePublisher.NMC_CODEC_ID_AAC, profile: NodePublisher.NMC_PROFILE_AUTO, samplerate: 48000, channels: 1, bitrate: 64 * 1000, }} videoParam={{ codecid: NodePublisher.NMC_CODEC_ID_H264, profile: NodePublisher.NMC_PROFILE_AUTO, width: 720, height: 1280, fps: 30, bitrate: 2000 * 1000, }} frontCamera={frontCamera} HWAccelEnable={true} denoiseEnable={true} torchEnable={torchEnable} keyFrameInterval={2} volume={mute ? 0.0 : 1.0} videoOrientation={ NodePublisher.VIDEO_ORIENTATION_PORTRAIT }/>
but when I look at the log in the nodemediaserver "handle video" section, I see the video dimensions are 0x0 so when I play the video in VLC the result is only sound.
[rtmp publish] Handle video. id=CRO7UOB1 streamPath=/live/genta-F2WKcWWJ frame_type=1 codec_id=7 codec_name=H264 0x0
Meanwhile, if I comment HWAccelEnable it will be read.
[rtmp publish] Handle video. id=UJUN7E6K streamPath=/live/genta-F2WKcWWJ frame_type=1 codec_id=7 codec_name=H264 720x1280
but there is a new problem, I can't play it on Android with hls extenston with error message:
{"errorException": "com.google.android.exoplayer2.ExoPlaybackException: MediaCodecVideoRenderer error, index=0, format=Format(0, null, null, video/avc, avc1.7A001F, -1, null, [720, 1280, -1.0], [-1, -1]), format_supported=NO_EXCEEDS_CAPABILITIES", "errorString": "ExoPlaybackException type : 1"}
what do you think is wrong?
Hi. Thanks for your great library.
I've configured nms on 2 of my test servers and it works great, but when I'm trying to make it work on production, it creates directories for different qualities, but does not generate .ts and .m3u8 for them. It only creates original hls outputs. My logs show that instantly after
[rtmp publish] Handle video.
and[rtmp publish] Handle audio.
files, it receives[rtmp publish] Close stream. id=Y8KK9U3D streamPath=/live/15_1280 streamId=1
and[rtmp play] Close stream. id=7MC9Q65N streamPath=/live/15_1280 streamId=1
Please note that everything is the same on my test and prod servers, and with no known cause, it fails on some of my servers and works on some other ones. I've tried both deploying dockerized and not dockerized versions, with different node versions. FFMPEG version is also the same on all systems.My configs:
and logs: