Closed omochi closed 4 years ago
差し支えなければ以下の2点が知りたいです。
ありがとうございます、明日金曜日に回答します。
RTMPのサーバ名
問い合わせていますが、もしかしたら回答できないかもしれません。
補足になるかもしれないので、VLCプレイヤーのメディア情報ウィンドウの表示を添付します。
先頭バイト
下記のようにコードを書き換えて、先頭64バイトをダンプしました。 出力されたログを添付します。 (この状態にするとメモリリークが生じるため、10秒ほど経過するとクラッシュします)
override func execute(_ connection: RTMPConnection, type: RTMPChunkType) {
guard let stream: RTMPStream = connection.streams[streamId] else {
return
}
OSAtomicAdd64(Int64(payload.count), &stream.info.byteCount)
guard codec.isSupported else {
return
}
switch type {
case .zero:
stream.audioTimestamp = Double(timestamp)
default:
stream.audioTimestamp += Double(timestamp)
}
let packetType = FLVAACPacketType(rawValue: payload[1])
let dataStr = dumpData(payload.subdata(in: 0..<min(64, payload.count)))
let now = Date()
let fmt = DateFormatter()
fmt.dateFormat = "HH:mm:ss.SSS"
fmt.locale = Locale(identifier: "en_US_POSIX")
fmt.timeZone = TimeZone(abbreviation: "JST")!
let nowStr = fmt.string(from: now)
print("[\(nowStr)] \(payload.count) bytes")
print(dataStr)
switch FLVAACPacketType(rawValue: payload[1]) {
case .seq?:
let config = AudioSpecificConfig(bytes: [UInt8](payload[codec.headerSize..<payload.count]))
stream.mixer.audioIO.encoder.destination = .PCM
stream.mixer.audioIO.encoder.inSourceFormat = config?.audioStreamBasicDescription()
case .raw?:
break
// payload.withUnsafeMutableBytes { (buffer: UnsafeMutableRawBufferPointer) -> Void in
// stream.mixer.audioIO.encoder.encodeBytes(buffer.baseAddress?.advanced(by: codec.headerSize), count: payload.count - codec.headerSize, presentationTimeStamp: CMTime(seconds: stream.audioTimestamp / 1000, preferredTimescale: 1000))
// }
case .none:
break
}
}
@omochi dump結果ありがとうございました。以下のbranchで改善するとは思います。 https://github.com/shogo4405/HaishinKit.swift/compare/fix-issues-618
@shogo4405 早急な対応ありがとうございます! 上記ブランチを使用したところ、クラッシュしなくなり、音声が再生されるようになりました。
配信側のサーバーソフトウェアですが下記のものとのことです。
nginxにnginx-rtmp-moduleを組み込んだもの
さて、音声は再生されるようになったのですが、画像が表示されない問題があり、困っております。
iOS 13.0 と iOS 13.2.3 の実デバイスにて、GLHKViewを使用しています。 音声は再生されているけれど、画像は表示されず真っ黒のままです。
試しにsetNeedsDisplay()
を繰り返し呼んでみたところ、
1度だけ画像が表示されるようになりました。
setNeedsDisplay
を呼び出すたびに、
public func glkView(_ view: GLKView, drawIn rect: CGRect)
が呼びだされています。
一方、func draw(image: CIImage)
が、1度しか呼び出されません。
また、これの呼び出しの瞬間に画像が表示されるようです。
nginxにnginx-rtmp-moduleを組み込んだもの
この情報で僕の方でデバッグ可能になりました。ありがとうございます。 ただ改善するには時間がかかりそうで年末年始の空き時間を利用してとなりそうです。
フィードバックありがとうございましたmm
ありがとうございます。
現状のmaster
ブランチで、nginx + rtmp module で視聴できるようになりました。
音声がない mp4。音声有りの mp4。および、HaishinKit経由での配信の視聴で確認しております。
Describe the bug
iOSアプリにおいて、 下記コードにてRTMP再生をしたところクラッシュしてしまいました。
<host>
と<name>
の部分は実際には有効な値が入っています。 また、このRTMPStreamはVLCプレイヤーでは再生できる事を確認しています。To Reproduce
すみません、機密のためこのURLを共有できません。
Expected behavior
クラッシュしないで再生できる
Screenshots
なし
Smartphone (please complete the following information):
Additional context
クラッシュは、
AudioConverter.swift
のconvert
メソッドの内部で呼ばれた、inDestinationFormat
プロパティのget
アクセサの内部で生じます。上記のコードにおいて、
destination.audioStreamBasicDescription
からnil
が返り、CMAudioFormatDescriptionCreate
に_inDestinationFormat
を渡すところのforce unwrapに失敗するようでした。挙動を調べたところ、
audioStreamBasicDescription
がnil
を返す理由は、inSourceFormat
がnil
を返すためでした。また、関係あるかどうかわかりませんが、
RTMPMessage.swift
のRTMPAudioMessage
クラスのexecute
メソッドを監視したところ、下記のコードにおいて、今回のRTMPストリームは
case .raw?:
のフローにしか処理が遷移していませんでした。実装が期待している挙動は、
.seq
のFLVAACPacket
が、.raw
のパケットよりも先に受信されることで、inSourceFormat
がセットされる挙動なのかなと考えましたが、 これ以上はRTMPプロトコルについての知識がないため、手が出ませんでした。対応する上で情報が足りていないかもしれませんが、 もし可能なら修正していただけると嬉しいです。