This commit is contained in:
shogo4405 2016-12-13 02:39:34 +09:00
parent 523b92f401
commit 935b798bb1
20 changed files with 147 additions and 81 deletions

View File

@ -2,15 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>CFBundleDisplayName</key>
<string>lf</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>HaishinKit</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@ -25,6 +20,11 @@
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>

View File

@ -3,14 +3,18 @@ import Foundation
import ReplayKit
class MovieClipHandler: RTMPMP4ClipHandler {
override func updateServiceInfo(_ serviceInfo: [String : NSCoding & NSObjectProtocol]) {
print("updateServiceInfo:\(serviceInfo)")
}
override func processMP4Clip(with mp4ClipURL: URL?, setupInfo: [String : NSObject]?, finished: Bool) {
print("\(mp4ClipURL):\(setupInfo):\(finished)")
print("processMP4Clip:\(mp4ClipURL):\(setupInfo):\(finished)")
super.processMP4Clip(with: mp4ClipURL, setupInfo: setupInfo, finished: finished)
}
override func finishedProcessingMP4Clip(withUpdatedBroadcastConfiguration broadcastConfiguration: RPBroadcastConfiguration?, error: Error?) {
print("\(broadcastConfiguration):\(error)")
print("finishedProcessingMP4Clip:\(broadcastConfiguration):\(error)")
super.finishedProcessingMP4Clip(withUpdatedBroadcastConfiguration: broadcastConfiguration, error: error)
}
}

View File

@ -22,14 +22,35 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="rtmp://192.168.179.3:1935/live" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="GKU-M2-aRK">
<rect key="frame" x="16" y="60" width="222" height="30"/>
<rect key="frame" x="16" y="46" width="222" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="live" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="FrD-a4-wQl" userLabel="Stream name Field">
<rect key="frame" x="16" y="108" width="222" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="RTMP URL" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rw5-gU-PHU">
<rect key="frame" x="16" y="20" width="83" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Stream name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="r73-xK-C6s">
<rect key="frame" x="16" y="82" width="102" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="4nz-OC-sf0">
<rect key="frame" x="252" y="59" width="34" height="30"/>
<rect key="frame" x="254" y="46" width="34" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Start"/>
</button>
@ -41,6 +62,7 @@
<connections>
<outlet property="endpointURLField" destination="GKU-M2-aRK" id="mGY-Jv-ucw"/>
<outlet property="startButton" destination="4nz-OC-sf0" id="vuY-tv-8xP"/>
<outlet property="streamNameField" destination="FrD-a4-wQl" id="yqx-kD-CtB"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="X47-rx-isc" userLabel="First Responder" sceneMemberID="firstResponder"/>

View File

