Merge pull request #1215 from shogo4405/feature/Improved-compatibility-rtmp

Improved RTMPDataMessage.
This commit is contained in:
shogo4405 2023-06-08 00:24:48 +09:00 committed by GitHub
commit 0d3e7b7572
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 7 deletions

View File

@ -40,6 +40,7 @@ final class RTMPChunk {
case command = 0x03
case audio = 0x04
case video = 0x05
case data = 0x08
}
static let defaultSize: Int = 128

View File

@ -413,11 +413,12 @@ final class RTMPDataMessage: RTMPMessage {
super.init(type: objectEncoding.dataType)
}
init(streamId: UInt32, objectEncoding: RTMPObjectEncoding, handlerName: String, arguments: [Any?] = []) {
init(streamId: UInt32, objectEncoding: RTMPObjectEncoding, timestamp: UInt32, handlerName: String, arguments: [Any?] = []) {
self.objectEncoding = objectEncoding
self.handlerName = handlerName
self.arguments = arguments
super.init(type: objectEncoding.dataType)
self.timestamp = timestamp
self.streamId = streamId
}

View File

@ -234,6 +234,15 @@ open class RTMPStream: NetStream {
self.hasAudio = self.pausedStatus.hasAudio
self.hasVideo = self.pausedStatus.hasVideo
}
case .play, .playing:
self.rtmpConnection?.socket.doOutput(chunk: RTMPChunk(message: RTMPCommandMessage(
streamId: self.id,
transactionId: 0,
objectEncoding: self.objectEncoding,
commandName: "pause",
commandObject: nil,
arguments: [self.paused, floor(self.startedAt.timeIntervalSinceNow * -1000)]
)))
default:
break
}
@ -255,12 +264,14 @@ open class RTMPStream: NetStream {
var videoTimestampZero: Double = -1.0
private let muxer = RTMPMuxer()
private var messages: [RTMPCommandMessage] = []
private var startedAt = Date()
private var frameCount: UInt16 = 0
private var dispatcher: (any EventDispatcherConvertible)!
private var audioWasSent = false
private var videoWasSent = false
private var pausedStatus = PausedStatus(hasAudio: false, hasVideo: false)
private var howToPublish: RTMPStream.HowToPublish = .live
private var dataTimeStamps: [String: Date] = .init()
private weak var rtmpConnection: RTMPConnection?
/// Creates a new stream.
@ -386,12 +397,20 @@ open class RTMPStream: NetStream {
guard let rtmpConnection = self.rtmpConnection, self.readyState == .publishing else {
return
}
let length = rtmpConnection.socket.doOutput(chunk: RTMPChunk(message: RTMPDataMessage(
streamId: self.id,
objectEncoding: self.objectEncoding,
handlerName: handlerName,
arguments: arguments
)))
let dataWasSent = self.dataTimeStamps[handlerName] == nil ? false : true
let timestmap: UInt32 = dataWasSent ? UInt32((self.dataTimeStamps[handlerName]?.timeIntervalSinceNow ?? 0) * -1000) : UInt32(self.startedAt.timeIntervalSinceNow * -1000)
let chunk = RTMPChunk(
type: dataWasSent ? RTMPChunkType.one : RTMPChunkType.zero,
streamId: RTMPChunk.StreamID.data.rawValue,
message: RTMPDataMessage(
streamId: self.id,
objectEncoding: self.objectEncoding,
timestamp: timestmap,
handlerName: handlerName,
arguments: arguments
))
let length = rtmpConnection.socket.doOutput(chunk: chunk)
self.dataTimeStamps[handlerName] = .init()
self.info.byteCount.mutate { $0 += Int64(length) }
}
}
@ -487,6 +506,7 @@ open class RTMPStream: NetStream {
}
messages.removeAll()
case .play:
startedAt = .init()
videoTimestamp = 0
videoTimestampZero = -1.0
audioTimestamp = 0
@ -494,11 +514,13 @@ open class RTMPStream: NetStream {
mixer.delegate = self
mixer.startDecoding()
case .publish:
startedAt = .init()
muxer.dispose()
muxer.delegate = self
mixer.startRunning()
videoWasSent = false
audioWasSent = false
dataTimeStamps.removeAll()
FCPublish()
case .publishing:
send(handlerName: "@setDataFrame", arguments: "onMetaData", createMetaData())