liveVideo = await createLiveWrapper()
- const command = sendRTMPStream(rtmpUrl + '/bad-live', liveVideo.streamKey)
+ const command = sendRTMPStream({ rtmpBaseUrl: rtmpUrl + '/bad-live', streamKey: liveVideo.streamKey })
await testFfmpegStreamError(command, true)
})
it('Should not allow a stream without the appropriate stream key', async function () {
this.timeout(60000)
- const command = sendRTMPStream(rtmpUrl + '/live', 'bad-stream-key')
+ const command = sendRTMPStream({ rtmpBaseUrl: rtmpUrl + '/live', streamKey: 'bad-stream-key' })
await testFfmpegStreamError(command, true)
})
it('Should succeed with the correct params', async function () {
this.timeout(60000)
- const command = sendRTMPStream(rtmpUrl + '/live', liveVideo.streamKey)
+ const command = sendRTMPStream({ rtmpBaseUrl: rtmpUrl + '/live', streamKey: liveVideo.streamKey })
await testFfmpegStreamError(command, false)
})
await servers[0].blacklist.add({ videoId: liveVideo.uuid })
- const command = sendRTMPStream(rtmpUrl + '/live', liveVideo.streamKey)
+ const command = sendRTMPStream({ rtmpBaseUrl: rtmpUrl + '/live', streamKey: liveVideo.streamKey })
await testFfmpegStreamError(command, true)
})
await servers[0].videos.remove({ id: liveVideo.uuid })
- const command = sendRTMPStream(rtmpUrl + '/live', liveVideo.streamKey)
+ const command = sendRTMPStream({ rtmpBaseUrl: rtmpUrl + '/live', streamKey: liveVideo.streamKey })
await testFfmpegStreamError(command, true)
})
})
})
it('Should enable transcoding without additional resolutions', async function () {
- this.timeout(60000)
+ this.timeout(120000)
liveVideoId = await createLiveWrapper(false)
})
it('Should enable transcoding with some resolutions', async function () {
- this.timeout(60000)
+ this.timeout(120000)
const resolutions = [ 240, 480 ]
await updateConf(resolutions)
await stopFfmpeg(ffmpegCommand)
})
+ it('Should correctly set the appropriate bitrate depending on the input', async function () {
+ this.timeout(120000)
+
+ liveVideoId = await createLiveWrapper(false)
+
+ const ffmpegCommand = await commands[0].sendRTMPStreamInVideo({
+ videoId: liveVideoId,
+ fixtureName: 'video_short.mp4',
+ copyCodecs: true
+ })
+ await waitUntilLivePublishedOnAllServers(servers, liveVideoId)
+ await waitJobs(servers)
+
+ const video = await servers[0].videos.get({ id: liveVideoId })
+
+ const masterPlaylist = video.streamingPlaylists[0].playlistUrl
+ const probe = await ffprobePromise(masterPlaylist)
+
+ const bitrates = probe.streams.map(s => parseInt(s.tags.variant_bitrate))
+ for (const bitrate of bitrates) {
+ expect(bitrate).to.exist
+ expect(isNaN(bitrate)).to.be.false
+ expect(bitrate).to.be.below(61_000_000) // video_short.mp4 bitrate
+ }
+
+ await stopFfmpeg(ffmpegCommand)
+ })
+
it('Should enable transcoding with some resolutions and correctly save them', async function () {
this.timeout(200000)
await waitUntilLivePublishedOnAllServers(servers, liveVideoId)
- const bitrateLimits = {
- 720: 5000 * 1000, // 60FPS
- 360: 1100 * 1000,
- 240: 600 * 1000
+ const maxBitrateLimits = {
+ 720: 6500 * 1000, // 60FPS
+ 360: 1250 * 1000,
+ 240: 700 * 1000
+ }
+
+ const minBitrateLimits = {
+ 720: 5500 * 1000,
+ 360: 1000 * 1000,
+ 240: 550 * 1000
}
for (const server of servers) {
const probe = await ffprobePromise(segmentPath)
const videoStream = await getVideoStreamFromFile(segmentPath, probe)
- expect(probe.format.bit_rate).to.be.below(bitrateLimits[videoStream.height])
+ expect(probe.format.bit_rate).to.be.below(maxBitrateLimits[videoStream.height])
+ expect(probe.format.bit_rate).to.be.at.least(minBitrateLimits[videoStream.height])
await makeRawRequest(file.torrentUrl, HttpStatusCode.OK_200)
await makeRawRequest(file.fileUrl, HttpStatusCode.OK_200)