@ -6,6 +6,9 @@ class BroadcastViewController: UIViewController {
@IBOutlet
var endpointURLField:UITextField!
@IBOutlet
var streamNameField:UITextField!
override func viewDidLoad() {
super.viewDidLoad()
@ -16,9 +19,11 @@ class BroadcastViewController: UIViewController {
let broadcastURL:URL = URL(string: endpointURLField.text!)!
let streamName:String = streamNameField.text!
let endpointURL:String = endpointURLField.text!
let setupInfo: [String: NSCoding & NSObjectProtocol] = [
"endpointURL" : endpointURL as NSString
"endpointURL" : endpointURL as NSString,
"streamName" : streamName as NSString,
]
let broadcastConfiguration:RPBroadcastConfiguration = RPBroadcastConfiguration()

View File

@ -5,7 +5,7 @@
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>HaishinKit</string>
<string>lf</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>

View File

@ -1,3 +1,4 @@
import UIKit
import Foundation
import AVFoundation

View File

@ -5,6 +5,8 @@ import Foundation
public class RTMPBroadcaster: RTMPConnection {
static let `default`:RTMPBroadcaster = RTMPBroadcaster()
public var streamName:String? = nil
private var stream:RTMPStream!
private var connecting:Bool = false
private let lockQueue:DispatchQueue = DispatchQueue(label: "com.github.shogo4405.lf.RTMPBroadcaster.lock")
@ -25,28 +27,32 @@ public class RTMPBroadcaster: RTMPConnection {
}
override public func close() {
connecting = false
super.close()
lockQueue.sync {
self.connecting = false
super.close()
}
}
func processMP4Clip(mp4ClipURL: URL?, completionHandler: MP4Sampler.Handler) {
func processMP4Clip(mp4ClipURL: URL?, completionHandler: MP4Sampler.Handler? = nil) {
guard let url:URL = mp4ClipURL else {
completionHandler()
completionHandler?()
return
}
stream.appendFile(url)
completionHandler()
stream.appendFile(url, completionHandler: completionHandler)
}
override func on(status:Notification) {
super.on(status: status)
let e:Event = Event.from(status)
guard let data:ASObject = e.data as? ASObject, let code:String = data["code"] as? String else {
guard
let data:ASObject = e.data as? ASObject,
let code:String = data["code"] as? String,
let streamName:String = streamName else {
return
}
switch code {
case RTMPConnection.Code.connectSuccess.rawValue:
stream.publish("live")
stream.publish(streamName)
default:
break
}
@ -61,14 +67,24 @@ open class RTMPMP4ClipHandler: RPBroadcastMP4ClipHandler {
}
override open func processMP4Clip(with mp4ClipURL: URL?, setupInfo: [String : NSObject]?, finished: Bool) {
guard let endpointURL:String = setupInfo?["endpointURL"] as? String else {
guard
let endpointURL:String = setupInfo?["endpointURL"] as? String,
let streamName:String = setupInfo?["streamName"] as? String else {
return
}
RTMPBroadcaster.default.streamName = streamName
RTMPBroadcaster.default.connect(endpointURL, arguments: nil)
RTMPBroadcaster.default.processMP4Clip(mp4ClipURL: mp4ClipURL) {_ in
if (finished) {
RTMPBroadcaster.default.close()
if (finished) {
RTMPBroadcaster.default.processMP4Clip(mp4ClipURL: mp4ClipURL) {_ in
if (finished) {
RTMPBroadcaster.default.close()
}
}
return
}
RTMPBroadcaster.default.processMP4Clip(mp4ClipURL: mp4ClipURL)
}
override open func finishedProcessingMP4Clip(withUpdatedBroadcastConfiguration broadcastConfiguration: RPBroadcastConfiguration?, error: Error?) {
}
}

View File

@ -574,7 +574,7 @@ final class MP4Reader: MP4ContainerBox {
// MARK: -
final class MP4TrakReader {
static let defaultBufferTime:Double = 1000
static let defaultBufferTime:Double = 500
var trak:MP4Box
var bufferTime:Double = MP4TrakReader.defaultBufferTime
@ -661,13 +661,13 @@ final class MP4TrakReader {
}
}
}
totalTimeToSample = timeToSample[cursor]
}
func execute(url:URL) {
do {
reader = try FileHandle(forReadingFrom: url)
timerDriver.interval = MachUtil.nanosToAbs(UInt64(currentTimeToSample * 1000 * 1000))
while (currentDuration <= bufferTime) {
tick(timerDriver)
}

View File

@ -14,7 +14,8 @@ class MP4Sampler {
weak var delegate:MP4SamplerDelegate?
fileprivate(set) var running:Bool = false
fileprivate var files:[URL:Handler?] = [:]
fileprivate var files:[URL] = []
fileprivate var handlers:[URL:Handler?] = [:]
fileprivate let lockQueue:DispatchQueue = DispatchQueue(label: "com.github.shogo4405.lf.MP4Sampler.lock")
fileprivate let loopQueue:DispatchQueue = DispatchQueue(label: "com.github.shgoo4405.lf.MP4Sampler.loop")
fileprivate let operations:OperationQueue = OperationQueue()
@ -24,7 +25,8 @@ class MP4Sampler {
func appendFile(_ file:URL, completionHandler: Handler? = nil) {
lockQueue.async {
self.files[file] = completionHandler
self.files.append(file)
self.handlers[file] = completionHandler
}
}
@ -54,10 +56,10 @@ class MP4Sampler {
}
}
for i in 0..<trakReaders.count {
for reader in trakReaders {
reader.delegate = delegate
operations.addOperation {
self.trakReaders[i].delegate = self.delegate
self.trakReaders[i].execute(url: url)
reader.execute(url: url)
}
}
operations.waitUntilAllOperationsAreFinished()
@ -69,7 +71,10 @@ class MP4Sampler {
if (files.isEmpty) {
return
}
let (key: url, value: handler) = files.popFirst()!
let url:URL = files.first!
let handler:Handler? = handlers[url]!
files.remove(at: 0)
handlers[url] = nil
execute(url: url)
handler?()
}

View File

@ -1,3 +1,7 @@
#if os(iOS)
import UIKit
#endif
import CoreImage
import Foundation
import AVFoundation

View File

@ -13,14 +13,12 @@ final class RTMPMuxer {
weak var delegate:RTMPMuxerDelegate? = nil
fileprivate var avcC:Data?
fileprivate var audioDecorderSpecificConfig:Data?
fileprivate var timestamps:[Int:Double] = [:]
fileprivate var audioTimestamp:CMTime = kCMTimeZero
fileprivate var videoTimestamp:CMTime = kCMTimeZero
func dispose() {
avcC = nil
audioDecorderSpecificConfig = nil
timestamps.removeAll()
audioTimestamp = kCMTimeZero
videoTimestamp = kCMTimeZero
}
@ -127,21 +125,19 @@ extension RTMPMuxer: MP4SamplerDelegate {
}
func output(data:Data, withType:Int, currentTime:Double, keyframe:Bool) {
let delta:Double = (timestamps[withType] == nil) ? 0 : timestamps[withType]!
switch withType {
case 0:
let compositionTime:Int32 = 0
var buffer:Data = Data([((keyframe ? FLVFrameType.key.rawValue : FLVFrameType.inter.rawValue) << 4) | FLVVideoCodec.avc.rawValue, FLVAVCPacketType.nal.rawValue])
buffer.append(contentsOf: compositionTime.bigEndian.bytes[1..<4])
buffer.append(data)
delegate?.sampleOutput(video: buffer, withTimestamp: delta, muxer: self)
delegate?.sampleOutput(video: buffer, withTimestamp: currentTime, muxer: self)
case 1:
var buffer:Data = Data([RTMPMuxer.aac, FLVAACPacketType.raw.rawValue])
buffer.append(data)
delegate?.sampleOutput(audio: buffer, withTimestamp: delta, muxer: self)
delegate?.sampleOutput(audio: buffer, withTimestamp: currentTime, muxer: self)
default:
break
}
timestamps[withType] = currentTime
}
}

View File

@ -74,9 +74,14 @@ final class RTMPSocket: NetSocket, RTMPSocketCompatible {
for chunk in chunks {
doOutput(bytes: chunk)
}
if (logger.isEnabledFor(level: .verbose)) {
logger.verbose(chunk.description)
//if (logger.isEnabledFor(level: .verbose)) {
// logger.info(chunk)
if let video:RTMPVideoMessage = chunk.message as? RTMPVideoMessage {
logger.info(video.timestamp)
}
//}
return chunk.message!.length
}

View File

@ -1,3 +1,6 @@
#if os(iOS)
import UIKit
#endif
import Foundation
import AVFoundation

View File

@ -4,7 +4,7 @@ import XCTest
@testable import lf
final class MP4SamplerTests: XCTestCase {
func main() {
func testMain() {
let bundle:Bundle = Bundle(for: type(of: self))
let url:URL = URL(fileURLWithPath: bundle.path(forResource: "SampleVideo_360x240_5mb", ofType: "mp4")!)
let sampler:MP4Sampler = MP4Sampler()

View File

@ -4,7 +4,7 @@ import XCTest
@testable import lf
final class RTMPConnectionTests: XCTestCase {
func testPublish() {
func publish() {
let bundle:Bundle = Bundle(for: type(of: self))
let url:URL = URL(fileURLWithPath: bundle.path(forResource: "SampleVideo_360x240_5mb-base", ofType: "mp4")!)
let connection:RTMPConnection = RTMPConnection()

View File

@ -4,7 +4,7 @@ import XCTest
@testable import lf
final class TimerDriverTests: XCTestCase {
func main() {
func testmain() {
let timerDriver:TimerDriver = TimerDriver()
let delegate:TimerDriverDelegate = LoggerTimerDriverDelegate()
timerDriver.delegate = delegate

View File

@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 47;
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@ -27,7 +27,6 @@
290EA8AB1DFB61E700053022 /* EventDispatcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290EA8A61DFB61E700053022 /* EventDispatcherTests.swift */; };
290EA8AC1DFB61E700053022 /* MD5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290EA8A71DFB61E700053022 /* MD5Tests.swift */; };
290EA8AD1DFB61E700053022 /* TimerDriverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290EA8A81DFB61E700053022 /* TimerDriverTests.swift */; };
2911F9901DE2DA19007FD1EC /* lf.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 29B8761B1CD701F900FC07DA /* lf.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
2911F9C01DE53F2A007FD1EC /* XCGLogger.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2911F9BF1DE53F2A007FD1EC /* XCGLogger.framework */; };
2911F9C11DE53F39007FD1EC /* XCGLogger.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2911F9BF1DE53F2A007FD1EC /* XCGLogger.framework */; };
2915EC4D1D85BB8C00621092 /* RTMPTSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294852551D84BFAD002DE492 /* RTMPTSocket.swift */; };
@ -58,8 +57,9 @@
2931204F1D4529F900B14211 /* RTSPRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2931204B1D4522CF00B14211 /* RTSPRequest.swift */; };
293120501D4529FB00B14211 /* RTSPResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2931204D1D4522E400B14211 /* RTSPResponse.swift */; };
293C74371D85D56D001ED43C /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 293C74361D85D56D001ED43C /* MainInterface.storyboard */; };
293C74381D85DA4B001ED43C /* lf.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2945CBBD1B4BE66000104112 /* lf.framework */; };
2942424D1CF4C01300D65DCB /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942424C1CF4C01300D65DCB /* MD5.swift */; };
2942EF841DFF4D06008E620C /* lf.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2945CBBD1B4BE66000104112 /* lf.framework */; };
2942EF861DFF4D3C008E620C /* lf.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2945CBBD1B4BE66000104112 /* lf.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
294852571D852499002DE492 /* RTMPTSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294852551D84BFAD002DE492 /* RTMPTSocket.swift */; };
2955F51F1D09EBAD004CC995 /* VisualEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296897461CDB01D20074D5F0 /* VisualEffect.swift */; };
2962425E1D8BFC7B00C451A3 /* MovieClipHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292D8A301D8B233C00DBECE2 /* MovieClipHandler.swift */; };
@ -102,7 +102,6 @@
299B131D1D35272D00A1E8F5 /* ScreenCaptureSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 299B131C1D35272D00A1E8F5 /* ScreenCaptureSession.swift */; };
299B13271D3B751400A1E8F5 /* LFView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 299B13261D3B751400A1E8F5 /* LFView.swift */; };
29A39C8E1D85BF6F007C27E9 /* BroadcastViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A39C831D85BF21007C27E9 /* BroadcastViewController.swift */; };
29A39C921D85CF5F007C27E9 /* RTMPMP4ClipHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A39C911D85CF5E007C27E9 /* RTMPMP4ClipHandler.swift */; };
29AF3FCF1D7C744C00E41212 /* NetStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29AF3FCE1D7C744C00E41212 /* NetStream.swift */; };
29AF3FD01D7C745200E41212 /* NetStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29AF3FCE1D7C744C00E41212 /* NetStream.swift */; };
29B8765B1CD70A7900FC07DA /* AACEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876571CD70A7900FC07DA /* AACEncoder.swift */; };
@ -198,8 +197,9 @@
29BCFFA71D68C75B00F1A726 /* RTPService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29BCFFA51D68C75A00F1A726 /* RTPService.swift */; };
29C263181D00804A0098D4EF /* GLLFView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C263171D00804A0098D4EF /* GLLFView.swift */; };
29C2631C1D0083B50098D4EF /* VideoIOComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B8768E1CD70AFE00FC07DA /* VideoIOComponent.swift */; };
29C932A71CD7867C00283FC5 /* lf.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2945CBBD1B4BE66000104112 /* lf.framework */; settings = {ATTRIBUTES = (Required, ); }; };
29D0E3681DD4CE3700863B3B /* AnyUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298BCF321DD4C44A007FF86A /* AnyUtil.swift */; };
29DC67051E00477900A7DC71 /* lf.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2945CBBD1B4BE66000104112 /* lf.framework */; };
29DC67071E00491D00A7DC71 /* RTMPMP4ClipHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29DC67061E00491C00A7DC71 /* RTMPMP4ClipHandler.swift */; };
29DD70E41D68CACA0021904A /* RTSPStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29DD70E31D68CACA0021904A /* RTSPStream.swift */; };
29DD70E61D68CF020021904A /* RTPPacket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29DD70E51D68CF020021904A /* RTPPacket.swift */; };
29DD70E71D68D45E0021904A /* RTSPStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29DD70E31D68CACA0021904A /* RTSPStream.swift */; };
@ -273,7 +273,6 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
2911F9901DE2DA19007FD1EC /* lf.framework in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -295,6 +294,7 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
2942EF861DFF4D3C008E620C /* lf.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@ -382,7 +382,6 @@
29A39C831D85BF21007C27E9 /* BroadcastViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BroadcastViewController.swift; path = Examples/iOS/ScreencastUI/BroadcastViewController.swift; sourceTree = "<group>"; };
29A39C841D85BF21007C27E9 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Examples/iOS/ScreencastUI/Info.plist; sourceTree = "<group>"; };
29A39C881D85BF30007C27E9 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Examples/iOS/Screencast/Info.plist; sourceTree = "<group>"; };
29A39C911D85CF5E007C27E9 /* RTMPMP4ClipHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RTMPMP4ClipHandler.swift; path = Platforms/iOS/RTMPMP4ClipHandler.swift; sourceTree = "<group>"; };
29AF3FCE1D7C744C00E41212 /* NetStream.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NetStream.swift; path = Sources/Net/NetStream.swift; sourceTree = SOURCE_ROOT; };
29B8761B1CD701F900FC07DA /* lf.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = lf.framework; sourceTree = BUILT_PRODUCTS_DIR; };
29B876571CD70A7900FC07DA /* AACEncoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AACEncoder.swift; path = Sources/Codec/AACEncoder.swift; sourceTree = SOURCE_ROOT; };
@ -439,6 +438,7 @@
29C263171D00804A0098D4EF /* GLLFView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = GLLFView.swift; path = Platforms/iOS/GLLFView.swift; sourceTree = "<group>"; };
29C9327E1CD76FB800283FC5 /* Example iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
29C932941CD76FD300283FC5 /* Example macOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example macOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
29DC67061E00491C00A7DC71 /* RTMPMP4ClipHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RTMPMP4ClipHandler.swift; path = Platforms/iOS/RTMPMP4ClipHandler.swift; sourceTree = "<group>"; };
29DD70E31D68CACA0021904A /* RTSPStream.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RTSPStream.swift; path = Sources/RTSP/RTSPStream.swift; sourceTree = SOURCE_ROOT; };
29DD70E51D68CF020021904A /* RTPPacket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RTPPacket.swift; path = Sources/RTP/RTPPacket.swift; sourceTree = SOURCE_ROOT; };
29E258361D7C249B0070DC07 /* lf.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = lf.podspec; sourceTree = "<group>"; };
@ -452,7 +452,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
293C74381D85DA4B001ED43C /* lf.framework in Frameworks */,
29DC67051E00477900A7DC71 /* lf.framework in Frameworks */,
2915EC541D85BDF100621092 /* ReplayKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -494,8 +494,8 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
2942EF841DFF4D06008E620C /* lf.framework in Frameworks */,
29F5FEA61DE2C70A00D0CCB4 /* XCGLogger.framework in Frameworks */,
29C932A71CD7867C00283FC5 /* lf.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -829,8 +829,8 @@
299F7E3A1CD71A97001E7272 /* Info.plist */,
299F7E3B1CD71A97001E7272 /* lf.h */,
299B13261D3B751400A1E8F5 /* LFView.swift */,
29A39C911D85CF5E007C27E9 /* RTMPMP4ClipHandler.swift */,
299B131C1D35272D00A1E8F5 /* ScreenCaptureSession.swift */,
29DC67061E00491C00A7DC71 /* RTMPMP4ClipHandler.swift */,
);
name = iOS;
sourceTree = "<group>";
@ -936,8 +936,8 @@
isa = PBXNativeTarget;
buildConfigurationList = 2915EC751D85BDF200621092 /* Build configuration list for PBXNativeTarget "Screencast" */;
buildPhases = (
2915EC4E1D85BDF100621092 /* Sources */,
2915EC4F1D85BDF100621092 /* Frameworks */,
2915EC4E1D85BDF100621092 /* Sources */,
2915EC501D85BDF100621092 /* Resources */,
);
buildRules = (
@ -966,9 +966,9 @@
productReference = 2915EC5F1D85BDF100621092 /* ScreencastUI.appex */;
productType = "com.apple.product-type.app-extension";
};
2945CBBC1B4BE66000104112 /* lf iOS */ = {
2945CBBC1B4BE66000104112 /* iOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = 2945CBD31B4BE66000104112 /* Build configuration list for PBXNativeTarget "lf iOS" */;
buildConfigurationList = 2945CBD31B4BE66000104112 /* Build configuration list for PBXNativeTarget "iOS" */;
buildPhases = (
2945CBB81B4BE66000104112 /* Sources */,
2945CBBA1B4BE66000104112 /* Headers */,
@ -981,7 +981,7 @@
);
dependencies = (
);
name = "lf iOS";
name = iOS;
productName = lf;
productReference = 2945CBBD1B4BE66000104112 /* lf.framework */;
productType = "com.apple.product-type.framework";
@ -1005,9 +1005,9 @@
productReference = 29798E591CE60E5300F5CBD0 /* Tests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
29B8761A1CD701F900FC07DA /* lf macOS */ = {
29B8761A1CD701F900FC07DA /* macOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = 29B876201CD701F900FC07DA /* Build configuration list for PBXNativeTarget "lf macOS" */;
buildConfigurationList = 29B876201CD701F900FC07DA /* Build configuration list for PBXNativeTarget "macOS" */;
buildPhases = (
29B876161CD701F900FC07DA /* Sources */,
29B876171CD701F900FC07DA /* Frameworks */,
@ -1019,7 +1019,7 @@
);
dependencies = (
);
name = "lf macOS";
name = macOS;
productName = lfMacOS;
productReference = 29B8761B1CD701F900FC07DA /* lf.framework */;
productType = "com.apple.product-type.framework";
@ -1092,7 +1092,7 @@
attributes = {
LastSwiftMigration = 0700;
LastSwiftUpdateCheck = 0800;
LastUpgradeCheck = 0800;
LastUpgradeCheck = 0810;
ORGANIZATIONNAME = "Shogo Endo";
TargetAttributes = {
2915EC511D85BDF100621092 = {
@ -1107,6 +1107,7 @@
};
2945CBBC1B4BE66000104112 = {
CreatedOnToolsVersion = 6.4;
DevelopmentTeam = SUEQ2SZ2L5;
LastSwiftMigration = 0800;
};
29798E581CE60E5300F5CBD0 = {
@ -1132,7 +1133,7 @@
};
};
buildConfigurationList = 2945CBB71B4BE66000104112 /* Build configuration list for PBXProject "lf" */;
compatibilityVersion = "Xcode 6.3";
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
@ -1144,8 +1145,8 @@
projectDirPath = "";
projectRoot = "";
targets = (
2945CBBC1B4BE66000104112 /* lf iOS */,
29B8761A1CD701F900FC07DA /* lf macOS */,
2945CBBC1B4BE66000104112 /* iOS */,
29B8761A1CD701F900FC07DA /* macOS */,
29C9327D1CD76FB800283FC5 /* Example iOS */,
29C932931CD76FD300283FC5 /* Example macOS */,
2915EC511D85BDF100621092 /* Screencast */,
@ -1336,7 +1337,6 @@
29B876841CD70AE800FC07DA /* H264+AVC.swift in Sources */,
296242621D8DB86500C451A3 /* TSWriter.swift in Sources */,
29B8769B1CD70B1100FC07DA /* MIME.swift in Sources */,
29A39C921D85CF5F007C27E9 /* RTMPMP4ClipHandler.swift in Sources */,
29B8769C1CD70B1100FC07DA /* NetClient.swift in Sources */,
29B876871CD70AE800FC07DA /* ProgramSpecific.swift in Sources */,
298BCF331DD4C44A007FF86A /* AnyUtil.swift in Sources */,
@ -1363,6 +1363,7 @@
29C263181D00804A0098D4EF /* GLLFView.swift in Sources */,
29B876881CD70AE800FC07DA /* TransportStream.swift in Sources */,
29B876BE1CD70B3900FC07DA /* EventDispatcher.swift in Sources */,
29DC67071E00491D00A7DC71 /* RTMPMP4ClipHandler.swift in Sources */,
29B8769D1CD70B1100FC07DA /* NetService.swift in Sources */,
29B8769E1CD70B1100FC07DA /* NetSocket.swift in Sources */,
29B876791CD70ACE00FC07DA /* HTTPStream.swift in Sources */,
@ -1532,7 +1533,7 @@
};
29798E601CE60E5300F5CBD0 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 29B8761A1CD701F900FC07DA /* lf macOS */;
target = 29B8761A1CD701F900FC07DA /* macOS */;
targetProxy = 29798E5F1CE60E5300F5CBD0 /* PBXContainerItemProxy */;
};
29798E651CE60E5E00F5CBD0 /* PBXTargetDependency */ = {
@ -1542,12 +1543,12 @@
};
29BA5B951D50BEAD00A51EA8 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 29B8761A1CD701F900FC07DA /* lf macOS */;
target = 29B8761A1CD701F900FC07DA /* macOS */;
targetProxy = 29BA5B941D50BEAD00A51EA8 /* PBXContainerItemProxy */;
};
29C932A91CD78B5500283FC5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 2945CBBC1B4BE66000104112 /* lf iOS */;
target = 2945CBBC1B4BE66000104112 /* iOS */;
targetProxy = 29C932A81CD78B5500283FC5 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
@ -1753,8 +1754,9 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = SUEQ2SZ2L5;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
@ -1781,8 +1783,9 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = SUEQ2SZ2L5;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
@ -1931,6 +1934,7 @@
29C9328E1CD76FB800283FC5 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
@ -1955,6 +1959,7 @@
29C9328F1CD76FB800283FC5 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
@ -2045,7 +2050,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
2945CBD31B4BE66000104112 /* Build configuration list for PBXNativeTarget "lf iOS" */ = {
2945CBD31B4BE66000104112 /* Build configuration list for PBXNativeTarget "iOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
2945CBD41B4BE66000104112 /* Debug */,
@ -2063,7 +2068,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
29B876201CD701F900FC07DA /* Build configuration list for PBXNativeTarget "lf macOS" */ = {
29B876201CD701F900FC07DA /* Build configuration list for PBXNativeTarget "macOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
29B876211CD701F900FC07DA /* Debug */,

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0800"
LastUpgradeVersion = "0810"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -16,7 +16,7 @@
BuildableIdentifier = "primary"
BlueprintIdentifier = "2945CBBC1B4BE66000104112"
BuildableName = "lf.framework"
BlueprintName = "lf iOS"
BlueprintName = "iOS"
ReferencedContainer = "container:lf.xcodeproj">
</BuildableReference>
</BuildActionEntry>
@ -47,7 +47,7 @@
BuildableIdentifier = "primary"
BlueprintIdentifier = "2945CBBC1B4BE66000104112"
BuildableName = "lf.framework"
BlueprintName = "lf iOS"
BlueprintName = "iOS"
ReferencedContainer = "container:lf.xcodeproj">
</BuildableReference>
</MacroExpansion>
@ -65,7 +65,7 @@
BuildableIdentifier = "primary"
BlueprintIdentifier = "2945CBBC1B4BE66000104112"
BuildableName = "lf.framework"
BlueprintName = "lf iOS"
BlueprintName = "iOS"
ReferencedContainer = "container:lf.xcodeproj">
</BuildableReference>
</MacroExpansion>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0800"
LastUpgradeVersion = "0810"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -16,7 +16,7 @@
BuildableIdentifier = "primary"
BlueprintIdentifier = "29B8761A1CD701F900FC07DA"
BuildableName = "lf.framework"
BlueprintName = "lf macOS"
BlueprintName = "macOS"
ReferencedContainer = "container:lf.xcodeproj">
</BuildableReference>
</BuildActionEntry>
@ -47,7 +47,7 @@
BuildableIdentifier = "primary"
BlueprintIdentifier = "29B8761A1CD701F900FC07DA"
BuildableName = "lf.framework"
BlueprintName = "lf macOS"
BlueprintName = "macOS"
ReferencedContainer = "container:lf.xcodeproj">
</BuildableReference>
</MacroExpansion>
@ -65,7 +65,7 @@
BuildableIdentifier = "primary"
BlueprintIdentifier = "29B8761A1CD701F900FC07DA"
BuildableName = "lf.framework"
BlueprintName = "lf macOS"
BlueprintName = "macOS"
ReferencedContainer = "container:lf.xcodeproj">
</BuildableReference>
</MacroExpansion>