Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 12e1066cae | |||
| 05ca0f4f4b | |||
| 9e536d2291 | |||
| 7bb976d4ae | |||
| 934d3f29ad | |||
| 87b3244ba5 | |||
| 23824e2b74 | |||
| 71d68c3e6e | |||
| d9887180c3 | |||
| 30eac1282c | |||
| 77d6a5b85b | |||
| 73c9adeb71 | |||
| 7dcda23bf4 | |||
| aa4f259edc | |||
| bc5dcef3b7 | |||
| 782b0c3c71 | |||
| 34a2fdd3e2 | |||
| ae128ab66b | |||
| cb164ed1fe | |||
| c40b99c19a | |||
| 2a48333a9a | |||
| 3c0c2eecb8 | |||
| 442f04124d | |||
| c03bd61f37 | |||
| 161c0acd68 | |||
| b7be132a30 | |||
| d30aecc802 | |||
| b612be76bc | |||
| a322e2aa3f | |||
| b0e88e182a | |||
| 3ebd933b6c | |||
| db0814ca4c |
+2
-2
@@ -1,7 +1,7 @@
|
||||
language: objective-c
|
||||
osx_image: xcode7
|
||||
xcode_project: LFLiveKit/LFLiveKit.xcodeproj
|
||||
xcode_project: FrameWork/LFLiveKit.xcodeproj
|
||||
xcode_scheme: LFLiveKit
|
||||
|
||||
script:
|
||||
- xctool -project LFLiveKit/LFLiveKit.xcodeproj -scheme 'LFLiveKit' -configuration Release -sdk iphonesimulator -arch i386 build
|
||||
- xctool -project FrameWork/LFLiveKit.xcodeproj -scheme 'LFLiveKit' -configuration Release -sdk iphonesimulator -arch i386 build
|
||||
@@ -15,7 +15,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2.2.2.7</string>
|
||||
<string>2.4.1</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
+210
-217
@@ -7,111 +7,63 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
84D8B3D21D75753300752B56 /* LFAudioCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B39C1D75753300752B56 /* LFAudioCapture.h */; };
|
||||
84D8B3D31D75753300752B56 /* LFAudioCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B39D1D75753300752B56 /* LFAudioCapture.m */; };
|
||||
84D8B3D41D75753300752B56 /* LFVideoCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B39E1D75753300752B56 /* LFVideoCapture.h */; };
|
||||
84D8B3D51D75753300752B56 /* LFVideoCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B39F1D75753300752B56 /* LFVideoCapture.m */; };
|
||||
84D8B3D61D75753300752B56 /* LFAVEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3A21D75753300752B56 /* LFAVEncoder.h */; };
|
||||
84D8B3D71D75753300752B56 /* LFAVEncoder.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3A31D75753300752B56 /* LFAVEncoder.mm */; };
|
||||
84D8B3D81D75753300752B56 /* LFMP4Atom.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3A41D75753300752B56 /* LFMP4Atom.h */; };
|
||||
84D8B3D91D75753300752B56 /* LFMP4Atom.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3A51D75753300752B56 /* LFMP4Atom.m */; };
|
||||
84D8B3DA1D75753300752B56 /* LFNALUnit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3A61D75753300752B56 /* LFNALUnit.cpp */; };
|
||||
84D8B3DB1D75753300752B56 /* LFNALUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3A71D75753300752B56 /* LFNALUnit.h */; };
|
||||
84D8B3DC1D75753300752B56 /* LFVideoEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3A81D75753300752B56 /* LFVideoEncoder.h */; };
|
||||
84D8B3DD1D75753300752B56 /* LFVideoEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3A91D75753300752B56 /* LFVideoEncoder.m */; };
|
||||
84D8B3DE1D75753300752B56 /* LFAudioEncoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3AA1D75753300752B56 /* LFAudioEncoding.h */; };
|
||||
84D8B3DF1D75753300752B56 /* LFH264VideoEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3AB1D75753300752B56 /* LFH264VideoEncoder.h */; };
|
||||
84D8B3E01D75753300752B56 /* LFH264VideoEncoder.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3AC1D75753300752B56 /* LFH264VideoEncoder.mm */; };
|
||||
84D8B3E11D75753300752B56 /* LFHardwareAudioEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3AD1D75753300752B56 /* LFHardwareAudioEncoder.h */; };
|
||||
84D8B3E21D75753300752B56 /* LFHardwareAudioEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3AE1D75753300752B56 /* LFHardwareAudioEncoder.m */; };
|
||||
84D8B3E31D75753300752B56 /* LFHardwareVideoEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3AF1D75753300752B56 /* LFHardwareVideoEncoder.h */; };
|
||||
84D8B3E41D75753300752B56 /* LFHardwareVideoEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3B01D75753300752B56 /* LFHardwareVideoEncoder.m */; };
|
||||
84D8B3E51D75753300752B56 /* LFVideoEncoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3B11D75753300752B56 /* LFVideoEncoding.h */; };
|
||||
84D8B3E61D75753300752B56 /* LFLiveAudioConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3B31D75753300752B56 /* LFLiveAudioConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B3E71D75753300752B56 /* LFLiveAudioConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3B41D75753300752B56 /* LFLiveAudioConfiguration.m */; };
|
||||
84D8B3E81D75753300752B56 /* LFLiveVideoConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3B51D75753300752B56 /* LFLiveVideoConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B3E91D75753300752B56 /* LFLiveVideoConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3B61D75753300752B56 /* LFLiveVideoConfiguration.m */; };
|
||||
84D8B3EA1D75753300752B56 /* LFGPUImageBeautyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3B81D75753300752B56 /* LFGPUImageBeautyFilter.h */; };
|
||||
84D8B3EB1D75753300752B56 /* LFGPUImageBeautyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3B91D75753300752B56 /* LFGPUImageBeautyFilter.m */; };
|
||||
84D8B3EC1D75753300752B56 /* LFGPUImageEmptyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3BA1D75753300752B56 /* LFGPUImageEmptyFilter.h */; };
|
||||
84D8B3ED1D75753300752B56 /* LFGPUImageEmptyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3BB1D75753300752B56 /* LFGPUImageEmptyFilter.m */; };
|
||||
84D8B3EE1D75753300752B56 /* LFLiveKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3BC1D75753300752B56 /* LFLiveKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B3EF1D75753300752B56 /* LFLiveSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3BD1D75753300752B56 /* LFLiveSession.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B3F01D75753300752B56 /* LFLiveSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3BE1D75753300752B56 /* LFLiveSession.m */; };
|
||||
84D8B3F11D75753300752B56 /* LFAudioFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3C01D75753300752B56 /* LFAudioFrame.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B3F21D75753300752B56 /* LFAudioFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3C11D75753300752B56 /* LFAudioFrame.m */; };
|
||||
84D8B3F31D75753300752B56 /* LFFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3C21D75753300752B56 /* LFFrame.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B3F41D75753300752B56 /* LFFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3C31D75753300752B56 /* LFFrame.m */; };
|
||||
84D8B3F51D75753300752B56 /* LFLiveDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3C41D75753300752B56 /* LFLiveDebug.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B3F61D75753300752B56 /* LFLiveDebug.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3C51D75753300752B56 /* LFLiveDebug.m */; };
|
||||
84D8B3F71D75753300752B56 /* LFLiveStreamInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3C61D75753300752B56 /* LFLiveStreamInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B3F81D75753300752B56 /* LFLiveStreamInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3C71D75753300752B56 /* LFLiveStreamInfo.m */; };
|
||||
84D8B3F91D75753300752B56 /* LFVideoFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3C81D75753300752B56 /* LFVideoFrame.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B3FA1D75753300752B56 /* LFVideoFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3C91D75753300752B56 /* LFVideoFrame.m */; };
|
||||
84D8B3FB1D75753300752B56 /* LFStreamingBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3CB1D75753300752B56 /* LFStreamingBuffer.h */; };
|
||||
84D8B3FC1D75753300752B56 /* LFStreamingBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3CC1D75753300752B56 /* LFStreamingBuffer.m */; };
|
||||
84D8B3FD1D75753300752B56 /* LFStreamRTMPSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3CD1D75753300752B56 /* LFStreamRTMPSocket.h */; };
|
||||
84D8B3FE1D75753300752B56 /* LFStreamRtmpSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3CE1D75753300752B56 /* LFStreamRtmpSocket.m */; };
|
||||
84D8B3FF1D75753300752B56 /* LFStreamSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3CF1D75753300752B56 /* LFStreamSocket.h */; };
|
||||
84D8B4001D75753300752B56 /* NSMutableArray+LFAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B3D01D75753300752B56 /* NSMutableArray+LFAdd.h */; };
|
||||
84D8B4011D75753300752B56 /* NSMutableArray+LFAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B3D11D75753300752B56 /* NSMutableArray+LFAdd.m */; };
|
||||
84D8B4BF1D757EB800752B56 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D8B4BE1D757EB800752B56 /* VideoToolbox.framework */; };
|
||||
84D8B4C11D757EBE00752B56 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D8B4C01D757EBE00752B56 /* AudioToolbox.framework */; };
|
||||
84D8B4C31D757EC400752B56 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D8B4C21D757EC400752B56 /* AVFoundation.framework */; };
|
||||
84D8B4C51D757EC800752B56 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D8B4C41D757EC800752B56 /* Foundation.framework */; };
|
||||
84D8B4C71D757ECC00752B56 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D8B4C61D757ECC00752B56 /* UIKit.framework */; };
|
||||
84D8B5BB1D768B6E00752B56 /* LFAudioCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5851D768B6E00752B56 /* LFAudioCapture.h */; };
|
||||
84D8B5BC1D768B6E00752B56 /* LFAudioCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5861D768B6E00752B56 /* LFAudioCapture.m */; };
|
||||
84D8B5BD1D768B6E00752B56 /* LFVideoCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5871D768B6E00752B56 /* LFVideoCapture.h */; };
|
||||
84D8B5BE1D768B6E00752B56 /* LFVideoCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5881D768B6E00752B56 /* LFVideoCapture.m */; };
|
||||
84D8B5BF1D768B6E00752B56 /* LFAVEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B58B1D768B6E00752B56 /* LFAVEncoder.h */; };
|
||||
84D8B5C01D768B6E00752B56 /* LFAVEncoder.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B58C1D768B6E00752B56 /* LFAVEncoder.mm */; };
|
||||
84D8B5C11D768B6E00752B56 /* LFMP4Atom.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B58D1D768B6E00752B56 /* LFMP4Atom.h */; };
|
||||
84D8B5C21D768B6E00752B56 /* LFMP4Atom.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B58E1D768B6E00752B56 /* LFMP4Atom.m */; };
|
||||
84D8B5C31D768B6E00752B56 /* LFNALUnit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B58F1D768B6E00752B56 /* LFNALUnit.cpp */; };
|
||||
84D8B5C41D768B6E00752B56 /* LFNALUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5901D768B6E00752B56 /* LFNALUnit.h */; };
|
||||
84D8B5C51D768B6E00752B56 /* LFVideoEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5911D768B6E00752B56 /* LFVideoEncoder.h */; };
|
||||
84D8B5C61D768B6E00752B56 /* LFVideoEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5921D768B6E00752B56 /* LFVideoEncoder.m */; };
|
||||
84D8B5C71D768B6E00752B56 /* LFAudioEncoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5931D768B6E00752B56 /* LFAudioEncoding.h */; };
|
||||
84D8B5C81D768B6E00752B56 /* LFH264VideoEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5941D768B6E00752B56 /* LFH264VideoEncoder.h */; };
|
||||
84D8B5C91D768B6E00752B56 /* LFH264VideoEncoder.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5951D768B6E00752B56 /* LFH264VideoEncoder.mm */; };
|
||||
84D8B5CA1D768B6E00752B56 /* LFHardwareAudioEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5961D768B6E00752B56 /* LFHardwareAudioEncoder.h */; };
|
||||
84D8B5CB1D768B6E00752B56 /* LFHardwareAudioEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5971D768B6E00752B56 /* LFHardwareAudioEncoder.m */; };
|
||||
84D8B5CC1D768B6E00752B56 /* LFHardwareVideoEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5981D768B6E00752B56 /* LFHardwareVideoEncoder.h */; };
|
||||
84D8B5CD1D768B6E00752B56 /* LFHardwareVideoEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5991D768B6E00752B56 /* LFHardwareVideoEncoder.m */; };
|
||||
84D8B5CE1D768B6E00752B56 /* LFVideoEncoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B59A1D768B6E00752B56 /* LFVideoEncoding.h */; };
|
||||
84D8B5CF1D768B6E00752B56 /* LFLiveAudioConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B59C1D768B6E00752B56 /* LFLiveAudioConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B5D01D768B6E00752B56 /* LFLiveAudioConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B59D1D768B6E00752B56 /* LFLiveAudioConfiguration.m */; };
|
||||
84D8B5D11D768B6E00752B56 /* LFLiveVideoConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B59E1D768B6E00752B56 /* LFLiveVideoConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B5D21D768B6E00752B56 /* LFLiveVideoConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B59F1D768B6E00752B56 /* LFLiveVideoConfiguration.m */; };
|
||||
84D8B5D31D768B6E00752B56 /* LFGPUImageBeautyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5A11D768B6E00752B56 /* LFGPUImageBeautyFilter.h */; };
|
||||
84D8B5D41D768B6E00752B56 /* LFGPUImageBeautyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5A21D768B6E00752B56 /* LFGPUImageBeautyFilter.m */; };
|
||||
84D8B5D51D768B6E00752B56 /* LFGPUImageEmptyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5A31D768B6E00752B56 /* LFGPUImageEmptyFilter.h */; };
|
||||
84D8B5D61D768B6E00752B56 /* LFGPUImageEmptyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5A41D768B6E00752B56 /* LFGPUImageEmptyFilter.m */; };
|
||||
84D8B5D71D768B6E00752B56 /* LFLiveKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5A51D768B6E00752B56 /* LFLiveKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B5D81D768B6E00752B56 /* LFLiveSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5A61D768B6E00752B56 /* LFLiveSession.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B5D91D768B6E00752B56 /* LFLiveSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5A71D768B6E00752B56 /* LFLiveSession.m */; };
|
||||
84D8B5DA1D768B6E00752B56 /* LFAudioFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5A91D768B6E00752B56 /* LFAudioFrame.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B5DB1D768B6E00752B56 /* LFAudioFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5AA1D768B6E00752B56 /* LFAudioFrame.m */; };
|
||||
84D8B5DC1D768B6E00752B56 /* LFFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5AB1D768B6E00752B56 /* LFFrame.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B5DD1D768B6E00752B56 /* LFFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5AC1D768B6E00752B56 /* LFFrame.m */; };
|
||||
84D8B5DE1D768B6E00752B56 /* LFLiveDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5AD1D768B6E00752B56 /* LFLiveDebug.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B5DF1D768B6E00752B56 /* LFLiveDebug.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5AE1D768B6E00752B56 /* LFLiveDebug.m */; };
|
||||
84D8B5E01D768B6E00752B56 /* LFLiveStreamInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5AF1D768B6E00752B56 /* LFLiveStreamInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B5E11D768B6E00752B56 /* LFLiveStreamInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5B01D768B6E00752B56 /* LFLiveStreamInfo.m */; };
|
||||
84D8B5E21D768B6E00752B56 /* LFVideoFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5B11D768B6E00752B56 /* LFVideoFrame.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84D8B5E31D768B6E00752B56 /* LFVideoFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5B21D768B6E00752B56 /* LFVideoFrame.m */; };
|
||||
84D8B5E41D768B6E00752B56 /* LFStreamingBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5B41D768B6E00752B56 /* LFStreamingBuffer.h */; };
|
||||
84D8B5E51D768B6E00752B56 /* LFStreamingBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5B51D768B6E00752B56 /* LFStreamingBuffer.m */; };
|
||||
84D8B5E61D768B6E00752B56 /* LFStreamRTMPSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5B61D768B6E00752B56 /* LFStreamRTMPSocket.h */; };
|
||||
84D8B5E71D768B6E00752B56 /* LFStreamRtmpSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5B71D768B6E00752B56 /* LFStreamRtmpSocket.m */; };
|
||||
84D8B5E81D768B6E00752B56 /* LFStreamSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5B81D768B6E00752B56 /* LFStreamSocket.h */; };
|
||||
84D8B5E91D768B6E00752B56 /* NSMutableArray+LFAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D8B5B91D768B6E00752B56 /* NSMutableArray+LFAdd.h */; };
|
||||
84D8B5EA1D768B6E00752B56 /* NSMutableArray+LFAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B5BA1D768B6E00752B56 /* NSMutableArray+LFAdd.m */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
84D8B3901D7574D600752B56 /* LFLiveKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LFLiveKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
84D8B39C1D75753300752B56 /* LFAudioCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFAudioCapture.h; sourceTree = "<group>"; };
|
||||
84D8B39D1D75753300752B56 /* LFAudioCapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFAudioCapture.m; sourceTree = "<group>"; };
|
||||
84D8B39E1D75753300752B56 /* LFVideoCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFVideoCapture.h; sourceTree = "<group>"; };
|
||||
84D8B39F1D75753300752B56 /* LFVideoCapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFVideoCapture.m; sourceTree = "<group>"; };
|
||||
84D8B3A21D75753300752B56 /* LFAVEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFAVEncoder.h; sourceTree = "<group>"; };
|
||||
84D8B3A31D75753300752B56 /* LFAVEncoder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LFAVEncoder.mm; sourceTree = "<group>"; };
|
||||
84D8B3A41D75753300752B56 /* LFMP4Atom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFMP4Atom.h; sourceTree = "<group>"; };
|
||||
84D8B3A51D75753300752B56 /* LFMP4Atom.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFMP4Atom.m; sourceTree = "<group>"; };
|
||||
84D8B3A61D75753300752B56 /* LFNALUnit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LFNALUnit.cpp; sourceTree = "<group>"; };
|
||||
84D8B3A71D75753300752B56 /* LFNALUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFNALUnit.h; sourceTree = "<group>"; };
|
||||
84D8B3A81D75753300752B56 /* LFVideoEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFVideoEncoder.h; sourceTree = "<group>"; };
|
||||
84D8B3A91D75753300752B56 /* LFVideoEncoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFVideoEncoder.m; sourceTree = "<group>"; };
|
||||
84D8B3AA1D75753300752B56 /* LFAudioEncoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFAudioEncoding.h; sourceTree = "<group>"; };
|
||||
84D8B3AB1D75753300752B56 /* LFH264VideoEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFH264VideoEncoder.h; sourceTree = "<group>"; };
|
||||
84D8B3AC1D75753300752B56 /* LFH264VideoEncoder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LFH264VideoEncoder.mm; sourceTree = "<group>"; };
|
||||
84D8B3AD1D75753300752B56 /* LFHardwareAudioEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFHardwareAudioEncoder.h; sourceTree = "<group>"; };
|
||||
84D8B3AE1D75753300752B56 /* LFHardwareAudioEncoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFHardwareAudioEncoder.m; sourceTree = "<group>"; };
|
||||
84D8B3AF1D75753300752B56 /* LFHardwareVideoEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFHardwareVideoEncoder.h; sourceTree = "<group>"; };
|
||||
84D8B3B01D75753300752B56 /* LFHardwareVideoEncoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFHardwareVideoEncoder.m; sourceTree = "<group>"; };
|
||||
84D8B3B11D75753300752B56 /* LFVideoEncoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFVideoEncoding.h; sourceTree = "<group>"; };
|
||||
84D8B3B31D75753300752B56 /* LFLiveAudioConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFLiveAudioConfiguration.h; sourceTree = "<group>"; };
|
||||
84D8B3B41D75753300752B56 /* LFLiveAudioConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFLiveAudioConfiguration.m; sourceTree = "<group>"; };
|
||||
84D8B3B51D75753300752B56 /* LFLiveVideoConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFLiveVideoConfiguration.h; sourceTree = "<group>"; };
|
||||
84D8B3B61D75753300752B56 /* LFLiveVideoConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFLiveVideoConfiguration.m; sourceTree = "<group>"; };
|
||||
84D8B3B81D75753300752B56 /* LFGPUImageBeautyFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFGPUImageBeautyFilter.h; sourceTree = "<group>"; };
|
||||
84D8B3B91D75753300752B56 /* LFGPUImageBeautyFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFGPUImageBeautyFilter.m; sourceTree = "<group>"; };
|
||||
84D8B3BA1D75753300752B56 /* LFGPUImageEmptyFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFGPUImageEmptyFilter.h; sourceTree = "<group>"; };
|
||||
84D8B3BB1D75753300752B56 /* LFGPUImageEmptyFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFGPUImageEmptyFilter.m; sourceTree = "<group>"; };
|
||||
84D8B3BC1D75753300752B56 /* LFLiveKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFLiveKit.h; sourceTree = "<group>"; };
|
||||
84D8B3BD1D75753300752B56 /* LFLiveSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFLiveSession.h; sourceTree = "<group>"; };
|
||||
84D8B3BE1D75753300752B56 /* LFLiveSession.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFLiveSession.m; sourceTree = "<group>"; };
|
||||
84D8B3C01D75753300752B56 /* LFAudioFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFAudioFrame.h; sourceTree = "<group>"; };
|
||||
84D8B3C11D75753300752B56 /* LFAudioFrame.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFAudioFrame.m; sourceTree = "<group>"; };
|
||||
84D8B3C21D75753300752B56 /* LFFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFFrame.h; sourceTree = "<group>"; };
|
||||
84D8B3C31D75753300752B56 /* LFFrame.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFFrame.m; sourceTree = "<group>"; };
|
||||
84D8B3C41D75753300752B56 /* LFLiveDebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFLiveDebug.h; sourceTree = "<group>"; };
|
||||
84D8B3C51D75753300752B56 /* LFLiveDebug.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFLiveDebug.m; sourceTree = "<group>"; };
|
||||
84D8B3C61D75753300752B56 /* LFLiveStreamInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFLiveStreamInfo.h; sourceTree = "<group>"; };
|
||||
84D8B3C71D75753300752B56 /* LFLiveStreamInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFLiveStreamInfo.m; sourceTree = "<group>"; };
|
||||
84D8B3C81D75753300752B56 /* LFVideoFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFVideoFrame.h; sourceTree = "<group>"; };
|
||||
84D8B3C91D75753300752B56 /* LFVideoFrame.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFVideoFrame.m; sourceTree = "<group>"; };
|
||||
84D8B3CB1D75753300752B56 /* LFStreamingBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFStreamingBuffer.h; sourceTree = "<group>"; };
|
||||
84D8B3CC1D75753300752B56 /* LFStreamingBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFStreamingBuffer.m; sourceTree = "<group>"; };
|
||||
84D8B3CD1D75753300752B56 /* LFStreamRTMPSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFStreamRTMPSocket.h; sourceTree = "<group>"; };
|
||||
84D8B3CE1D75753300752B56 /* LFStreamRtmpSocket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFStreamRtmpSocket.m; sourceTree = "<group>"; };
|
||||
84D8B3CF1D75753300752B56 /* LFStreamSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFStreamSocket.h; sourceTree = "<group>"; };
|
||||
84D8B3D01D75753300752B56 /* NSMutableArray+LFAdd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableArray+LFAdd.h"; sourceTree = "<group>"; };
|
||||
84D8B3D11D75753300752B56 /* NSMutableArray+LFAdd.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+LFAdd.m"; sourceTree = "<group>"; };
|
||||
84D8B4BE1D757EB800752B56 /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; };
|
||||
84D8B4C01D757EBE00752B56 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
|
||||
84D8B4C21D757EC400752B56 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
|
||||
@@ -119,6 +71,54 @@
|
||||
84D8B4C61D757ECC00752B56 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
||||
84D8B4C81D757ED100752B56 /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; };
|
||||
84D8B4CA1D757ED600752B56 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
|
||||
84D8B5851D768B6E00752B56 /* LFAudioCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFAudioCapture.h; sourceTree = "<group>"; };
|
||||
84D8B5861D768B6E00752B56 /* LFAudioCapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFAudioCapture.m; sourceTree = "<group>"; };
|
||||
84D8B5871D768B6E00752B56 /* LFVideoCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFVideoCapture.h; sourceTree = "<group>"; };
|
||||
84D8B5881D768B6E00752B56 /* LFVideoCapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFVideoCapture.m; sourceTree = "<group>"; };
|
||||
84D8B58B1D768B6E00752B56 /* LFAVEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFAVEncoder.h; sourceTree = "<group>"; };
|
||||
84D8B58C1D768B6E00752B56 /* LFAVEncoder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LFAVEncoder.mm; sourceTree = "<group>"; };
|
||||
84D8B58D1D768B6E00752B56 /* LFMP4Atom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFMP4Atom.h; sourceTree = "<group>"; };
|
||||
84D8B58E1D768B6E00752B56 /* LFMP4Atom.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFMP4Atom.m; sourceTree = "<group>"; };
|
||||
84D8B58F1D768B6E00752B56 /* LFNALUnit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LFNALUnit.cpp; sourceTree = "<group>"; };
|
||||
84D8B5901D768B6E00752B56 /* LFNALUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFNALUnit.h; sourceTree = "<group>"; };
|
||||
84D8B5911D768B6E00752B56 /* LFVideoEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFVideoEncoder.h; sourceTree = "<group>"; };
|
||||
84D8B5921D768B6E00752B56 /* LFVideoEncoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFVideoEncoder.m; sourceTree = "<group>"; };
|
||||
84D8B5931D768B6E00752B56 /* LFAudioEncoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFAudioEncoding.h; sourceTree = "<group>"; };
|
||||
84D8B5941D768B6E00752B56 /* LFH264VideoEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFH264VideoEncoder.h; sourceTree = "<group>"; };
|
||||
84D8B5951D768B6E00752B56 /* LFH264VideoEncoder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LFH264VideoEncoder.mm; sourceTree = "<group>"; };
|
||||
84D8B5961D768B6E00752B56 /* LFHardwareAudioEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFHardwareAudioEncoder.h; sourceTree = "<group>"; };
|
||||
84D8B5971D768B6E00752B56 /* LFHardwareAudioEncoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFHardwareAudioEncoder.m; sourceTree = "<group>"; };
|
||||
84D8B5981D768B6E00752B56 /* LFHardwareVideoEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFHardwareVideoEncoder.h; sourceTree = "<group>"; };
|
||||
84D8B5991D768B6E00752B56 /* LFHardwareVideoEncoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFHardwareVideoEncoder.m; sourceTree = "<group>"; };
|
||||
84D8B59A1D768B6E00752B56 /* LFVideoEncoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFVideoEncoding.h; sourceTree = "<group>"; };
|
||||
84D8B59C1D768B6E00752B56 /* LFLiveAudioConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFLiveAudioConfiguration.h; sourceTree = "<group>"; };
|
||||
84D8B59D1D768B6E00752B56 /* LFLiveAudioConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFLiveAudioConfiguration.m; sourceTree = "<group>"; };
|
||||
84D8B59E1D768B6E00752B56 /* LFLiveVideoConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFLiveVideoConfiguration.h; sourceTree = "<group>"; };
|
||||
84D8B59F1D768B6E00752B56 /* LFLiveVideoConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFLiveVideoConfiguration.m; sourceTree = "<group>"; };
|
||||
84D8B5A11D768B6E00752B56 /* LFGPUImageBeautyFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFGPUImageBeautyFilter.h; sourceTree = "<group>"; };
|
||||
84D8B5A21D768B6E00752B56 /* LFGPUImageBeautyFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFGPUImageBeautyFilter.m; sourceTree = "<group>"; };
|
||||
84D8B5A31D768B6E00752B56 /* LFGPUImageEmptyFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFGPUImageEmptyFilter.h; sourceTree = "<group>"; };
|
||||
84D8B5A41D768B6E00752B56 /* LFGPUImageEmptyFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFGPUImageEmptyFilter.m; sourceTree = "<group>"; };
|
||||
84D8B5A51D768B6E00752B56 /* LFLiveKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFLiveKit.h; sourceTree = "<group>"; };
|
||||
84D8B5A61D768B6E00752B56 /* LFLiveSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFLiveSession.h; sourceTree = "<group>"; };
|
||||
84D8B5A71D768B6E00752B56 /* LFLiveSession.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFLiveSession.m; sourceTree = "<group>"; };
|
||||
84D8B5A91D768B6E00752B56 /* LFAudioFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFAudioFrame.h; sourceTree = "<group>"; };
|
||||
84D8B5AA1D768B6E00752B56 /* LFAudioFrame.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFAudioFrame.m; sourceTree = "<group>"; };
|
||||
84D8B5AB1D768B6E00752B56 /* LFFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFFrame.h; sourceTree = "<group>"; };
|
||||
84D8B5AC1D768B6E00752B56 /* LFFrame.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFFrame.m; sourceTree = "<group>"; };
|
||||
84D8B5AD1D768B6E00752B56 /* LFLiveDebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFLiveDebug.h; sourceTree = "<group>"; };
|
||||
84D8B5AE1D768B6E00752B56 /* LFLiveDebug.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFLiveDebug.m; sourceTree = "<group>"; };
|
||||
84D8B5AF1D768B6E00752B56 /* LFLiveStreamInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFLiveStreamInfo.h; sourceTree = "<group>"; };
|
||||
84D8B5B01D768B6E00752B56 /* LFLiveStreamInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFLiveStreamInfo.m; sourceTree = "<group>"; };
|
||||
84D8B5B11D768B6E00752B56 /* LFVideoFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFVideoFrame.h; sourceTree = "<group>"; };
|
||||
84D8B5B21D768B6E00752B56 /* LFVideoFrame.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFVideoFrame.m; sourceTree = "<group>"; };
|
||||
84D8B5B41D768B6E00752B56 /* LFStreamingBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFStreamingBuffer.h; sourceTree = "<group>"; };
|
||||
84D8B5B51D768B6E00752B56 /* LFStreamingBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFStreamingBuffer.m; sourceTree = "<group>"; };
|
||||
84D8B5B61D768B6E00752B56 /* LFStreamRTMPSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFStreamRTMPSocket.h; sourceTree = "<group>"; };
|
||||
84D8B5B71D768B6E00752B56 /* LFStreamRtmpSocket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFStreamRtmpSocket.m; sourceTree = "<group>"; };
|
||||
84D8B5B81D768B6E00752B56 /* LFStreamSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFStreamSocket.h; sourceTree = "<group>"; };
|
||||
84D8B5B91D768B6E00752B56 /* NSMutableArray+LFAdd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableArray+LFAdd.h"; sourceTree = "<group>"; };
|
||||
84D8B5BA1D768B6E00752B56 /* NSMutableArray+LFAdd.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+LFAdd.m"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -140,6 +140,7 @@
|
||||
84D8B3861D7574D600752B56 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84D8B5831D768B6E00752B56 /* LFLiveKit */,
|
||||
84D8B4CA1D757ED600752B56 /* libz.tbd */,
|
||||
84D8B4C81D757ED100752B56 /* libstdc++.tbd */,
|
||||
84D8B4C61D757ECC00752B56 /* UIKit.framework */,
|
||||
@@ -147,7 +148,6 @@
|
||||
84D8B4C21D757EC400752B56 /* AVFoundation.framework */,
|
||||
84D8B4C01D757EBE00752B56 /* AudioToolbox.framework */,
|
||||
84D8B4BE1D757EB800752B56 /* VideoToolbox.framework */,
|
||||
84D8B3921D7574D600752B56 /* LFLiveKit */,
|
||||
84D8B3911D7574D600752B56 /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
@@ -160,113 +160,114 @@
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B3921D7574D600752B56 /* LFLiveKit */ = {
|
||||
84D8B5831D768B6E00752B56 /* LFLiveKit */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84D8B39B1D75753300752B56 /* capture */,
|
||||
84D8B3A01D75753300752B56 /* coder */,
|
||||
84D8B3B21D75753300752B56 /* configuration */,
|
||||
84D8B3B71D75753300752B56 /* filter */,
|
||||
84D8B3BC1D75753300752B56 /* LFLiveKit.h */,
|
||||
84D8B3BD1D75753300752B56 /* LFLiveSession.h */,
|
||||
84D8B3BE1D75753300752B56 /* LFLiveSession.m */,
|
||||
84D8B3BF1D75753300752B56 /* objects */,
|
||||
84D8B3CA1D75753300752B56 /* publish */,
|
||||
84D8B5841D768B6E00752B56 /* capture */,
|
||||
84D8B5891D768B6E00752B56 /* coder */,
|
||||
84D8B59B1D768B6E00752B56 /* configuration */,
|
||||
84D8B5A01D768B6E00752B56 /* filter */,
|
||||
84D8B5A51D768B6E00752B56 /* LFLiveKit.h */,
|
||||
84D8B5A61D768B6E00752B56 /* LFLiveSession.h */,
|
||||
84D8B5A71D768B6E00752B56 /* LFLiveSession.m */,
|
||||
84D8B5A81D768B6E00752B56 /* objects */,
|
||||
84D8B5B31D768B6E00752B56 /* publish */,
|
||||
);
|
||||
path = LFLiveKit;
|
||||
name = LFLiveKit;
|
||||
path = ../LFLiveKit;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B39B1D75753300752B56 /* capture */ = {
|
||||
84D8B5841D768B6E00752B56 /* capture */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84D8B39C1D75753300752B56 /* LFAudioCapture.h */,
|
||||
84D8B39D1D75753300752B56 /* LFAudioCapture.m */,
|
||||
84D8B39E1D75753300752B56 /* LFVideoCapture.h */,
|
||||
84D8B39F1D75753300752B56 /* LFVideoCapture.m */,
|
||||
84D8B5851D768B6E00752B56 /* LFAudioCapture.h */,
|
||||
84D8B5861D768B6E00752B56 /* LFAudioCapture.m */,
|
||||
84D8B5871D768B6E00752B56 /* LFVideoCapture.h */,
|
||||
84D8B5881D768B6E00752B56 /* LFVideoCapture.m */,
|
||||
);
|
||||
path = capture;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B3A01D75753300752B56 /* coder */ = {
|
||||
84D8B5891D768B6E00752B56 /* coder */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84D8B3A11D75753300752B56 /* H264 */,
|
||||
84D8B3AA1D75753300752B56 /* LFAudioEncoding.h */,
|
||||
84D8B3AB1D75753300752B56 /* LFH264VideoEncoder.h */,
|
||||
84D8B3AC1D75753300752B56 /* LFH264VideoEncoder.mm */,
|
||||
84D8B3AD1D75753300752B56 /* LFHardwareAudioEncoder.h */,
|
||||
84D8B3AE1D75753300752B56 /* LFHardwareAudioEncoder.m */,
|
||||
84D8B3AF1D75753300752B56 /* LFHardwareVideoEncoder.h */,
|
||||
84D8B3B01D75753300752B56 /* LFHardwareVideoEncoder.m */,
|
||||
84D8B3B11D75753300752B56 /* LFVideoEncoding.h */,
|
||||
84D8B58A1D768B6E00752B56 /* H264 */,
|
||||
84D8B5931D768B6E00752B56 /* LFAudioEncoding.h */,
|
||||
84D8B5941D768B6E00752B56 /* LFH264VideoEncoder.h */,
|
||||
84D8B5951D768B6E00752B56 /* LFH264VideoEncoder.mm */,
|
||||
84D8B5961D768B6E00752B56 /* LFHardwareAudioEncoder.h */,
|
||||
84D8B5971D768B6E00752B56 /* LFHardwareAudioEncoder.m */,
|
||||
84D8B5981D768B6E00752B56 /* LFHardwareVideoEncoder.h */,
|
||||
84D8B5991D768B6E00752B56 /* LFHardwareVideoEncoder.m */,
|
||||
84D8B59A1D768B6E00752B56 /* LFVideoEncoding.h */,
|
||||
);
|
||||
path = coder;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B3A11D75753300752B56 /* H264 */ = {
|
||||
84D8B58A1D768B6E00752B56 /* H264 */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84D8B3A21D75753300752B56 /* LFAVEncoder.h */,
|
||||
84D8B3A31D75753300752B56 /* LFAVEncoder.mm */,
|
||||
84D8B3A41D75753300752B56 /* LFMP4Atom.h */,
|
||||
84D8B3A51D75753300752B56 /* LFMP4Atom.m */,
|
||||
84D8B3A61D75753300752B56 /* LFNALUnit.cpp */,
|
||||
84D8B3A71D75753300752B56 /* LFNALUnit.h */,
|
||||
84D8B3A81D75753300752B56 /* LFVideoEncoder.h */,
|
||||
84D8B3A91D75753300752B56 /* LFVideoEncoder.m */,
|
||||
84D8B58B1D768B6E00752B56 /* LFAVEncoder.h */,
|
||||
84D8B58C1D768B6E00752B56 /* LFAVEncoder.mm */,
|
||||
84D8B58D1D768B6E00752B56 /* LFMP4Atom.h */,
|
||||
84D8B58E1D768B6E00752B56 /* LFMP4Atom.m */,
|
||||
84D8B58F1D768B6E00752B56 /* LFNALUnit.cpp */,
|
||||
84D8B5901D768B6E00752B56 /* LFNALUnit.h */,
|
||||
84D8B5911D768B6E00752B56 /* LFVideoEncoder.h */,
|
||||
84D8B5921D768B6E00752B56 /* LFVideoEncoder.m */,
|
||||
);
|
||||
path = H264;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B3B21D75753300752B56 /* configuration */ = {
|
||||
84D8B59B1D768B6E00752B56 /* configuration */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84D8B3B31D75753300752B56 /* LFLiveAudioConfiguration.h */,
|
||||
84D8B3B41D75753300752B56 /* LFLiveAudioConfiguration.m */,
|
||||
84D8B3B51D75753300752B56 /* LFLiveVideoConfiguration.h */,
|
||||
84D8B3B61D75753300752B56 /* LFLiveVideoConfiguration.m */,
|
||||
84D8B59C1D768B6E00752B56 /* LFLiveAudioConfiguration.h */,
|
||||
84D8B59D1D768B6E00752B56 /* LFLiveAudioConfiguration.m */,
|
||||
84D8B59E1D768B6E00752B56 /* LFLiveVideoConfiguration.h */,
|
||||
84D8B59F1D768B6E00752B56 /* LFLiveVideoConfiguration.m */,
|
||||
);
|
||||
path = configuration;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B3B71D75753300752B56 /* filter */ = {
|
||||
84D8B5A01D768B6E00752B56 /* filter */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84D8B3B81D75753300752B56 /* LFGPUImageBeautyFilter.h */,
|
||||
84D8B3B91D75753300752B56 /* LFGPUImageBeautyFilter.m */,
|
||||
84D8B3BA1D75753300752B56 /* LFGPUImageEmptyFilter.h */,
|
||||
84D8B3BB1D75753300752B56 /* LFGPUImageEmptyFilter.m */,
|
||||
84D8B5A11D768B6E00752B56 /* LFGPUImageBeautyFilter.h */,
|
||||
84D8B5A21D768B6E00752B56 /* LFGPUImageBeautyFilter.m */,
|
||||
84D8B5A31D768B6E00752B56 /* LFGPUImageEmptyFilter.h */,
|
||||
84D8B5A41D768B6E00752B56 /* LFGPUImageEmptyFilter.m */,
|
||||
);
|
||||
path = filter;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B3BF1D75753300752B56 /* objects */ = {
|
||||
84D8B5A81D768B6E00752B56 /* objects */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84D8B3C01D75753300752B56 /* LFAudioFrame.h */,
|
||||
84D8B3C11D75753300752B56 /* LFAudioFrame.m */,
|
||||
84D8B3C21D75753300752B56 /* LFFrame.h */,
|
||||
84D8B3C31D75753300752B56 /* LFFrame.m */,
|
||||
84D8B3C41D75753300752B56 /* LFLiveDebug.h */,
|
||||
84D8B3C51D75753300752B56 /* LFLiveDebug.m */,
|
||||
84D8B3C61D75753300752B56 /* LFLiveStreamInfo.h */,
|
||||
84D8B3C71D75753300752B56 /* LFLiveStreamInfo.m */,
|
||||
84D8B3C81D75753300752B56 /* LFVideoFrame.h */,
|
||||
84D8B3C91D75753300752B56 /* LFVideoFrame.m */,
|
||||
84D8B5A91D768B6E00752B56 /* LFAudioFrame.h */,
|
||||
84D8B5AA1D768B6E00752B56 /* LFAudioFrame.m */,
|
||||
84D8B5AB1D768B6E00752B56 /* LFFrame.h */,
|
||||
84D8B5AC1D768B6E00752B56 /* LFFrame.m */,
|
||||
84D8B5AD1D768B6E00752B56 /* LFLiveDebug.h */,
|
||||
84D8B5AE1D768B6E00752B56 /* LFLiveDebug.m */,
|
||||
84D8B5AF1D768B6E00752B56 /* LFLiveStreamInfo.h */,
|
||||
84D8B5B01D768B6E00752B56 /* LFLiveStreamInfo.m */,
|
||||
84D8B5B11D768B6E00752B56 /* LFVideoFrame.h */,
|
||||
84D8B5B21D768B6E00752B56 /* LFVideoFrame.m */,
|
||||
);
|
||||
path = objects;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B3CA1D75753300752B56 /* publish */ = {
|
||||
84D8B5B31D768B6E00752B56 /* publish */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84D8B3CB1D75753300752B56 /* LFStreamingBuffer.h */,
|
||||
84D8B3CC1D75753300752B56 /* LFStreamingBuffer.m */,
|
||||
84D8B3CD1D75753300752B56 /* LFStreamRTMPSocket.h */,
|
||||
84D8B3CE1D75753300752B56 /* LFStreamRtmpSocket.m */,
|
||||
84D8B3CF1D75753300752B56 /* LFStreamSocket.h */,
|
||||
84D8B3D01D75753300752B56 /* NSMutableArray+LFAdd.h */,
|
||||
84D8B3D11D75753300752B56 /* NSMutableArray+LFAdd.m */,
|
||||
84D8B5B41D768B6E00752B56 /* LFStreamingBuffer.h */,
|
||||
84D8B5B51D768B6E00752B56 /* LFStreamingBuffer.m */,
|
||||
84D8B5B61D768B6E00752B56 /* LFStreamRTMPSocket.h */,
|
||||
84D8B5B71D768B6E00752B56 /* LFStreamRtmpSocket.m */,
|
||||
84D8B5B81D768B6E00752B56 /* LFStreamSocket.h */,
|
||||
84D8B5B91D768B6E00752B56 /* NSMutableArray+LFAdd.h */,
|
||||
84D8B5BA1D768B6E00752B56 /* NSMutableArray+LFAdd.m */,
|
||||
);
|
||||
path = publish;
|
||||
sourceTree = "<group>";
|
||||
@@ -278,32 +279,32 @@
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
84D8B3F51D75753300752B56 /* LFLiveDebug.h in Headers */,
|
||||
84D8B3E61D75753300752B56 /* LFLiveAudioConfiguration.h in Headers */,
|
||||
84D8B3F11D75753300752B56 /* LFAudioFrame.h in Headers */,
|
||||
84D8B3F71D75753300752B56 /* LFLiveStreamInfo.h in Headers */,
|
||||
84D8B3E81D75753300752B56 /* LFLiveVideoConfiguration.h in Headers */,
|
||||
84D8B3F31D75753300752B56 /* LFFrame.h in Headers */,
|
||||
84D8B3EE1D75753300752B56 /* LFLiveKit.h in Headers */,
|
||||
84D8B3EF1D75753300752B56 /* LFLiveSession.h in Headers */,
|
||||
84D8B3F91D75753300752B56 /* LFVideoFrame.h in Headers */,
|
||||
84D8B3D21D75753300752B56 /* LFAudioCapture.h in Headers */,
|
||||
84D8B3FD1D75753300752B56 /* LFStreamRTMPSocket.h in Headers */,
|
||||
84D8B3D81D75753300752B56 /* LFMP4Atom.h in Headers */,
|
||||
84D8B3EA1D75753300752B56 /* LFGPUImageBeautyFilter.h in Headers */,
|
||||
84D8B3D61D75753300752B56 /* LFAVEncoder.h in Headers */,
|
||||
84D8B3DC1D75753300752B56 /* LFVideoEncoder.h in Headers */,
|
||||
84D8B3EC1D75753300752B56 /* LFGPUImageEmptyFilter.h in Headers */,
|
||||
84D8B3DE1D75753300752B56 /* LFAudioEncoding.h in Headers */,
|
||||
84D8B4001D75753300752B56 /* NSMutableArray+LFAdd.h in Headers */,
|
||||
84D8B3E31D75753300752B56 /* LFHardwareVideoEncoder.h in Headers */,
|
||||
84D8B3D41D75753300752B56 /* LFVideoCapture.h in Headers */,
|
||||
84D8B3FF1D75753300752B56 /* LFStreamSocket.h in Headers */,
|
||||
84D8B3DB1D75753300752B56 /* LFNALUnit.h in Headers */,
|
||||
84D8B3E11D75753300752B56 /* LFHardwareAudioEncoder.h in Headers */,
|
||||
84D8B3E51D75753300752B56 /* LFVideoEncoding.h in Headers */,
|
||||
84D8B3FB1D75753300752B56 /* LFStreamingBuffer.h in Headers */,
|
||||
84D8B3DF1D75753300752B56 /* LFH264VideoEncoder.h in Headers */,
|
||||
84D8B5DE1D768B6E00752B56 /* LFLiveDebug.h in Headers */,
|
||||
84D8B5CF1D768B6E00752B56 /* LFLiveAudioConfiguration.h in Headers */,
|
||||
84D8B5DA1D768B6E00752B56 /* LFAudioFrame.h in Headers */,
|
||||
84D8B5E01D768B6E00752B56 /* LFLiveStreamInfo.h in Headers */,
|
||||
84D8B5D11D768B6E00752B56 /* LFLiveVideoConfiguration.h in Headers */,
|
||||
84D8B5DC1D768B6E00752B56 /* LFFrame.h in Headers */,
|
||||
84D8B5D71D768B6E00752B56 /* LFLiveKit.h in Headers */,
|
||||
84D8B5D81D768B6E00752B56 /* LFLiveSession.h in Headers */,
|
||||
84D8B5E21D768B6E00752B56 /* LFVideoFrame.h in Headers */,
|
||||
84D8B5BB1D768B6E00752B56 /* LFAudioCapture.h in Headers */,
|
||||
84D8B5E61D768B6E00752B56 /* LFStreamRTMPSocket.h in Headers */,
|
||||
84D8B5C11D768B6E00752B56 /* LFMP4Atom.h in Headers */,
|
||||
84D8B5D31D768B6E00752B56 /* LFGPUImageBeautyFilter.h in Headers */,
|
||||
84D8B5BF1D768B6E00752B56 /* LFAVEncoder.h in Headers */,
|
||||
84D8B5C51D768B6E00752B56 /* LFVideoEncoder.h in Headers */,
|
||||
84D8B5D51D768B6E00752B56 /* LFGPUImageEmptyFilter.h in Headers */,
|
||||
84D8B5C71D768B6E00752B56 /* LFAudioEncoding.h in Headers */,
|
||||
84D8B5E91D768B6E00752B56 /* NSMutableArray+LFAdd.h in Headers */,
|
||||
84D8B5CC1D768B6E00752B56 /* LFHardwareVideoEncoder.h in Headers */,
|
||||
84D8B5BD1D768B6E00752B56 /* LFVideoCapture.h in Headers */,
|
||||
84D8B5E81D768B6E00752B56 /* LFStreamSocket.h in Headers */,
|
||||
84D8B5C41D768B6E00752B56 /* LFNALUnit.h in Headers */,
|
||||
84D8B5CA1D768B6E00752B56 /* LFHardwareAudioEncoder.h in Headers */,
|
||||
84D8B5CE1D768B6E00752B56 /* LFVideoEncoding.h in Headers */,
|
||||
84D8B5E41D768B6E00752B56 /* LFStreamingBuffer.h in Headers */,
|
||||
84D8B5C81D768B6E00752B56 /* LFH264VideoEncoder.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -374,28 +375,28 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
84D8B3EB1D75753300752B56 /* LFGPUImageBeautyFilter.m in Sources */,
|
||||
84D8B3F41D75753300752B56 /* LFFrame.m in Sources */,
|
||||
84D8B3F61D75753300752B56 /* LFLiveDebug.m in Sources */,
|
||||
84D8B3D51D75753300752B56 /* LFVideoCapture.m in Sources */,
|
||||
84D8B3F21D75753300752B56 /* LFAudioFrame.m in Sources */,
|
||||
84D8B3F81D75753300752B56 /* LFLiveStreamInfo.m in Sources */,
|
||||
84D8B3DA1D75753300752B56 /* LFNALUnit.cpp in Sources */,
|
||||
84D8B3D71D75753300752B56 /* LFAVEncoder.mm in Sources */,
|
||||
84D8B3D91D75753300752B56 /* LFMP4Atom.m in Sources */,
|
||||
84D8B3E91D75753300752B56 /* LFLiveVideoConfiguration.m in Sources */,
|
||||
84D8B3DD1D75753300752B56 /* LFVideoEncoder.m in Sources */,
|
||||
84D8B3ED1D75753300752B56 /* LFGPUImageEmptyFilter.m in Sources */,
|
||||
84D8B3F01D75753300752B56 /* LFLiveSession.m in Sources */,
|
||||
84D8B3FE1D75753300752B56 /* LFStreamRtmpSocket.m in Sources */,
|
||||
84D8B3E71D75753300752B56 /* LFLiveAudioConfiguration.m in Sources */,
|
||||
84D8B3E21D75753300752B56 /* LFHardwareAudioEncoder.m in Sources */,
|
||||
84D8B3E01D75753300752B56 /* LFH264VideoEncoder.mm in Sources */,
|
||||
84D8B3FC1D75753300752B56 /* LFStreamingBuffer.m in Sources */,
|
||||
84D8B3E41D75753300752B56 /* LFHardwareVideoEncoder.m in Sources */,
|
||||
84D8B3FA1D75753300752B56 /* LFVideoFrame.m in Sources */,
|
||||
84D8B3D31D75753300752B56 /* LFAudioCapture.m in Sources */,
|
||||
84D8B4011D75753300752B56 /* NSMutableArray+LFAdd.m in Sources */,
|
||||
84D8B5D41D768B6E00752B56 /* LFGPUImageBeautyFilter.m in Sources */,
|
||||
84D8B5DD1D768B6E00752B56 /* LFFrame.m in Sources */,
|
||||
84D8B5DF1D768B6E00752B56 /* LFLiveDebug.m in Sources */,
|
||||
84D8B5BE1D768B6E00752B56 /* LFVideoCapture.m in Sources */,
|
||||
84D8B5DB1D768B6E00752B56 /* LFAudioFrame.m in Sources */,
|
||||
84D8B5E11D768B6E00752B56 /* LFLiveStreamInfo.m in Sources */,
|
||||
84D8B5C31D768B6E00752B56 /* LFNALUnit.cpp in Sources */,
|
||||
84D8B5C01D768B6E00752B56 /* LFAVEncoder.mm in Sources */,
|
||||
84D8B5C21D768B6E00752B56 /* LFMP4Atom.m in Sources */,
|
||||
84D8B5D21D768B6E00752B56 /* LFLiveVideoConfiguration.m in Sources */,
|
||||
84D8B5C61D768B6E00752B56 /* LFVideoEncoder.m in Sources */,
|
||||
84D8B5D61D768B6E00752B56 /* LFGPUImageEmptyFilter.m in Sources */,
|
||||
84D8B5D91D768B6E00752B56 /* LFLiveSession.m in Sources */,
|
||||
84D8B5E71D768B6E00752B56 /* LFStreamRtmpSocket.m in Sources */,
|
||||
84D8B5D01D768B6E00752B56 /* LFLiveAudioConfiguration.m in Sources */,
|
||||
84D8B5CB1D768B6E00752B56 /* LFHardwareAudioEncoder.m in Sources */,
|
||||
84D8B5C91D768B6E00752B56 /* LFH264VideoEncoder.mm in Sources */,
|
||||
84D8B5E51D768B6E00752B56 /* LFStreamingBuffer.m in Sources */,
|
||||
84D8B5CD1D768B6E00752B56 /* LFHardwareVideoEncoder.m in Sources */,
|
||||
84D8B5E31D768B6E00752B56 /* LFVideoFrame.m in Sources */,
|
||||
84D8B5BC1D768B6E00752B56 /* LFAudioCapture.m in Sources */,
|
||||
84D8B5EA1D768B6E00752B56 /* NSMutableArray+LFAdd.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -499,10 +500,6 @@
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"\"$(SRCROOT)/../Vendor/GPUImage.framework/Headers\"",
|
||||
"\"$(SRCROOT)/../Vendor/pili_rtmp.framework/Headers\"",
|
||||
);
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
|
||||
@@ -522,10 +519,6 @@
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"\"$(SRCROOT)/../Vendor/GPUImage.framework/Headers\"",
|
||||
"\"$(SRCROOT)/../Vendor/pili_rtmp.framework/Headers\"",
|
||||
);
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
|
||||
+4
-5
@@ -2,7 +2,7 @@
|
||||
Pod::Spec.new do |s|
|
||||
|
||||
s.name = "LFLiveKit"
|
||||
s.version = "2.2.2.8"
|
||||
s.version = "2.4.1"
|
||||
s.summary = "LaiFeng ios Live. LFLiveKit."
|
||||
s.homepage = "https://github.com/chenliming777"
|
||||
s.license = { :type => "MIT", :file => "LICENSE" }
|
||||
@@ -11,13 +11,12 @@ Pod::Spec.new do |s|
|
||||
s.ios.deployment_target = "7.0"
|
||||
s.source = { :git => "https://github.com/LaiFengiOS/LFLiveKit.git", :tag => "#{s.version}" }
|
||||
s.source_files = "LFLiveKit/**/*.{h,m,mm,cpp,c}"
|
||||
#s.public_header_files = "LFLiveKit/LFLiveKit/**/*.h"
|
||||
s.public_header_files = ['LFLiveKit/LFLiveKit/*.h', 'LFLiveKit/LFLiveKit/objects/*.h', 'LFLiveKit/LFLiveKit/configuration/*.h']
|
||||
s.public_header_files = ['LFLiveKit/*.h', 'LFLiveKit/objects/*.h', 'LFLiveKit/configuration/*.h']
|
||||
|
||||
s.frameworks = "VideoToolbox", "AudioToolbox","AVFoundation","Foundation","UIKit"
|
||||
s.libraries = "c++", "z"
|
||||
|
||||
s.requires_arc = true
|
||||
s.ios.vendored_frameworks = 'Vendor/GPUImage.framework','Vendor/pili_rtmp.framework'
|
||||
|
||||
s.dependency 'GPUImage'
|
||||
s.dependency 'pili-librtmp', '1.0.3.1'
|
||||
end
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// LFLiveKit.h
|
||||
// LFLiveKit
|
||||
//
|
||||
// Created by admin on 16/5/24.
|
||||
// Copyright © 2016年 admin. All rights reserved.
|
||||
//
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFLiveSession.h>
|
||||
#import <LFLiveKit/LFLiveAudioConfiguration.h>
|
||||
#import <LFLiveKit/LFLiveVideoConfiguration.h>
|
||||
#import <LFLiveKit/LFAudioFrame.h>
|
||||
#import <LFLiveKit/LFFrame.h>
|
||||
#import <LFLiveKit/LFLiveStreamInfo.h>
|
||||
#import <LFLiveKit/LFVideoFrame.h>
|
||||
#import <LFLiveKit/LFLiveDebug.h>
|
||||
#else
|
||||
#import "LFLiveSession.h"
|
||||
#import "LFLiveAudioConfiguration.h"
|
||||
#import "LFLiveVideoConfiguration.h"
|
||||
#import "LFAudioFrame.h"
|
||||
#import "LFFrame.h"
|
||||
#import "LFLiveStreamInfo.h"
|
||||
#import "LFVideoFrame.h"
|
||||
#import "LFLiveDebug.h"
|
||||
#endif
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
//
|
||||
// LFLiveKit.h
|
||||
// LFLiveKit
|
||||
//
|
||||
// Created by admin on 16/5/24.
|
||||
// Copyright © 2016年 admin. All rights reserved.
|
||||
//
|
||||
|
||||
#import "LFLiveSession.h"
|
||||
#import "LFLiveAudioConfiguration.h"
|
||||
#import "LFLiveVideoConfiguration.h"
|
||||
#import "LFAudioFrame.h"
|
||||
#import "LFFrame.h"
|
||||
#import "LFLiveStreamInfo.h"
|
||||
#import "LFVideoFrame.h"
|
||||
#import "LFLiveDebug.h"
|
||||
|
||||
//#import <LFLiveKit/LFLiveSession.h>
|
||||
//#import <LFLiveKit/LFLiveAudioConfiguration.h>
|
||||
//#import <LFLiveKit/LFLiveVideoConfiguration.h>
|
||||
//#import <LFLiveKit/LFAudioFrame.h>
|
||||
//#import <LFLiveKit/LFFrame.h>
|
||||
//#import <LFLiveKit/LFLiveStreamInfo.h>
|
||||
//#import <LFLiveKit/LFVideoFrame.h>
|
||||
//#import <LFLiveKit/LFLiveDebug.h>
|
||||
@@ -8,6 +8,14 @@
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFLiveStreamInfo.h>
|
||||
#import <LFLiveKit/LFAudioFrame.h>
|
||||
#import <LFLiveKit/LFVideoFrame.h>
|
||||
#import <LFLiveKit/LFLiveAudioConfiguration.h>
|
||||
#import <LFLiveKit/LFLiveVideoConfiguration.h>
|
||||
#import <LFLiveKit/LFLiveDebug.h>
|
||||
#else
|
||||
#import "LFLiveStreamInfo.h"
|
||||
#import "LFAudioFrame.h"
|
||||
#import "LFVideoFrame.h"
|
||||
@@ -15,6 +23,10 @@
|
||||
#import "LFLiveVideoConfiguration.h"
|
||||
#import "LFLiveDebug.h"
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
typedef NS_ENUM(NSInteger,LFLiveCaptureType) {
|
||||
LFLiveCaptureAudio, //< capture only audio
|
||||
LFLiveCaptureVideo, //< capture onlt video
|
||||
@@ -115,7 +127,15 @@ typedef NS_ENUM(NSInteger,LFLiveCaptureTypeMask) {
|
||||
*.*/
|
||||
@property (nonatomic, strong, nullable) UIView *warterMarkView;
|
||||
|
||||
/* The currentImage is videoCapture shot */
|
||||
@property (nonatomic, strong,readonly ,nullable) UIImage *currentImage;
|
||||
|
||||
/* The saveLocalVideo is save the local video */
|
||||
@property (nonatomic, assign) BOOL saveLocalVideo;
|
||||
|
||||
/* The saveLocalVideoPath is save the local video path */
|
||||
@property (nonatomic, strong, nullable) NSURL *saveLocalVideoPath;
|
||||
|
||||
#pragma mark - Initializer
|
||||
///=============================================================================
|
||||
/// @name Initializer
|
||||
@@ -90,8 +90,8 @@
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
self.videoCaptureSource.running = NO;
|
||||
self.audioCaptureSource.running = NO;
|
||||
_videoCaptureSource.running = NO;
|
||||
_audioCaptureSource.running = NO;
|
||||
}
|
||||
|
||||
#pragma mark -- CustomMethod
|
||||
@@ -100,7 +100,6 @@
|
||||
_streamInfo = streamInfo;
|
||||
_streamInfo.videoConfiguration = _videoConfiguration;
|
||||
_streamInfo.audioConfiguration = _audioConfiguration;
|
||||
_streamInfo.needDropFrame = (self.captureType & LFLiveCaptureMaskVideo || self.captureType & LFLiveInputMaskVideo) ? YES : NO;//< 有视频执行丢帧算法
|
||||
[self.socket start];
|
||||
}
|
||||
|
||||
@@ -110,15 +109,6 @@
|
||||
self.socket = nil;
|
||||
}
|
||||
|
||||
#pragma mark -- PrivateMethod
|
||||
- (void)pushSendBuffer:(LFFrame*)frame{
|
||||
if(self.relativeTimestamps == 0){
|
||||
self.relativeTimestamps = frame.timestamp;
|
||||
}
|
||||
frame.timestamp = [self uploadTimestamp:frame.timestamp];
|
||||
[self.socket sendFrame:frame];
|
||||
}
|
||||
|
||||
- (void)pushVideo:(nullable CVPixelBufferRef)pixelBuffer{
|
||||
if(self.captureType & LFLiveInputMaskVideo){
|
||||
if (self.uploading) [self.videoEncoder encodeVideoData:pixelBuffer timeStamp:NOW];
|
||||
@@ -131,6 +121,15 @@
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark -- PrivateMethod
|
||||
- (void)pushSendBuffer:(LFFrame*)frame{
|
||||
if(self.relativeTimestamps == 0){
|
||||
self.relativeTimestamps = frame.timestamp;
|
||||
}
|
||||
frame.timestamp = [self uploadTimestamp:frame.timestamp];
|
||||
[self.socket sendFrame:frame];
|
||||
}
|
||||
|
||||
#pragma mark -- CaptureDelegate
|
||||
- (void)captureOutput:(nullable LFAudioCapture *)capture audioData:(nullable NSData*)audioData {
|
||||
if (self.uploading) [self.audioEncoder encodeAudioData:audioData timeStamp:NOW];
|
||||
@@ -252,6 +251,23 @@
|
||||
[self didChangeValueForKey:@"beautyFace"];
|
||||
}
|
||||
|
||||
- (BOOL)saveLocalVideo{
|
||||
return self.videoCaptureSource.saveLocalVideo;
|
||||
}
|
||||
|
||||
- (void)setSaveLocalVideo:(BOOL)saveLocalVideo{
|
||||
[self.videoCaptureSource setSaveLocalVideo:saveLocalVideo];
|
||||
}
|
||||
|
||||
|
||||
- (NSURL*)saveLocalVideoPath{
|
||||
return self.videoCaptureSource.saveLocalVideoPath;
|
||||
}
|
||||
|
||||
- (void)setSaveLocalVideoPath:(NSURL*)saveLocalVideoPath{
|
||||
[self.videoCaptureSource setSaveLocalVideoPath:saveLocalVideoPath];
|
||||
}
|
||||
|
||||
- (BOOL)beautyFace {
|
||||
return self.videoCaptureSource.beautyFace;
|
||||
}
|
||||
@@ -8,7 +8,12 @@
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFLiveAudioConfiguration.h>
|
||||
#else
|
||||
#import "LFLiveAudioConfiguration.h"
|
||||
#endif
|
||||
|
||||
#pragma mark -- AudioCaptureNotification
|
||||
/** compoentFialed will post the notification */
|
||||
@@ -98,8 +98,9 @@ NSString *const LFAudioComponentFailedToCreateNotification = @"LFAudioComponentF
|
||||
- (void)dealloc {
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
|
||||
dispatch_sync(self.taskQueue, ^{
|
||||
dispatch_async(self.taskQueue, ^{
|
||||
if (self.componetInstance) {
|
||||
self.isRunning = NO;
|
||||
AudioOutputUnitStop(self.componetInstance);
|
||||
AudioComponentInstanceDispose(self.componetInstance);
|
||||
self.componetInstance = nil;
|
||||
@@ -120,7 +121,11 @@ NSString *const LFAudioComponentFailedToCreateNotification = @"LFAudioComponentF
|
||||
AudioOutputUnitStart(self.componetInstance);
|
||||
});
|
||||
} else {
|
||||
self.isRunning = NO;
|
||||
dispatch_async(self.taskQueue, ^{
|
||||
self.isRunning = NO;
|
||||
NSLog(@"MicrophoneSource: stopRunning");
|
||||
AudioOutputUnitStop(self.componetInstance);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -177,7 +182,7 @@ NSString *const LFAudioComponentFailedToCreateNotification = @"LFAudioComponentF
|
||||
reason = [[[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] integerValue];
|
||||
if (reason == AVAudioSessionInterruptionTypeBegan) {
|
||||
if (self.isRunning) {
|
||||
dispatch_sync(self.taskQueue, ^{
|
||||
dispatch_async(self.taskQueue, ^{
|
||||
NSLog(@"MicrophoneSource: stopRunning");
|
||||
AudioOutputUnitStop(self.componetInstance);
|
||||
});
|
||||
@@ -191,7 +196,7 @@ NSString *const LFAudioComponentFailedToCreateNotification = @"LFAudioComponentF
|
||||
case AVAudioSessionInterruptionOptionShouldResume:
|
||||
if (self.isRunning) {
|
||||
dispatch_async(self.taskQueue, ^{
|
||||
NSLog(@"MicrophoneSource: stopRunning");
|
||||
NSLog(@"MicrophoneSource: startRunning");
|
||||
AudioOutputUnitStart(self.componetInstance);
|
||||
});
|
||||
}
|
||||
@@ -234,15 +239,6 @@ static OSStatus handleInputBuffer(void *inRefCon,
|
||||
inNumberFrames,
|
||||
&buffers);
|
||||
|
||||
if (!source.isRunning) {
|
||||
dispatch_sync(source.taskQueue, ^{
|
||||
NSLog(@"MicrophoneSource: stopRunning");
|
||||
AudioOutputUnitStop(source.componetInstance);
|
||||
});
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
if (source.muted) {
|
||||
for (int i = 0; i < buffers.mNumberBuffers; i++) {
|
||||
AudioBuffer ab = buffers.mBuffers[i];
|
||||
@@ -8,7 +8,12 @@
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFLiveVideoConfiguration.h>
|
||||
#else
|
||||
#import "LFLiveVideoConfiguration.h"
|
||||
#endif
|
||||
|
||||
@class LFVideoCapture;
|
||||
/** LFVideoCapture callback videoData */
|
||||
@@ -59,7 +64,15 @@
|
||||
/*** The warterMarkView control whether the watermark is displayed or not ,if set ni,will remove watermark,otherwise add *.*/
|
||||
@property (nonatomic, strong, nullable) UIView *warterMarkView;
|
||||
|
||||
/* The currentImage is videoCapture shot */
|
||||
@property (nonatomic, strong, nullable) UIImage *currentImage;
|
||||
|
||||
/* The saveLocalVideo is save the local video */
|
||||
@property (nonatomic, assign) BOOL saveLocalVideo;
|
||||
|
||||
/* The saveLocalVideoPath is save the local video path */
|
||||
@property (nonatomic, strong, nullable) NSURL *saveLocalVideoPath;
|
||||
|
||||
#pragma mark - Initializer
|
||||
///=============================================================================
|
||||
/// @name Initializer
|
||||
@@ -32,6 +32,8 @@
|
||||
@property (nonatomic, strong) GPUImageUIElement *uiElementInput;
|
||||
@property (nonatomic, strong) UIView *waterMarkContentView;
|
||||
|
||||
@property (nonatomic, strong) GPUImageMovieWriter *movieWriter;
|
||||
|
||||
@end
|
||||
|
||||
@implementation LFVideoCapture
|
||||
@@ -48,6 +50,7 @@
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterBackground:) name:UIApplicationWillResignActiveNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterForeground:) name:UIApplicationDidBecomeActiveNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarChanged:) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];
|
||||
|
||||
self.beautyFace = YES;
|
||||
self.beautyLevel = 0.5;
|
||||
self.brightLevel = 0.5;
|
||||
@@ -60,10 +63,10 @@
|
||||
- (void)dealloc {
|
||||
[UIApplication sharedApplication].idleTimerDisabled = NO;
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
[self.videoCamera stopCameraCapture];
|
||||
if(self.gpuImageView){
|
||||
[self.gpuImageView removeFromSuperview];
|
||||
self.gpuImageView = nil;
|
||||
[_videoCamera stopCameraCapture];
|
||||
if(_gpuImageView){
|
||||
[_gpuImageView removeFromSuperview];
|
||||
_gpuImageView = nil;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,22 +75,8 @@
|
||||
- (GPUImageVideoCamera *)videoCamera{
|
||||
if(!_videoCamera){
|
||||
_videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:_configuration.avSessionPreset cameraPosition:AVCaptureDevicePositionFront];
|
||||
UIInterfaceOrientation statusBar = [[UIApplication sharedApplication] statusBarOrientation];
|
||||
if (self.configuration.landscape) {
|
||||
if (statusBar != UIInterfaceOrientationLandscapeLeft && statusBar != UIInterfaceOrientationLandscapeRight) {
|
||||
@throw [NSException exceptionWithName:@"当前设置方向出错" reason:@"LFLiveVideoConfiguration landscape error" userInfo:nil];
|
||||
} else {
|
||||
_videoCamera.outputImageOrientation = statusBar;
|
||||
}
|
||||
} else {
|
||||
if (statusBar != UIInterfaceOrientationPortrait && statusBar != UIInterfaceOrientationPortraitUpsideDown) {
|
||||
@throw [NSException exceptionWithName:@"当前设置方向出错" reason:@"LFLiveVideoConfiguration landscape error" userInfo:nil];
|
||||
} else {
|
||||
_videoCamera.outputImageOrientation = statusBar;
|
||||
}
|
||||
}
|
||||
|
||||
_videoCamera.horizontallyMirrorFrontFacingCamera = YES;
|
||||
_videoCamera.outputImageOrientation = _configuration.outputImageOrientation;
|
||||
_videoCamera.horizontallyMirrorFrontFacingCamera = NO;
|
||||
_videoCamera.horizontallyMirrorRearFacingCamera = NO;
|
||||
_videoCamera.frameRate = (int32_t)_configuration.videoFrameRate;
|
||||
}
|
||||
@@ -101,10 +90,12 @@
|
||||
if (!_running) {
|
||||
[UIApplication sharedApplication].idleTimerDisabled = NO;
|
||||
[self.videoCamera stopCameraCapture];
|
||||
if(self.saveLocalVideo) [self.movieWriter finishRecording];
|
||||
} else {
|
||||
[UIApplication sharedApplication].idleTimerDisabled = YES;
|
||||
[self reloadFilter];
|
||||
[self.videoCamera startCameraCapture];
|
||||
if(self.saveLocalVideo) [self.movieWriter startRecording];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,6 +112,7 @@
|
||||
- (void)setCaptureDevicePosition:(AVCaptureDevicePosition)captureDevicePosition {
|
||||
[self.videoCamera rotateCamera];
|
||||
self.videoCamera.frameRate = (int32_t)_configuration.videoFrameRate;
|
||||
[self reloadMirror];
|
||||
}
|
||||
|
||||
- (AVCaptureDevicePosition)captureDevicePosition {
|
||||
@@ -167,7 +159,6 @@
|
||||
|
||||
- (void)setMirror:(BOOL)mirror {
|
||||
_mirror = mirror;
|
||||
self.videoCamera.horizontallyMirrorFrontFacingCamera = mirror;
|
||||
}
|
||||
|
||||
- (void)setBeautyFace:(BOOL)beautyFace{
|
||||
@@ -265,19 +256,28 @@
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (GPUImageMovieWriter*)movieWriter{
|
||||
if(!_movieWriter){
|
||||
_movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:self.saveLocalVideoPath size:self.configuration.videoSize];
|
||||
_movieWriter.encodingLiveVideo = YES;
|
||||
_movieWriter.shouldPassthroughAudio = YES;
|
||||
self.videoCamera.audioEncodingTarget = self.movieWriter;
|
||||
}
|
||||
return _movieWriter;
|
||||
}
|
||||
|
||||
#pragma mark -- Custom Method
|
||||
- (void)processVideo:(GPUImageOutput *)output {
|
||||
__weak typeof(self) _self = self;
|
||||
@autoreleasepool {
|
||||
GPUImageFramebuffer *imageFramebuffer = output.framebufferForOutput;
|
||||
CVPixelBufferRef pixelBuffer = [imageFramebuffer pixelBuffer];
|
||||
if (pixelBuffer && _self.delegate && [_self.delegate respondsToSelector:@selector(captureOutput:pixelBuffer:)]) {
|
||||
[_self.delegate captureOutput:_self pixelBuffer:pixelBuffer];
|
||||
}
|
||||
//CVPixelBufferRef pixelBuffer = [imageFramebuffer pixelBuffer];
|
||||
//if (pixelBuffer && _self.delegate && [_self.delegate respondsToSelector:@selector(captureOutput:pixelBuffer:)]) {
|
||||
//[_self.delegate captureOutput:_self pixelBuffer:pixelBuffer];
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)reloadFilter{
|
||||
[self.filter removeAllTargets];
|
||||
[self.blendFilter removeAllTargets];
|
||||
@@ -296,6 +296,9 @@
|
||||
self.beautyFilter = nil;
|
||||
}
|
||||
|
||||
///< 调节镜像
|
||||
[self reloadMirror];
|
||||
|
||||
//< 480*640 比例为4:3 强制转换为16:9
|
||||
if([self.configuration.avSessionPreset isEqualToString:AVCaptureSessionPreset640x480]){
|
||||
CGRect cropRect = self.configuration.landscape ? CGRectMake(0, 0.125, 1, 0.75) : CGRectMake(0.125, 0, 0.75, 1);
|
||||
@@ -311,11 +314,13 @@
|
||||
[self.filter addTarget:self.blendFilter];
|
||||
[self.uiElementInput addTarget:self.blendFilter];
|
||||
[self.blendFilter addTarget:self.gpuImageView];
|
||||
if(self.saveLocalVideo) [self.blendFilter addTarget:self.movieWriter];
|
||||
[self.filter addTarget:self.output];
|
||||
[self.uiElementInput update];
|
||||
}else{
|
||||
[self.filter addTarget:self.output];
|
||||
[self.output addTarget:self.gpuImageView];
|
||||
if(self.saveLocalVideo) [self.output addTarget:self.movieWriter];
|
||||
}
|
||||
|
||||
[self.filter forceProcessingAtSize:self.configuration.videoSize];
|
||||
@@ -323,6 +328,7 @@
|
||||
[self.blendFilter forceProcessingAtSize:self.configuration.videoSize];
|
||||
[self.uiElementInput forceProcessingAtSize:self.configuration.videoSize];
|
||||
|
||||
|
||||
//< 输出数据
|
||||
__weak typeof(self) _self = self;
|
||||
[self.output setFrameProcessingCompletionBlock:^(GPUImageOutput *output, CMTime time) {
|
||||
@@ -331,6 +337,14 @@
|
||||
|
||||
}
|
||||
|
||||
- (void)reloadMirror{
|
||||
if(self.mirror && self.captureDevicePosition == AVCaptureDevicePositionFront){
|
||||
self.videoCamera.horizontallyMirrorFrontFacingCamera = YES;
|
||||
}else{
|
||||
self.videoCamera.horizontallyMirrorFrontFacingCamera = NO;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark Notification
|
||||
|
||||
- (void)willEnterBackground:(NSNotification *)notification {
|
||||
@@ -349,17 +363,20 @@
|
||||
- (void)statusBarChanged:(NSNotification *)notification {
|
||||
NSLog(@"UIApplicationWillChangeStatusBarOrientationNotification. UserInfo: %@", notification.userInfo);
|
||||
UIInterfaceOrientation statusBar = [[UIApplication sharedApplication] statusBarOrientation];
|
||||
if (self.configuration.landscape) {
|
||||
if (statusBar == UIInterfaceOrientationLandscapeLeft) {
|
||||
self.videoCamera.outputImageOrientation = UIInterfaceOrientationLandscapeRight;
|
||||
} else if (statusBar == UIInterfaceOrientationLandscapeRight) {
|
||||
self.videoCamera.outputImageOrientation = UIInterfaceOrientationLandscapeLeft;
|
||||
}
|
||||
} else {
|
||||
if (statusBar == UIInterfaceOrientationPortrait) {
|
||||
self.videoCamera.outputImageOrientation = UIInterfaceOrientationPortraitUpsideDown;
|
||||
} else if (statusBar == UIInterfaceOrientationPortraitUpsideDown) {
|
||||
self.videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
|
||||
|
||||
if(self.configuration.autorotate){
|
||||
if (self.configuration.landscape) {
|
||||
if (statusBar == UIInterfaceOrientationLandscapeLeft) {
|
||||
self.videoCamera.outputImageOrientation = UIInterfaceOrientationLandscapeRight;
|
||||
} else if (statusBar == UIInterfaceOrientationLandscapeRight) {
|
||||
self.videoCamera.outputImageOrientation = UIInterfaceOrientationLandscapeLeft;
|
||||
}
|
||||
} else {
|
||||
if (statusBar == UIInterfaceOrientationPortrait) {
|
||||
self.videoCamera.outputImageOrientation = UIInterfaceOrientationPortraitUpsideDown;
|
||||
} else if (statusBar == UIInterfaceOrientationPortraitUpsideDown) {
|
||||
self.videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,9 +11,17 @@
|
||||
#import <AVFoundation/AVAssetWriterInput.h>
|
||||
#import <AVFoundation/AVMediaFormat.h>
|
||||
#import <AVFoundation/AVVideoSettings.h>
|
||||
#import "sys/stat.h"
|
||||
#import <sys/stat.h>
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFVideoEncoder.h>
|
||||
#import <LFLiveKit/LFMP4Atom.h>
|
||||
#else
|
||||
#import "LFVideoEncoder.h"
|
||||
#import "LFMP4Atom.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
typedef int (^encoder_handler_t)(NSArray *data, CMTimeValue ptsValue);
|
||||
typedef int (^param_handler_t)(NSData *params);
|
||||
+4
-4
@@ -7,10 +7,10 @@
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "AVFoundation/AVAssetWriter.h"
|
||||
#import "AVFoundation/AVAssetWriterInput.h"
|
||||
#import "AVFoundation/AVMediaFormat.h"
|
||||
#import "AVFoundation/AVVideoSettings.h"
|
||||
#import <AVFoundation/AVAssetWriter.h>
|
||||
#import <AVFoundation/AVAssetWriterInput.h>
|
||||
#import <AVFoundation/AVMediaFormat.h>
|
||||
#import <AVFoundation/AVVideoSettings.h>
|
||||
|
||||
@interface LFVideoEncoder : NSObject
|
||||
|
||||
@@ -8,8 +8,15 @@
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFAudioFrame.h>
|
||||
#import <LFLiveKit/LFLiveAudioConfiguration.h>
|
||||
#else
|
||||
#import "LFAudioFrame.h"
|
||||
#import "LFLiveAudioConfiguration.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@protocol LFAudioEncoding;
|
||||
/// 编码器编码后回调
|
||||
@@ -5,7 +5,12 @@
|
||||
// Created by feng on 7/5/16.
|
||||
// Copyright (c) 2014 zhanqi.tv. All rights reserved.
|
||||
//
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFVideoEncoding.h>
|
||||
#else
|
||||
#import "LFVideoEncoding.h"
|
||||
#endif
|
||||
|
||||
@interface LFH264VideoEncoder : NSObject <LFVideoEncoding> {
|
||||
|
||||
+4
@@ -6,7 +6,11 @@
|
||||
// Copyright © 2016年 倾慕. All rights reserved.
|
||||
//
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFAudioEncoding.h>
|
||||
#else
|
||||
#import "LFAudioEncoding.h"
|
||||
#endif
|
||||
|
||||
@interface LFHardwareAudioEncoder : NSObject<LFAudioEncoding>
|
||||
|
||||
+3
-1
@@ -48,6 +48,7 @@
|
||||
- (void)dealloc {
|
||||
if (aacBuf) free(aacBuf);
|
||||
if (leftBuf) free(leftBuf);
|
||||
if(m_converter) AudioConverterDispose(m_converter);
|
||||
}
|
||||
|
||||
#pragma mark -- LFAudioEncoder
|
||||
@@ -75,12 +76,13 @@
|
||||
[self encodeBuffer:p timeStamp:timeStamp];
|
||||
p += self.configuration.bufferLength;
|
||||
}
|
||||
free(totalBuf);
|
||||
|
||||
leftLength = totalSize%self.configuration.bufferLength;
|
||||
memset(leftBuf, 0, self.configuration.bufferLength);
|
||||
memcpy(leftBuf, totalBuf + (totalSize -leftLength), leftLength);
|
||||
|
||||
free(totalBuf);
|
||||
|
||||
}else{
|
||||
///< 积累
|
||||
memcpy(leftBuf+leftLength, audioData.bytes, audioData.length);
|
||||
+4
@@ -6,7 +6,11 @@
|
||||
// Copyright © 2016年 倾慕. All rights reserved.
|
||||
//
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFVideoEncoding.h>
|
||||
#else
|
||||
#import "LFVideoEncoding.h"
|
||||
#endif
|
||||
|
||||
@interface LFHardwareVideoEncoder : NSObject<LFVideoEncoding>
|
||||
|
||||
+8
-21
@@ -20,7 +20,6 @@
|
||||
|
||||
@property (nonatomic, strong) LFLiveVideoConfiguration *configuration;
|
||||
@property (nonatomic, weak) id<LFVideoEncodingDelegate> h264Delegate;
|
||||
@property (nonatomic) BOOL isBackGround;
|
||||
@property (nonatomic) NSInteger currentVideoBitRate;
|
||||
|
||||
@end
|
||||
@@ -32,20 +31,18 @@
|
||||
if (self = [super init]) {
|
||||
NSLog(@"USE LFHardwareVideoEncoder");
|
||||
_configuration = configuration;
|
||||
[self initCompressionSession];
|
||||
[self resetCompressionSession];
|
||||
|
||||
#ifdef DEBUG
|
||||
enabledWriteVideoFile = NO;
|
||||
[self initForFilePath];
|
||||
#endif
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterBackground:) name:UIApplicationWillResignActiveNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterForeground:) name:UIApplicationDidBecomeActiveNotification object:nil];
|
||||
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)initCompressionSession {
|
||||
- (void)resetCompressionSession {
|
||||
if (compressionSession) {
|
||||
VTCompressionSessionCompleteFrames(compressionSession, kCMTimeInvalid);
|
||||
|
||||
@@ -75,7 +72,6 @@
|
||||
}
|
||||
|
||||
- (void)setVideoBitRate:(NSInteger)videoBitRate {
|
||||
if (_isBackGround) return;
|
||||
VTSessionSetProperty(compressionSession, kVTCompressionPropertyKey_AverageBitRate, (__bridge CFTypeRef)@(videoBitRate));
|
||||
NSArray *limit = @[@(videoBitRate * 1.5/8), @(1)];
|
||||
VTSessionSetProperty(compressionSession, kVTCompressionPropertyKey_DataRateLimits, (__bridge CFArrayRef)limit);
|
||||
@@ -94,13 +90,11 @@
|
||||
CFRelease(compressionSession);
|
||||
compressionSession = NULL;
|
||||
}
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
}
|
||||
|
||||
#pragma mark -- LFVideoEncoder
|
||||
- (void)encodeVideoData:(CVPixelBufferRef)pixelBuffer timeStamp:(uint64_t)timeStamp {
|
||||
if (_isBackGround) return;
|
||||
|
||||
|
||||
frameCount++;
|
||||
CMTime presentationTimeStamp = CMTimeMake(frameCount, (int32_t)_configuration.videoFrameRate);
|
||||
VTEncodeInfoFlags flags;
|
||||
@@ -112,7 +106,10 @@
|
||||
}
|
||||
NSNumber *timeNumber = @(timeStamp);
|
||||
|
||||
VTCompressionSessionEncodeFrame(compressionSession, pixelBuffer, presentationTimeStamp, duration, (__bridge CFDictionaryRef)properties, (__bridge_retained void *)timeNumber, &flags);
|
||||
OSStatus status = VTCompressionSessionEncodeFrame(compressionSession, pixelBuffer, presentationTimeStamp, duration, (__bridge CFDictionaryRef)properties, (__bridge_retained void *)timeNumber, &flags);
|
||||
if(status != noErr){
|
||||
[self resetCompressionSession];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)stopEncoder {
|
||||
@@ -123,16 +120,6 @@
|
||||
_h264Delegate = delegate;
|
||||
}
|
||||
|
||||
#pragma mark -- NSNotification
|
||||
- (void)willEnterBackground:(NSNotification *)notification {
|
||||
_isBackGround = YES;
|
||||
}
|
||||
|
||||
- (void)willEnterForeground:(NSNotification *)notification {
|
||||
[self initCompressionSession];
|
||||
_isBackGround = NO;
|
||||
}
|
||||
|
||||
#pragma mark -- VideoCallBack
|
||||
static void VideoCompressonOutputCallback(void *VTref, void *VTFrameRef, OSStatus status, VTEncodeInfoFlags infoFlags, CMSampleBufferRef sampleBuffer){
|
||||
if (!sampleBuffer) return;
|
||||
@@ -7,8 +7,15 @@
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFVideoFrame.h>
|
||||
#import <LFLiveKit/LFLiveVideoConfiguration.h>
|
||||
#else
|
||||
#import "LFVideoFrame.h"
|
||||
#import "LFLiveVideoConfiguration.h"
|
||||
#endif
|
||||
|
||||
|
||||
@protocol LFVideoEncoding;
|
||||
/// 编码器编码后回调
|
||||
+8
-2
@@ -51,7 +51,7 @@ typedef NS_ENUM (NSUInteger, LFLiveVideoQuality){
|
||||
+ (instancetype)defaultConfigurationForQuality:(LFLiveVideoQuality)videoQuality;
|
||||
|
||||
/// 视频配置(质量 & 是否是横屏)
|
||||
+ (instancetype)defaultConfigurationForQuality:(LFLiveVideoQuality)videoQuality landscape:(BOOL)landscape;
|
||||
+ (instancetype)defaultConfigurationForQuality:(LFLiveVideoQuality)videoQuality outputImageOrientation:(UIInterfaceOrientation)outputImageOrientation;
|
||||
|
||||
#pragma mark - Attribute
|
||||
///=============================================================================
|
||||
@@ -64,7 +64,10 @@ typedef NS_ENUM (NSUInteger, LFLiveVideoQuality){
|
||||
@property (nonatomic, assign) BOOL videoSizeRespectingAspectRatio;
|
||||
|
||||
/// 视频输出方向
|
||||
@property (nonatomic, assign) BOOL landscape;
|
||||
@property (nonatomic, assign) UIInterfaceOrientation outputImageOrientation;
|
||||
|
||||
/// 自动旋转(这里只支持 left 变 right portrait 变 portraitUpsideDown)
|
||||
@property (nonatomic, assign) BOOL autorotate;
|
||||
|
||||
/// 视频的帧率,即 fps
|
||||
@property (nonatomic, assign) NSUInteger videoFrameRate;
|
||||
@@ -93,4 +96,7 @@ typedef NS_ENUM (NSUInteger, LFLiveVideoQuality){
|
||||
///< ≈sde3分辨率
|
||||
@property (nonatomic, assign, readonly) NSString *avSessionPreset;
|
||||
|
||||
///< 是否是横屏
|
||||
@property (nonatomic, assign, readonly) BOOL landscape;
|
||||
|
||||
@end
|
||||
+19
-10
@@ -20,11 +20,11 @@
|
||||
}
|
||||
|
||||
+ (instancetype)defaultConfigurationForQuality:(LFLiveVideoQuality)videoQuality {
|
||||
LFLiveVideoConfiguration *configuration = [LFLiveVideoConfiguration defaultConfigurationForQuality:videoQuality landscape:NO];
|
||||
LFLiveVideoConfiguration *configuration = [LFLiveVideoConfiguration defaultConfigurationForQuality:videoQuality outputImageOrientation:UIInterfaceOrientationPortrait];
|
||||
return configuration;
|
||||
}
|
||||
|
||||
+ (instancetype)defaultConfigurationForQuality:(LFLiveVideoQuality)videoQuality landscape:(BOOL)landscape {
|
||||
+ (instancetype)defaultConfigurationForQuality:(LFLiveVideoQuality)videoQuality outputImageOrientation:(UIInterfaceOrientation)outputImageOrientation {
|
||||
LFLiveVideoConfiguration *configuration = [LFLiveVideoConfiguration new];
|
||||
switch (videoQuality) {
|
||||
case LFLiveVideoQuality_Low1:{
|
||||
@@ -131,9 +131,9 @@
|
||||
}
|
||||
configuration.sessionPreset = [configuration supportSessionPreset:configuration.sessionPreset];
|
||||
configuration.videoMaxKeyframeInterval = configuration.videoFrameRate*2;
|
||||
configuration.landscape = landscape;
|
||||
configuration.outputImageOrientation = outputImageOrientation;
|
||||
CGSize size = configuration.videoSize;
|
||||
if (landscape) {
|
||||
if(configuration.landscape) {
|
||||
configuration.videoSize = CGSizeMake(size.height, size.width);
|
||||
} else {
|
||||
configuration.videoSize = CGSizeMake(size.width, size.height);
|
||||
@@ -166,6 +166,10 @@
|
||||
return avSessionPreset;
|
||||
}
|
||||
|
||||
- (BOOL)landscape{
|
||||
return (self.outputImageOrientation == UIInterfaceOrientationLandscapeLeft || self.outputImageOrientation == UIInterfaceOrientationLandscapeRight) ? YES : NO;
|
||||
}
|
||||
|
||||
- (CGSize)videoSize{
|
||||
if(_videoSizeRespectingAspectRatio){
|
||||
return self.aspectRatioVideoSize;
|
||||
@@ -249,7 +253,7 @@
|
||||
break;
|
||||
}
|
||||
|
||||
if(self.landscape){
|
||||
if (self.landscape){
|
||||
return CGSizeMake(videoSize.height, videoSize.width);
|
||||
}
|
||||
return videoSize;
|
||||
@@ -275,7 +279,8 @@
|
||||
[aCoder encodeObject:@(self.videoMaxBitRate) forKey:@"videoMaxBitRate"];
|
||||
[aCoder encodeObject:@(self.videoMinBitRate) forKey:@"videoMinBitRate"];
|
||||
[aCoder encodeObject:@(self.sessionPreset) forKey:@"sessionPreset"];
|
||||
[aCoder encodeObject:@(self.landscape) forKey:@"landscape"];
|
||||
[aCoder encodeObject:@(self.outputImageOrientation) forKey:@"outputImageOrientation"];
|
||||
[aCoder encodeObject:@(self.autorotate) forKey:@"autorotate"];
|
||||
[aCoder encodeObject:@(self.videoSizeRespectingAspectRatio) forKey:@"videoSizeRespectingAspectRatio"];
|
||||
}
|
||||
|
||||
@@ -290,7 +295,8 @@
|
||||
_videoMaxBitRate = [[aDecoder decodeObjectForKey:@"videoMaxBitRate"] unsignedIntegerValue];
|
||||
_videoMinBitRate = [[aDecoder decodeObjectForKey:@"videoMinBitRate"] unsignedIntegerValue];
|
||||
_sessionPreset = [[aDecoder decodeObjectForKey:@"sessionPreset"] unsignedIntegerValue];
|
||||
_landscape = [[aDecoder decodeObjectForKey:@"landscape"] unsignedIntegerValue];
|
||||
_outputImageOrientation = [[aDecoder decodeObjectForKey:@"outputImageOrientation"] unsignedIntegerValue];
|
||||
_autorotate = [[aDecoder decodeObjectForKey:@"autorotate"] boolValue];
|
||||
_videoSizeRespectingAspectRatio = [[aDecoder decodeObjectForKey:@"videoSizeRespectingAspectRatio"] unsignedIntegerValue];
|
||||
return self;
|
||||
}
|
||||
@@ -307,7 +313,8 @@
|
||||
@(self.videoMinBitRate),
|
||||
self.avSessionPreset,
|
||||
@(self.sessionPreset),
|
||||
@(self.landscape),
|
||||
@(self.outputImageOrientation),
|
||||
@(self.autorotate),
|
||||
@(self.videoSizeRespectingAspectRatio)];
|
||||
|
||||
for (NSObject *value in values) {
|
||||
@@ -333,7 +340,8 @@
|
||||
object.videoMinBitRate == self.videoMinBitRate &&
|
||||
[object.avSessionPreset isEqualToString:self.avSessionPreset] &&
|
||||
object.sessionPreset == self.sessionPreset &&
|
||||
object.landscape == self.landscape &&
|
||||
object.outputImageOrientation == self.outputImageOrientation &&
|
||||
object.autorotate == self.autorotate &&
|
||||
object.videoSizeRespectingAspectRatio == self.videoSizeRespectingAspectRatio;
|
||||
}
|
||||
}
|
||||
@@ -357,7 +365,8 @@
|
||||
[desc appendFormat:@" videoMinBitRate:%zi", self.videoMinBitRate];
|
||||
[desc appendFormat:@" avSessionPreset:%@", self.avSessionPreset];
|
||||
[desc appendFormat:@" sessionPreset:%zi", self.sessionPreset];
|
||||
[desc appendFormat:@" landscape:%zi", self.landscape];
|
||||
[desc appendFormat:@" outputImageOrientation:%zi", self.outputImageOrientation];
|
||||
[desc appendFormat:@" autorotate:%zi", self.autorotate];
|
||||
return desc;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,11 @@
|
||||
// Copyright © 2016年 倾慕. All rights reserved.
|
||||
//
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFFrame.h>
|
||||
#else
|
||||
#import "LFFrame.h"
|
||||
#endif
|
||||
|
||||
@interface LFAudioFrame : LFFrame
|
||||
|
||||
+11
-3
@@ -7,8 +7,16 @@
|
||||
// 真正的上传地址 token等
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFLiveAudioConfiguration.h>
|
||||
#import <LFLiveKit/LFLiveVideoConfiguration.h>
|
||||
#else
|
||||
#import "LFLiveAudioConfiguration.h"
|
||||
#import "LFLiveVideoConfiguration.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/// 流状态
|
||||
typedef NS_ENUM (NSUInteger, LFLiveState){
|
||||
@@ -21,7 +29,9 @@ typedef NS_ENUM (NSUInteger, LFLiveState){
|
||||
/// 已断开
|
||||
LFLiveStop = 3,
|
||||
/// 连接出错
|
||||
LFLiveError = 4
|
||||
LFLiveError = 4,
|
||||
/// 正在刷新
|
||||
LFLiveRefresh = 5
|
||||
};
|
||||
|
||||
typedef NS_ENUM (NSUInteger, LFLiveSocketErrorCode) {
|
||||
@@ -45,7 +55,5 @@ typedef NS_ENUM (NSUInteger, LFLiveSocketErrorCode) {
|
||||
@property (nonatomic, strong) LFLiveAudioConfiguration *audioConfiguration;
|
||||
///视频配置
|
||||
@property (nonatomic, strong) LFLiveVideoConfiguration *videoConfiguration;
|
||||
///是否丢帧
|
||||
@property (nonatomic, assign) BOOL needDropFrame;
|
||||
|
||||
@end
|
||||
@@ -6,7 +6,12 @@
|
||||
// Copyright © 2016年 倾慕. All rights reserved.
|
||||
//
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFFrame.h>
|
||||
#else
|
||||
#import "LFFrame.h"
|
||||
#endif
|
||||
|
||||
|
||||
@interface LFVideoFrame : LFFrame
|
||||
|
||||
+4
@@ -6,7 +6,11 @@
|
||||
// Copyright © 2016年 live Interactive. All rights reserved.
|
||||
//
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFStreamSocket.h>
|
||||
#else
|
||||
#import "LFStreamSocket.h"
|
||||
#endif
|
||||
|
||||
@interface LFStreamRTMPSocket : NSObject<LFStreamSocket>
|
||||
|
||||
+102
-81
@@ -8,15 +8,15 @@
|
||||
|
||||
#import "LFStreamRTMPSocket.h"
|
||||
|
||||
#if __has_include(<pili_rtmp/rtmp.h>)
|
||||
#import <pili_rtmp/rtmp.h>
|
||||
#elif __has_include("pili_rtmp/rtmp.h")
|
||||
#import "pili_rtmp/rtmp.h"
|
||||
#if __has_include(<pili-librtmp/rtmp.h>)
|
||||
#import <pili-librtmp/rtmp.h>
|
||||
#elif __has_include("pili-librtmp/rtmp.h")
|
||||
#import "pili-librtmp/rtmp.h"
|
||||
#else
|
||||
#import "rtmp.h"
|
||||
#endif
|
||||
|
||||
static const NSInteger RetryTimesBreaken = 20; ///< 重连1分钟 3秒一次 一共20次
|
||||
static const NSInteger RetryTimesBreaken = 5; ///< 重连1分钟 3秒一次 一共20次
|
||||
static const NSInteger RetryTimesMargin = 3;
|
||||
|
||||
|
||||
@@ -112,12 +112,24 @@ SAVC(mp4a);
|
||||
self.debugInfo.streamId = self.stream.streamId;
|
||||
self.debugInfo.uploadUrl = self.stream.url;
|
||||
self.debugInfo.isRtmp = YES;
|
||||
if (_isConnecting) return;
|
||||
|
||||
_isConnecting = YES;
|
||||
if (self.delegate && [self.delegate respondsToSelector:@selector(socketStatus:status:)]) {
|
||||
[self.delegate socketStatus:self status:LFLivePending];
|
||||
}
|
||||
|
||||
if (_rtmp != NULL) {
|
||||
PILI_RTMP_Close(_rtmp, &_error);
|
||||
PILI_RTMP_Free(_rtmp);
|
||||
}
|
||||
[self RTMP264_Connect:(char *)[_stream.url cStringUsingEncoding:NSASCIIStringEncoding]];
|
||||
}
|
||||
|
||||
- (void)stop {
|
||||
dispatch_async(self.rtmpSendQueue, ^{
|
||||
[self _stop];
|
||||
[NSObject cancelPreviousPerformRequestsWithTarget:self];
|
||||
});
|
||||
}
|
||||
|
||||
@@ -131,12 +143,12 @@ SAVC(mp4a);
|
||||
_rtmp = NULL;
|
||||
}
|
||||
[self clean];
|
||||
[NSObject cancelPreviousPerformRequestsWithTarget:self];
|
||||
}
|
||||
|
||||
- (void)sendFrame:(LFFrame *)frame {
|
||||
if (!frame) return;
|
||||
[self.buffer appendObject:frame];
|
||||
|
||||
if(!self.isSending){
|
||||
[self sendFrame];
|
||||
}
|
||||
@@ -148,74 +160,75 @@ SAVC(mp4a);
|
||||
|
||||
#pragma mark -- CustomMethod
|
||||
- (void)sendFrame {
|
||||
__weak typeof(self) _self = self;
|
||||
dispatch_async(self.rtmpSendQueue, ^{
|
||||
if (!self.isSending && self.buffer.list.count > 0) {
|
||||
self.isSending = YES;
|
||||
if (!_self.isSending && _self.buffer.list.count > 0) {
|
||||
_self.isSending = YES;
|
||||
|
||||
if (!_isConnected || _isReconnecting || _isConnecting || !_rtmp){
|
||||
self.isSending = NO;
|
||||
if (!_self.isConnected || _self.isReconnecting || _self.isConnecting || !_rtmp){
|
||||
_self.isSending = NO;
|
||||
return;
|
||||
}
|
||||
|
||||
// 调用发送接口
|
||||
LFFrame *frame = [self.buffer popFirstObject];
|
||||
LFFrame *frame = [_self.buffer popFirstObject];
|
||||
if ([frame isKindOfClass:[LFVideoFrame class]]) {
|
||||
if (!self.sendVideoHead) {
|
||||
self.sendVideoHead = YES;
|
||||
if (!_self.sendVideoHead) {
|
||||
_self.sendVideoHead = YES;
|
||||
if(!((LFVideoFrame*)frame).sps || !((LFVideoFrame*)frame).pps){
|
||||
self.isSending = NO;
|
||||
_self.isSending = NO;
|
||||
return;
|
||||
}
|
||||
[self sendVideoHeader:(LFVideoFrame *)frame];
|
||||
[_self sendVideoHeader:(LFVideoFrame *)frame];
|
||||
} else {
|
||||
[self sendVideo:(LFVideoFrame *)frame];
|
||||
[_self sendVideo:(LFVideoFrame *)frame];
|
||||
}
|
||||
} else {
|
||||
if (!self.sendAudioHead) {
|
||||
self.sendAudioHead = YES;
|
||||
if (!_self.sendAudioHead) {
|
||||
_self.sendAudioHead = YES;
|
||||
if(!((LFAudioFrame*)frame).audioInfo){
|
||||
self.isSending = NO;
|
||||
_self.isSending = NO;
|
||||
return;
|
||||
}
|
||||
[self sendAudioHeader:(LFAudioFrame *)frame];
|
||||
[_self sendAudioHeader:(LFAudioFrame *)frame];
|
||||
} else {
|
||||
[self sendAudio:frame];
|
||||
[_self sendAudio:frame];
|
||||
}
|
||||
}
|
||||
|
||||
//debug更新
|
||||
self.debugInfo.totalFrame++;
|
||||
self.debugInfo.dropFrame += self.buffer.lastDropFrames;
|
||||
self.buffer.lastDropFrames = 0;
|
||||
_self.debugInfo.totalFrame++;
|
||||
_self.debugInfo.dropFrame += _self.buffer.lastDropFrames;
|
||||
_self.buffer.lastDropFrames = 0;
|
||||
|
||||
self.debugInfo.dataFlow += frame.data.length;
|
||||
self.debugInfo.elapsedMilli = CACurrentMediaTime() * 1000 - self.debugInfo.timeStamp;
|
||||
if (self.debugInfo.elapsedMilli < 1000) {
|
||||
self.debugInfo.bandwidth += frame.data.length;
|
||||
_self.debugInfo.dataFlow += frame.data.length;
|
||||
_self.debugInfo.elapsedMilli = CACurrentMediaTime() * 1000 - _self.debugInfo.timeStamp;
|
||||
if (_self.debugInfo.elapsedMilli < 1000) {
|
||||
_self.debugInfo.bandwidth += frame.data.length;
|
||||
if ([frame isKindOfClass:[LFAudioFrame class]]) {
|
||||
self.debugInfo.capturedAudioCount++;
|
||||
_self.debugInfo.capturedAudioCount++;
|
||||
} else {
|
||||
self.debugInfo.capturedVideoCount++;
|
||||
_self.debugInfo.capturedVideoCount++;
|
||||
}
|
||||
|
||||
self.debugInfo.unSendCount = self.buffer.list.count;
|
||||
_self.debugInfo.unSendCount = _self.buffer.list.count;
|
||||
} else {
|
||||
self.debugInfo.currentBandwidth = self.debugInfo.bandwidth;
|
||||
self.debugInfo.currentCapturedAudioCount = self.debugInfo.capturedAudioCount;
|
||||
self.debugInfo.currentCapturedVideoCount = self.debugInfo.capturedVideoCount;
|
||||
if (self.delegate && [self.delegate respondsToSelector:@selector(socketDebug:debugInfo:)]) {
|
||||
[self.delegate socketDebug:self debugInfo:self.debugInfo];
|
||||
_self.debugInfo.currentBandwidth = _self.debugInfo.bandwidth;
|
||||
_self.debugInfo.currentCapturedAudioCount = _self.debugInfo.capturedAudioCount;
|
||||
_self.debugInfo.currentCapturedVideoCount = _self.debugInfo.capturedVideoCount;
|
||||
if (_self.delegate && [_self.delegate respondsToSelector:@selector(socketDebug:debugInfo:)]) {
|
||||
[_self.delegate socketDebug:_self debugInfo:_self.debugInfo];
|
||||
}
|
||||
self.debugInfo.bandwidth = 0;
|
||||
self.debugInfo.capturedAudioCount = 0;
|
||||
self.debugInfo.capturedVideoCount = 0;
|
||||
self.debugInfo.timeStamp = CACurrentMediaTime() * 1000;
|
||||
_self.debugInfo.bandwidth = 0;
|
||||
_self.debugInfo.capturedAudioCount = 0;
|
||||
_self.debugInfo.capturedVideoCount = 0;
|
||||
_self.debugInfo.timeStamp = CACurrentMediaTime() * 1000;
|
||||
}
|
||||
|
||||
//修改发送状态
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
||||
//< 这里只为了不循环调用sendFrame方法 调用栈是保证先出栈再进栈
|
||||
self.isSending = NO;
|
||||
_self.isSending = NO;
|
||||
});
|
||||
|
||||
}
|
||||
@@ -237,18 +250,6 @@ SAVC(mp4a);
|
||||
- (NSInteger)RTMP264_Connect:(char *)push_url {
|
||||
//由于摄像头的timestamp是一直在累加,需要每次得到相对时间戳
|
||||
//分配与初始化
|
||||
if (_isConnecting) return -1;
|
||||
|
||||
_isConnecting = YES;
|
||||
if (self.delegate && [self.delegate respondsToSelector:@selector(socketStatus:status:)]) {
|
||||
[self.delegate socketStatus:self status:LFLivePending];
|
||||
}
|
||||
|
||||
if (_rtmp != NULL) {
|
||||
PILI_RTMP_Close(_rtmp, &_error);
|
||||
PILI_RTMP_Free(_rtmp);
|
||||
}
|
||||
|
||||
_rtmp = PILI_RTMP_Alloc();
|
||||
PILI_RTMP_Init(_rtmp);
|
||||
|
||||
@@ -287,19 +288,13 @@ SAVC(mp4a);
|
||||
_isConnecting = NO;
|
||||
_isReconnecting = NO;
|
||||
_isSending = NO;
|
||||
_retryTimes4netWorkBreaken = 0;
|
||||
return 0;
|
||||
|
||||
Failed:
|
||||
PILI_RTMP_Close(_rtmp, &_error);
|
||||
PILI_RTMP_Free(_rtmp);
|
||||
_rtmp = NULL;
|
||||
if (self.delegate && [self.delegate respondsToSelector:@selector(socketDidError:errorCode:)]) {
|
||||
[self.delegate socketDidError:self errorCode:LFLiveSocketError_ConnectSocket];
|
||||
}
|
||||
if (self.delegate && [self.delegate respondsToSelector:@selector(socketStatus:status:)]) {
|
||||
[self.delegate socketStatus:self status:LFLiveError];
|
||||
}
|
||||
[self reconnect];
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -491,36 +486,62 @@ Failed:
|
||||
// 断线重连
|
||||
- (void)reconnect {
|
||||
dispatch_async(self.rtmpSendQueue, ^{
|
||||
_isReconnecting = NO;
|
||||
if (_isConnected) return;
|
||||
|
||||
[self _stop];
|
||||
[self _start];
|
||||
if (self.retryTimes4netWorkBreaken++ < self.reconnectCount && !self.isReconnecting) {
|
||||
self.isConnected = NO;
|
||||
self.isConnecting = NO;
|
||||
self.isReconnecting = YES;
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[self performSelector:@selector(_reconnect) withObject:nil afterDelay:self.reconnectInterval];
|
||||
});
|
||||
|
||||
} else if (self.retryTimes4netWorkBreaken >= self.reconnectCount) {
|
||||
if (self.delegate && [self.delegate respondsToSelector:@selector(socketStatus:status:)]) {
|
||||
[self.delegate socketStatus:self status:LFLiveError];
|
||||
}
|
||||
if (self.delegate && [self.delegate respondsToSelector:@selector(socketDidError:errorCode:)]) {
|
||||
[self.delegate socketDidError:self errorCode:LFLiveSocketError_ReConnectTimeOut];
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
- (void)_reconnect{
|
||||
[NSObject cancelPreviousPerformRequestsWithTarget:self];
|
||||
|
||||
_isReconnecting = NO;
|
||||
if(_isConnected) return;
|
||||
|
||||
_isReconnecting = NO;
|
||||
if (_isConnected) return;
|
||||
if (_rtmp != NULL) {
|
||||
PILI_RTMP_Close(_rtmp, &_error);
|
||||
PILI_RTMP_Free(_rtmp);
|
||||
_rtmp = NULL;
|
||||
}
|
||||
_sendAudioHead = NO;
|
||||
_sendVideoHead = NO;
|
||||
|
||||
if (self.delegate && [self.delegate respondsToSelector:@selector(socketStatus:status:)]) {
|
||||
[self.delegate socketStatus:self status:LFLiveRefresh];
|
||||
}
|
||||
|
||||
if (_rtmp != NULL) {
|
||||
PILI_RTMP_Close(_rtmp, &_error);
|
||||
PILI_RTMP_Free(_rtmp);
|
||||
}
|
||||
[self RTMP264_Connect:(char *)[_stream.url cStringUsingEncoding:NSASCIIStringEncoding]];
|
||||
}
|
||||
|
||||
#pragma mark -- CallBack
|
||||
void RTMPErrorCallback(RTMPError *error, void *userData) {
|
||||
LFStreamRTMPSocket *socket = (__bridge LFStreamRTMPSocket *)userData;
|
||||
if (error->code < 0) {
|
||||
if (socket.retryTimes4netWorkBreaken++ < socket.reconnectCount && !socket.isReconnecting) {
|
||||
socket.isConnected = NO;
|
||||
socket.isConnecting = NO;
|
||||
socket.isReconnecting = YES;
|
||||
[socket performSelectorOnMainThread:@selector(reconnect) withObject:nil waitUntilDone:socket.reconnectInterval];
|
||||
} else if (socket.retryTimes4netWorkBreaken >= socket.reconnectCount) {
|
||||
if (socket.delegate && [socket.delegate respondsToSelector:@selector(socketStatus:status:)]) {
|
||||
[socket.delegate socketStatus:socket status:LFLiveError];
|
||||
}
|
||||
if (socket.delegate && [socket.delegate respondsToSelector:@selector(socketDidError:errorCode:)]) {
|
||||
[socket.delegate socketDidError:socket errorCode:LFLiveSocketError_ReConnectTimeOut];
|
||||
}
|
||||
}
|
||||
[socket reconnect];
|
||||
}
|
||||
}
|
||||
|
||||
void ConnectionTimeCallback(PILI_CONNECTION_TIME *conn_time, void *userData) {
|
||||
//LFStreamRTMPSocket *socket = (__bridge LFStreamRTMPSocket*)userData;
|
||||
LFStreamRTMPSocket *socket = (__bridge LFStreamRTMPSocket*)userData;
|
||||
}
|
||||
|
||||
#pragma mark -- LFStreamingBufferDelegate
|
||||
@@ -545,7 +566,7 @@ void ConnectionTimeCallback(PILI_CONNECTION_TIME *conn_time, void *userData) {
|
||||
if (!_buffer) {
|
||||
_buffer = [[LFStreamingBuffer alloc] init];
|
||||
_buffer.delegate = self;
|
||||
_buffer.needDropFrame = self.stream.needDropFrame;
|
||||
|
||||
}
|
||||
return _buffer;
|
||||
}
|
||||
@@ -7,9 +7,18 @@
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFLiveStreamInfo.h>
|
||||
#import <LFLiveKit/LFStreamingBuffer.h>
|
||||
#import <LFLiveKit/LFLiveDebug.h>
|
||||
#else
|
||||
#import "LFLiveStreamInfo.h"
|
||||
#import "LFStreamingBuffer.h"
|
||||
#import "LFLiveDebug.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@protocol LFStreamSocket;
|
||||
@protocol LFStreamSocketDelegate <NSObject>
|
||||
+7
-2
@@ -7,8 +7,15 @@
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#if __has_include(<LFLiveKit/LFLiveKit.h>)
|
||||
#import <LFLiveKit/LFAudioFrame.h>
|
||||
#import <LFLiveKit/LFVideoFrame.h>
|
||||
#else
|
||||
#import "LFAudioFrame.h"
|
||||
#import "LFVideoFrame.h"
|
||||
#endif
|
||||
|
||||
|
||||
/** current buffer status */
|
||||
typedef NS_ENUM (NSUInteger, LFLiveBuffferState) {
|
||||
@@ -27,8 +34,6 @@ typedef NS_ENUM (NSUInteger, LFLiveBuffferState) {
|
||||
|
||||
@interface LFStreamingBuffer : NSObject
|
||||
|
||||
/** The needDropFrame control Dynamic frame loss ,default is YES */
|
||||
@property (nonatomic, assign) BOOL needDropFrame;
|
||||
|
||||
/** The delegate of the buffer. buffer callback */
|
||||
@property (nullable, nonatomic, weak) id <LFStreamingBufferDelegate> delegate;
|
||||
+18
-24
@@ -9,7 +9,7 @@
|
||||
#import "LFStreamingBuffer.h"
|
||||
#import "NSMutableArray+LFAdd.h"
|
||||
|
||||
static const NSUInteger defaultSortBufferMaxCount = 10;///< 排序10个内
|
||||
static const NSUInteger defaultSortBufferMaxCount = 5;///< 排序10个内
|
||||
static const NSUInteger defaultUpdateInterval = 1;///< 更新频率为1s
|
||||
static const NSUInteger defaultCallBackInterval = 5;///< 5s计时一次
|
||||
static const NSUInteger defaultSendBufferMaxCount = 600;///< 最大缓冲区为600
|
||||
@@ -41,7 +41,6 @@ static const NSUInteger defaultSendBufferMaxCount = 600;///< 最大缓冲区为6
|
||||
self.maxCount = defaultSendBufferMaxCount;
|
||||
self.lastDropFrames = 0;
|
||||
self.startTimer = NO;
|
||||
self.needDropFrame = YES;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
@@ -92,26 +91,21 @@ static const NSUInteger defaultSendBufferMaxCount = 600;///< 最大缓冲区为6
|
||||
- (void)removeExpireFrame {
|
||||
if (self.list.count < self.maxCount) return;
|
||||
|
||||
if(self.needDropFrame){
|
||||
NSArray *pFrames = [self expirePFrames];///< 第一个P到第一个I之间的p帧
|
||||
self.lastDropFrames += [pFrames count];
|
||||
if (pFrames && pFrames.count > 0) {
|
||||
[self.list removeObjectsInArray:pFrames];
|
||||
return;
|
||||
}
|
||||
|
||||
NSArray *iFrames = [self expireIFrames];///< 删除一个I帧(但一个I帧可能对应多个nal)
|
||||
self.lastDropFrames += [iFrames count];
|
||||
if (iFrames) {
|
||||
[self.list removeObjectsInArray:iFrames];
|
||||
return;
|
||||
}
|
||||
|
||||
[self.list removeAllObjects];
|
||||
}else{
|
||||
[self.list lfPopFirstObject];
|
||||
NSArray *pFrames = [self expirePFrames];///< 第一个P到第一个I之间的p帧
|
||||
self.lastDropFrames += [pFrames count];
|
||||
if (pFrames && pFrames.count > 0) {
|
||||
[self.list removeObjectsInArray:pFrames];
|
||||
return;
|
||||
}
|
||||
|
||||
NSArray *iFrames = [self expireIFrames];///< 删除一个I帧(但一个I帧可能对应多个nal)
|
||||
self.lastDropFrames += [iFrames count];
|
||||
if (iFrames) {
|
||||
[self.list removeObjectsInArray:iFrames];
|
||||
return;
|
||||
}
|
||||
|
||||
[self.list removeAllObjects];
|
||||
}
|
||||
|
||||
- (NSArray *)expirePFrames {
|
||||
@@ -161,9 +155,9 @@ NSInteger frameDataCompare(id obj1, id obj2, void *context){
|
||||
NSInteger decreaseCount = 0;
|
||||
|
||||
for (NSNumber *number in self.thresholdList) {
|
||||
if (number.integerValue >= currentCount) {
|
||||
if (number.integerValue > currentCount) {
|
||||
increaseCount++;
|
||||
} else {
|
||||
} else{
|
||||
decreaseCount++;
|
||||
}
|
||||
currentCount = [number integerValue];
|
||||
@@ -176,7 +170,7 @@ NSInteger frameDataCompare(id obj1, id obj2, void *context){
|
||||
if (decreaseCount >= self.callBackInterval) {
|
||||
return LFLiveBuffferDecline;
|
||||
}
|
||||
|
||||
|
||||
return LFLiveBuffferUnknown;
|
||||
}
|
||||
|
||||
@@ -210,7 +204,7 @@ NSInteger frameDataCompare(id obj1, id obj2, void *context){
|
||||
dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER);
|
||||
[self.thresholdList addObject:@(self.list.count)];
|
||||
dispatch_semaphore_signal(_lock);
|
||||
|
||||
|
||||
if (self.currentInterval >= self.callBackInterval) {
|
||||
LFLiveBuffferState state = [self currentBufferState];
|
||||
if (state == LFLiveBuffferIncrease) {
|
||||
@@ -7,7 +7,6 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
63B306871D75D2A5006CF72B /* pili_rtmp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63B306861D75D2A5006CF72B /* pili_rtmp.framework */; };
|
||||
84D8B42B1D75778B00752B56 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B42A1D75778B00752B56 /* main.m */; };
|
||||
84D8B42E1D75778B00752B56 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B42D1D75778B00752B56 /* AppDelegate.m */; };
|
||||
84D8B4311D75778B00752B56 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B4301D75778B00752B56 /* ViewController.m */; };
|
||||
@@ -26,30 +25,13 @@
|
||||
84D8B4631D75782700752B56 /* close_preview@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D8B4581D75782700752B56 /* close_preview@2x.png */; };
|
||||
84D8B4641D75782700752B56 /* close_preview@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D8B4591D75782700752B56 /* close_preview@3x.png */; };
|
||||
84D8B4651D75782700752B56 /* ios-29x29.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D8B45A1D75782700752B56 /* ios-29x29.png */; };
|
||||
84D8B4681D75783F00752B56 /* GPUImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D8B4661D75783F00752B56 /* GPUImage.framework */; };
|
||||
84D8B4791D757A5500752B56 /* LFLiveKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D8B4451D75779200752B56 /* LFLiveKit.framework */; };
|
||||
84D8B4CF1D757F0700752B56 /* libstdc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D8B4CE1D757F0700752B56 /* libstdc++.tbd */; };
|
||||
BC8B37EEE1CEEF9B5614DC91 /* libPods-LFLiveKitDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B1CCEEE06FCFAF75D105A51 /* libPods-LFLiveKitDemo.a */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
84D8B4441D75779200752B56 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84D8B4401D75779200752B56 /* LFLiveKit.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 84D8B3901D7574D600752B56;
|
||||
remoteInfo = LFLiveKit;
|
||||
};
|
||||
84D8B4761D757A3000752B56 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84D8B4401D75779200752B56 /* LFLiveKit.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 84D8B38F1D7574D600752B56;
|
||||
remoteInfo = LFLiveKit;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
63B306861D75D2A5006CF72B /* pili_rtmp.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = pili_rtmp.framework; path = ../Vendor/pili_rtmp.framework; sourceTree = "<group>"; };
|
||||
289A9C4510CD7EA6F4CE9897 /* Pods-LFLiveKitDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LFLiveKitDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-LFLiveKitDemo/Pods-LFLiveKitDemo.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
5B1CCEEE06FCFAF75D105A51 /* libPods-LFLiveKitDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-LFLiveKitDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
84D8B4261D75778B00752B56 /* LFLiveKitDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LFLiveKitDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
84D8B42A1D75778B00752B56 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||
84D8B42C1D75778B00752B56 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
|
||||
@@ -60,7 +42,6 @@
|
||||
84D8B4351D75778B00752B56 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
84D8B4381D75778B00752B56 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
84D8B43A1D75778B00752B56 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
84D8B4401D75779200752B56 /* LFLiveKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = LFLiveKit.xcodeproj; path = ../LFLiveKit/LFLiveKit.xcodeproj; sourceTree = "<group>"; };
|
||||
84D8B4491D75781200752B56 /* LFLivePreview.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LFLivePreview.h; sourceTree = "<group>"; };
|
||||
84D8B44A1D75781200752B56 /* LFLivePreview.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LFLivePreview.m; sourceTree = "<group>"; };
|
||||
84D8B44D1D75782700752B56 /* UIControl+YYAdd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIControl+YYAdd.h"; sourceTree = "<group>"; };
|
||||
@@ -76,8 +57,8 @@
|
||||
84D8B4581D75782700752B56 /* close_preview@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "close_preview@2x.png"; sourceTree = "<group>"; };
|
||||
84D8B4591D75782700752B56 /* close_preview@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "close_preview@3x.png"; sourceTree = "<group>"; };
|
||||
84D8B45A1D75782700752B56 /* ios-29x29.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ios-29x29.png"; sourceTree = "<group>"; };
|
||||
84D8B4661D75783F00752B56 /* GPUImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GPUImage.framework; path = ../Vendor/GPUImage.framework; sourceTree = "<group>"; };
|
||||
84D8B4CE1D757F0700752B56 /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; };
|
||||
96E1231310083A3881AD2AB6 /* Pods-LFLiveKitDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LFLiveKitDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-LFLiveKitDemo/Pods-LFLiveKitDemo.release.xcconfig"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -85,25 +66,30 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
63B306871D75D2A5006CF72B /* pili_rtmp.framework in Frameworks */,
|
||||
84D8B4CF1D757F0700752B56 /* libstdc++.tbd in Frameworks */,
|
||||
84D8B4791D757A5500752B56 /* LFLiveKit.framework in Frameworks */,
|
||||
84D8B4681D75783F00752B56 /* GPUImage.framework in Frameworks */,
|
||||
BC8B37EEE1CEEF9B5614DC91 /* libPods-LFLiveKitDemo.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
65E0CF98FF954863E543A0E1 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5B1CCEEE06FCFAF75D105A51 /* libPods-LFLiveKitDemo.a */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B41D1D75778B00752B56 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
63B306861D75D2A5006CF72B /* pili_rtmp.framework */,
|
||||
84D8B4CE1D757F0700752B56 /* libstdc++.tbd */,
|
||||
84D8B4661D75783F00752B56 /* GPUImage.framework */,
|
||||
84D8B4401D75779200752B56 /* LFLiveKit.xcodeproj */,
|
||||
84D8B4281D75778B00752B56 /* LFLiveKitDemo */,
|
||||
84D8B4271D75778B00752B56 /* Products */,
|
||||
F3E359B8A7561F963C47A62F /* Pods */,
|
||||
65E0CF98FF954863E543A0E1 /* Frameworks */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@@ -143,14 +129,6 @@
|
||||
name = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B4411D75779200752B56 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84D8B4451D75779200752B56 /* LFLiveKit.framework */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B44C1D75782700752B56 /* category */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -178,6 +156,15 @@
|
||||
path = images;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
F3E359B8A7561F963C47A62F /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
289A9C4510CD7EA6F4CE9897 /* Pods-LFLiveKitDemo.debug.xcconfig */,
|
||||
96E1231310083A3881AD2AB6 /* Pods-LFLiveKitDemo.release.xcconfig */,
|
||||
);
|
||||
name = Pods;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
@@ -185,14 +172,16 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 84D8B43D1D75778B00752B56 /* Build configuration list for PBXNativeTarget "LFLiveKitDemo" */;
|
||||
buildPhases = (
|
||||
A819C09CC049A57DC5C97E12 /* 📦 Check Pods Manifest.lock */,
|
||||
84D8B4221D75778B00752B56 /* Sources */,
|
||||
84D8B4231D75778B00752B56 /* Frameworks */,
|
||||
84D8B4241D75778B00752B56 /* Resources */,
|
||||
883533331BE4DCC0DB5075CF /* 📦 Embed Pods Frameworks */,
|
||||
4CC4C37B93D109913E475307 /* 📦 Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
84D8B4771D757A3000752B56 /* PBXTargetDependency */,
|
||||
);
|
||||
name = LFLiveKitDemo;
|
||||
productName = LFLiveKitDemo;
|
||||
@@ -210,6 +199,7 @@
|
||||
TargetAttributes = {
|
||||
84D8B4251D75778B00752B56 = {
|
||||
CreatedOnToolsVersion = 7.3.1;
|
||||
DevelopmentTeam = G497YX6CBT;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -224,12 +214,6 @@
|
||||
mainGroup = 84D8B41D1D75778B00752B56;
|
||||
productRefGroup = 84D8B4271D75778B00752B56 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectReferences = (
|
||||
{
|
||||
ProductGroup = 84D8B4411D75779200752B56 /* Products */;
|
||||
ProjectRef = 84D8B4401D75779200752B56 /* LFLiveKit.xcodeproj */;
|
||||
},
|
||||
);
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
84D8B4251D75778B00752B56 /* LFLiveKitDemo */,
|
||||
@@ -237,16 +221,6 @@
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXReferenceProxy section */
|
||||
84D8B4451D75779200752B56 /* LFLiveKit.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = LFLiveKit.framework;
|
||||
remoteRef = 84D8B4441D75779200752B56 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
/* End PBXReferenceProxy section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
84D8B4241D75778B00752B56 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
@@ -269,6 +243,54 @@
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
4CC4C37B93D109913E475307 /* 📦 Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "📦 Copy Pods Resources";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-LFLiveKitDemo/Pods-LFLiveKitDemo-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
883533331BE4DCC0DB5075CF /* 📦 Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "📦 Embed Pods Frameworks";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-LFLiveKitDemo/Pods-LFLiveKitDemo-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
A819C09CC049A57DC5C97E12 /* 📦 Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "📦 Check Pods Manifest.lock";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
84D8B4221D75778B00752B56 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
@@ -285,14 +307,6 @@
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
84D8B4771D757A3000752B56 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = LFLiveKit;
|
||||
targetProxy = 84D8B4761D757A3000752B56 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
84D8B4321D75778B00752B56 /* Main.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
@@ -397,38 +411,36 @@
|
||||
};
|
||||
84D8B43E1D75778B00752B56 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 289A9C4510CD7EA6F4CE9897 /* Pods-LFLiveKitDemo.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)/../Vendor\"/**",
|
||||
);
|
||||
HEADER_SEARCH_PATHS = "";
|
||||
DEVELOPMENT_TEAM = G497YX6CBT;
|
||||
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
||||
HEADER_SEARCH_PATHS = "$(inherited)";
|
||||
INFOPLIST_FILE = LFLiveKitDemo/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "";
|
||||
OTHER_LDFLAGS = "-all_load";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.youku.LFLiveKitDemo;
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
OTHER_LDFLAGS = "$(inherited)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.youku.LaiFeng;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
84D8B43F1D75778B00752B56 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 96E1231310083A3881AD2AB6 /* Pods-LFLiveKitDemo.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)/../Vendor\"/**",
|
||||
);
|
||||
HEADER_SEARCH_PATHS = "";
|
||||
DEVELOPMENT_TEAM = G497YX6CBT;
|
||||
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
||||
HEADER_SEARCH_PATHS = "$(inherited)";
|
||||
INFOPLIST_FILE = LFLiveKitDemo/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "";
|
||||
OTHER_LDFLAGS = "-all_load";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.youku.LFLiveKitDemo;
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
OTHER_LDFLAGS = "$(inherited)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.youku.LaiFeng;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
};
|
||||
name = Release;
|
||||
|
||||
BIN
Binary file not shown.
@@ -26,13 +26,16 @@
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>cameraDesciption</string>
|
||||
<key>NSMicrophoneUsageDescription</key>
|
||||
<string>microphoneDesciption</string>
|
||||
<key>UIRequiredDeviceCapabilities</key>
|
||||
<array>
|
||||
<string>armv7</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#import "LFLivePreview.h"
|
||||
#import "UIControl+YYAdd.h"
|
||||
#import "UIView+YYAdd.h"
|
||||
#import <LFLiveKit/LFLiveKit.h>
|
||||
#import "LFLiveKit.h"
|
||||
|
||||
inline static NSString *formatedSpeed(float bytes, float elapsed_milli) {
|
||||
if (elapsed_milli <= 0) {
|
||||
@@ -157,13 +157,14 @@ inline static NSString *formatedSpeed(float bytes, float elapsed_milli) {
|
||||
|
||||
/*** 默认分辨率368 * 640 音频:44.1 iphone6以上48 双声道 方向竖屏 ***/
|
||||
LFLiveVideoConfiguration *videoConfiguration = [LFLiveVideoConfiguration new];
|
||||
videoConfiguration.videoSize = CGSizeMake(360, 640);
|
||||
videoConfiguration.videoSize = CGSizeMake(640, 360);
|
||||
videoConfiguration.videoBitRate = 800*1024;
|
||||
videoConfiguration.videoMaxBitRate = 1000*1024;
|
||||
videoConfiguration.videoMinBitRate = 500*1024;
|
||||
videoConfiguration.videoFrameRate = 24;
|
||||
videoConfiguration.videoMaxKeyframeInterval = 48;
|
||||
videoConfiguration.landscape = NO;
|
||||
videoConfiguration.outputImageOrientation = UIInterfaceOrientationLandscapeLeft;
|
||||
videoConfiguration.autorotate = NO;
|
||||
videoConfiguration.sessionPreset = LFCaptureSessionPreset720x1280;
|
||||
_session = [[LFLiveSession alloc] initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfiguration] videoConfiguration:videoConfiguration captureType:LFLiveCaptureDefaultMask];
|
||||
|
||||
@@ -254,11 +255,19 @@ inline static NSString *formatedSpeed(float bytes, float elapsed_milli) {
|
||||
_session.showDebugInfo = NO;
|
||||
_session.preView = self;
|
||||
|
||||
/*本地存储*/
|
||||
// _session.saveLocalVideo = YES;
|
||||
// NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mp4"];
|
||||
// unlink([pathToMovie UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie
|
||||
// NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
|
||||
// _session.saveLocalVideoPath = movieURL;
|
||||
|
||||
/*
|
||||
UIImageView *imageView = [[UIImageView alloc] init];
|
||||
imageView.alpha = 0.8;
|
||||
imageView.frame = CGRectMake(100, 100, 29, 29);
|
||||
imageView.image = [UIImage imageNamed:@"ios-29x29"];
|
||||
_session.warterMarkView = imageView;
|
||||
_session.warterMarkView = imageView;*/
|
||||
|
||||
}
|
||||
return _session;
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
}
|
||||
|
||||
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
|
||||
return UIInterfaceOrientationMaskPortrait;
|
||||
return UIInterfaceOrientationMaskLandscape;
|
||||
}
|
||||
|
||||
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
source 'https://github.com/CocoaPods/Specs.git'
|
||||
platform :ios,'7.0'
|
||||
|
||||
target “LFLiveKitDemo” do
|
||||
pod 'LFLiveKit', :path => '../.'
|
||||
end
|
||||
@@ -7,7 +7,6 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
63774FB11D75D30E00E4F096 /* pili_rtmp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63774FB01D75D30E00E4F096 /* pili_rtmp.framework */; };
|
||||
84D8B48C1D757D4000752B56 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B48B1D757D4000752B56 /* AppDelegate.swift */; };
|
||||
84D8B48E1D757D4000752B56 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D8B48D1D757D4000752B56 /* ViewController.swift */; };
|
||||
84D8B4911D757D4000752B56 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84D8B48F1D757D4000752B56 /* Main.storyboard */; };
|
||||
@@ -21,30 +20,13 @@
|
||||
84D8B4B11D757DBB00752B56 /* camra_preview@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D8B4A91D757DBB00752B56 /* camra_preview@3x.png */; };
|
||||
84D8B4B21D757DBB00752B56 /* close_preview@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D8B4AA1D757DBB00752B56 /* close_preview@2x.png */; };
|
||||
84D8B4B31D757DBB00752B56 /* close_preview@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D8B4AB1D757DBB00752B56 /* close_preview@3x.png */; };
|
||||
84D8B4B71D757DE600752B56 /* LFLiveKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D8B4A21D757D4B00752B56 /* LFLiveKit.framework */; };
|
||||
84D8B4BA1D757DED00752B56 /* GPUImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D8B4B81D757DED00752B56 /* GPUImage.framework */; };
|
||||
84D8B4BD1D757E0E00752B56 /* libstdc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D8B4BC1D757E0E00752B56 /* libstdc++.tbd */; };
|
||||
9CA0546A1BD4E74670872B9B /* libPods-LFLiveKitSwiftDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E0C4364E65B82DECF3326D9 /* libPods-LFLiveKitSwiftDemo.a */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
84D8B4A11D757D4B00752B56 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84D8B49D1D757D4B00752B56 /* LFLiveKit.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 84D8B3901D7574D600752B56;
|
||||
remoteInfo = LFLiveKit;
|
||||
};
|
||||
84D8B4B51D757DDC00752B56 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84D8B49D1D757D4B00752B56 /* LFLiveKit.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 84D8B38F1D7574D600752B56;
|
||||
remoteInfo = LFLiveKit;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
63774FB01D75D30E00E4F096 /* pili_rtmp.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = pili_rtmp.framework; path = ../Vendor/pili_rtmp.framework; sourceTree = "<group>"; };
|
||||
4E0C4364E65B82DECF3326D9 /* libPods-LFLiveKitSwiftDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-LFLiveKitSwiftDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
7265B07B4B6CEE8ECE8F7A63 /* Pods-LFLiveKitSwiftDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LFLiveKitSwiftDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-LFLiveKitSwiftDemo/Pods-LFLiveKitSwiftDemo.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
84D8B4881D757D4000752B56 /* LFLiveKitSwiftDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LFLiveKitSwiftDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
84D8B48B1D757D4000752B56 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
84D8B48D1D757D4000752B56 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
|
||||
@@ -52,7 +34,6 @@
|
||||
84D8B4921D757D4000752B56 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
84D8B4951D757D4000752B56 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
84D8B4971D757D4000752B56 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
84D8B49D1D757D4B00752B56 /* LFLiveKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = LFLiveKit.xcodeproj; path = ../LFLiveKit/LFLiveKit.xcodeproj; sourceTree = "<group>"; };
|
||||
84D8B4A41D757DBB00752B56 /* camra_beauty@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camra_beauty@2x.png"; sourceTree = "<group>"; };
|
||||
84D8B4A51D757DBB00752B56 /* camra_beauty@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camra_beauty@3x.png"; sourceTree = "<group>"; };
|
||||
84D8B4A61D757DBB00752B56 /* camra_beauty_close@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camra_beauty_close@2x.png"; sourceTree = "<group>"; };
|
||||
@@ -61,9 +42,8 @@
|
||||
84D8B4A91D757DBB00752B56 /* camra_preview@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camra_preview@3x.png"; sourceTree = "<group>"; };
|
||||
84D8B4AA1D757DBB00752B56 /* close_preview@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "close_preview@2x.png"; sourceTree = "<group>"; };
|
||||
84D8B4AB1D757DBB00752B56 /* close_preview@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "close_preview@3x.png"; sourceTree = "<group>"; };
|
||||
84D8B4B41D757DCC00752B56 /* LFLiveKitSwiftDemo-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "LFLiveKitSwiftDemo-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
84D8B4B81D757DED00752B56 /* GPUImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GPUImage.framework; path = ../Vendor/GPUImage.framework; sourceTree = "<group>"; };
|
||||
84D8B4BC1D757E0E00752B56 /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; };
|
||||
DAC498DB742E949DED005ECE /* Pods-LFLiveKitSwiftDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LFLiveKitSwiftDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-LFLiveKitSwiftDemo/Pods-LFLiveKitSwiftDemo.release.xcconfig"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -71,25 +51,30 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
63774FB11D75D30E00E4F096 /* pili_rtmp.framework in Frameworks */,
|
||||
84D8B4BD1D757E0E00752B56 /* libstdc++.tbd in Frameworks */,
|
||||
84D8B4BA1D757DED00752B56 /* GPUImage.framework in Frameworks */,
|
||||
84D8B4B71D757DE600752B56 /* LFLiveKit.framework in Frameworks */,
|
||||
9CA0546A1BD4E74670872B9B /* libPods-LFLiveKitSwiftDemo.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
23FA2B0543E0C2A8E7C84D9E /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4E0C4364E65B82DECF3326D9 /* libPods-LFLiveKitSwiftDemo.a */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B47F1D757D4000752B56 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
63774FB01D75D30E00E4F096 /* pili_rtmp.framework */,
|
||||
84D8B4BC1D757E0E00752B56 /* libstdc++.tbd */,
|
||||
84D8B4B81D757DED00752B56 /* GPUImage.framework */,
|
||||
84D8B49D1D757D4B00752B56 /* LFLiveKit.xcodeproj */,
|
||||
84D8B48A1D757D4000752B56 /* LFLiveKitSwiftDemo */,
|
||||
84D8B4891D757D4000752B56 /* Products */,
|
||||
B19B532AA669846CC85D50E3 /* Pods */,
|
||||
23FA2B0543E0C2A8E7C84D9E /* Frameworks */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@@ -106,7 +91,6 @@
|
||||
children = (
|
||||
84D8B48B1D757D4000752B56 /* AppDelegate.swift */,
|
||||
84D8B48D1D757D4000752B56 /* ViewController.swift */,
|
||||
84D8B4B41D757DCC00752B56 /* LFLiveKitSwiftDemo-Bridging-Header.h */,
|
||||
84D8B48F1D757D4000752B56 /* Main.storyboard */,
|
||||
84D8B4A31D757DBB00752B56 /* images */,
|
||||
84D8B4921D757D4000752B56 /* Assets.xcassets */,
|
||||
@@ -116,14 +100,6 @@
|
||||
path = LFLiveKitSwiftDemo;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B49E1D757D4B00752B56 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84D8B4A21D757D4B00752B56 /* LFLiveKit.framework */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84D8B4A31D757DBB00752B56 /* images */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -139,6 +115,15 @@
|
||||
path = images;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B19B532AA669846CC85D50E3 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7265B07B4B6CEE8ECE8F7A63 /* Pods-LFLiveKitSwiftDemo.debug.xcconfig */,
|
||||
DAC498DB742E949DED005ECE /* Pods-LFLiveKitSwiftDemo.release.xcconfig */,
|
||||
);
|
||||
name = Pods;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
@@ -146,14 +131,16 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 84D8B49A1D757D4000752B56 /* Build configuration list for PBXNativeTarget "LFLiveKitSwiftDemo" */;
|
||||
buildPhases = (
|
||||
FC46EAD69B9F095AB7372DB6 /* 📦 Check Pods Manifest.lock */,
|
||||
84D8B4841D757D4000752B56 /* Sources */,
|
||||
84D8B4851D757D4000752B56 /* Frameworks */,
|
||||
84D8B4861D757D4000752B56 /* Resources */,
|
||||
951756CA4F11963EE3622ADB /* 📦 Embed Pods Frameworks */,
|
||||
1D8289CE7990A09D5E67FA15 /* 📦 Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
84D8B4B61D757DDC00752B56 /* PBXTargetDependency */,
|
||||
);
|
||||
name = LFLiveKitSwiftDemo;
|
||||
productName = LFLiveKitSwiftDemo;
|
||||
@@ -172,6 +159,8 @@
|
||||
TargetAttributes = {
|
||||
84D8B4871D757D4000752B56 = {
|
||||
CreatedOnToolsVersion = 7.3.1;
|
||||
DevelopmentTeam = G497YX6CBT;
|
||||
LastSwiftMigration = 0800;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -186,12 +175,6 @@
|
||||
mainGroup = 84D8B47F1D757D4000752B56;
|
||||
productRefGroup = 84D8B4891D757D4000752B56 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectReferences = (
|
||||
{
|
||||
ProductGroup = 84D8B49E1D757D4B00752B56 /* Products */;
|
||||
ProjectRef = 84D8B49D1D757D4B00752B56 /* LFLiveKit.xcodeproj */;
|
||||
},
|
||||
);
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
84D8B4871D757D4000752B56 /* LFLiveKitSwiftDemo */,
|
||||
@@ -199,16 +182,6 @@
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXReferenceProxy section */
|
||||
84D8B4A21D757D4B00752B56 /* LFLiveKit.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = LFLiveKit.framework;
|
||||
remoteRef = 84D8B4A11D757D4B00752B56 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
/* End PBXReferenceProxy section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
84D8B4861D757D4000752B56 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
@@ -230,6 +203,54 @@
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
1D8289CE7990A09D5E67FA15 /* 📦 Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "📦 Copy Pods Resources";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-LFLiveKitSwiftDemo/Pods-LFLiveKitSwiftDemo-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
951756CA4F11963EE3622ADB /* 📦 Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "📦 Embed Pods Frameworks";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-LFLiveKitSwiftDemo/Pods-LFLiveKitSwiftDemo-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
FC46EAD69B9F095AB7372DB6 /* 📦 Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "📦 Check Pods Manifest.lock";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
84D8B4841D757D4000752B56 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
@@ -242,14 +263,6 @@
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
84D8B4B61D757DDC00752B56 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = LFLiveKit;
|
||||
targetProxy = 84D8B4B51D757DDC00752B56 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
84D8B48F1D757D4000752B56 /* Main.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
@@ -355,29 +368,41 @@
|
||||
};
|
||||
84D8B49B1D757D4000752B56 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7265B07B4B6CEE8ECE8F7A63 /* Pods-LFLiveKitSwiftDemo.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
FRAMEWORK_SEARCH_PATHS = "\"$(SRCROOT)/../Vendor\"/**";
|
||||
DEVELOPMENT_TEAM = G497YX6CBT;
|
||||
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
||||
HEADER_SEARCH_PATHS = "$(inherited)";
|
||||
INFOPLIST_FILE = LFLiveKitSwiftDemo/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.youku.LFLiveKitSwiftDemo;
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
OTHER_LDFLAGS = "-all_load";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.youku.LaiFeng;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "LFLiveKitSwiftDemo/LFLiveKitSwiftDemo-Bridging-Header.h";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "";
|
||||
SWIFT_VERSION = 3.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
84D8B49C1D757D4000752B56 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = DAC498DB742E949DED005ECE /* Pods-LFLiveKitSwiftDemo.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
FRAMEWORK_SEARCH_PATHS = "\"$(SRCROOT)/../Vendor\"/**";
|
||||
DEVELOPMENT_TEAM = G497YX6CBT;
|
||||
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
||||
HEADER_SEARCH_PATHS = "$(inherited)";
|
||||
INFOPLIST_FILE = LFLiveKitSwiftDemo/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.youku.LFLiveKitSwiftDemo;
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
OTHER_LDFLAGS = "-all_load";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.youku.LaiFeng;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "LFLiveKitSwiftDemo/LFLiveKitSwiftDemo-Bridging-Header.h";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "";
|
||||
SWIFT_VERSION = 3.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
|
||||
@@ -14,30 +14,30 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
var window: UIWindow?
|
||||
|
||||
|
||||
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
|
||||
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
|
||||
// Override point for customization after application launch.
|
||||
return true
|
||||
}
|
||||
|
||||
func applicationWillResignActive(application: UIApplication) {
|
||||
func applicationWillResignActive(_ application: UIApplication) {
|
||||
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
|
||||
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
|
||||
}
|
||||
|
||||
func applicationDidEnterBackground(application: UIApplication) {
|
||||
func applicationDidEnterBackground(_ application: UIApplication) {
|
||||
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
|
||||
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
|
||||
}
|
||||
|
||||
func applicationWillEnterForeground(application: UIApplication) {
|
||||
func applicationWillEnterForeground(_ application: UIApplication) {
|
||||
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
|
||||
}
|
||||
|
||||
func applicationDidBecomeActive(application: UIApplication) {
|
||||
func applicationDidBecomeActive(_ application: UIApplication) {
|
||||
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
|
||||
}
|
||||
|
||||
func applicationWillTerminate(application: UIApplication) {
|
||||
func applicationWillTerminate(_ application: UIApplication) {
|
||||
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
//
|
||||
// Use this file to import your target's public headers that you would like to expose to Swift.
|
||||
//
|
||||
|
||||
#ifndef LFLiveKitSwiftDemo_Bridging_H
|
||||
#define LFLiveKitSwiftDemo_Bridging_H
|
||||
|
||||
#import <LFLiveKit/LFLiveKit.h>
|
||||
|
||||
#endif
|
||||
@@ -7,6 +7,7 @@
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import LFLiveKit
|
||||
|
||||
class ViewController: UIViewController, LFLiveSessionDelegate {
|
||||
|
||||
@@ -15,7 +16,7 @@ class ViewController: UIViewController, LFLiveSessionDelegate {
|
||||
// Do any additional setup after loading the view, typically from a nib.
|
||||
self.requestAccessForVideo()
|
||||
self.requestAccessForAudio()
|
||||
self.view.backgroundColor = UIColor.clearColor()
|
||||
self.view.backgroundColor = UIColor.clear
|
||||
self.view.addSubview(containerView)
|
||||
containerView.addSubview(stateLabel)
|
||||
containerView.addSubview(closeButton)
|
||||
@@ -78,15 +79,15 @@ class ViewController: UIViewController, LFLiveSessionDelegate {
|
||||
//MARK: - Callbacks
|
||||
|
||||
// 回调
|
||||
func liveSession(session: LFLiveSession?, debugInfo: LFLiveDebug?) {
|
||||
func liveSession(_ session: LFLiveSession?, debugInfo: LFLiveDebug?) {
|
||||
print("debugInfo: \(debugInfo?.currentBandwidth)")
|
||||
}
|
||||
|
||||
func liveSession(session: LFLiveSession?, errorCode: LFLiveSocketErrorCode) {
|
||||
func liveSession(_ session: LFLiveSession?, errorCode: LFLiveSocketErrorCode) {
|
||||
print("errorCode: \(errorCode.rawValue)")
|
||||
}
|
||||
|
||||
func liveSession(session: LFLiveSession?, liveStateDidChange state: LFLiveState) {
|
||||
func liveSession(_ session: LFLiveSession?, liveStateDidChange state: LFLiveState) {
|
||||
print("liveStateDidChange: \(state.rawValue)")
|
||||
switch state {
|
||||
case LFLiveState.Ready:
|
||||
@@ -104,42 +105,39 @@ class ViewController: UIViewController, LFLiveSessionDelegate {
|
||||
case LFLiveState.Stop:
|
||||
stateLabel.text = "未连接"
|
||||
break;
|
||||
default:
|
||||
stateLabel.text = "未知"
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Events
|
||||
|
||||
// 开始直播
|
||||
func didTappedStartLiveButton(button: UIButton) -> Void {
|
||||
startLiveButton.selected = !startLiveButton.selected;
|
||||
if (startLiveButton.selected) {
|
||||
startLiveButton.setTitle("结束直播", forState: UIControlState.Normal)
|
||||
func didTappedStartLiveButton(_ button: UIButton) -> Void {
|
||||
startLiveButton.isSelected = !startLiveButton.isSelected;
|
||||
if (startLiveButton.isSelected) {
|
||||
startLiveButton.setTitle("结束直播", for: UIControlState())
|
||||
let stream = LFLiveStreamInfo()
|
||||
stream.url = "rtmp://30.96.179.95:1935/live/1234"
|
||||
stream.url = "rtmp://live.hkstv.hk.lxdns.com:1935/live/stream153"
|
||||
session.startLive(stream)
|
||||
} else {
|
||||
startLiveButton.setTitle("开始直播", forState: UIControlState.Normal)
|
||||
startLiveButton.setTitle("开始直播", for: UIControlState())
|
||||
session.stopLive()
|
||||
}
|
||||
}
|
||||
|
||||
// 美颜
|
||||
func didTappedBeautyButton(button: UIButton) -> Void {
|
||||
func didTappedBeautyButton(_ button: UIButton) -> Void {
|
||||
session.beautyFace = !session.beautyFace;
|
||||
beautyButton.selected = !session.beautyFace;
|
||||
}
|
||||
|
||||
// 摄像头
|
||||
func didTappedCameraButton(button: UIButton) -> Void {
|
||||
func didTappedCameraButton(_ button: UIButton) -> Void {
|
||||
let devicePositon = session.captureDevicePosition;
|
||||
session.captureDevicePosition = (devicePositon == AVCaptureDevicePosition.Back) ? AVCaptureDevicePosition.Front : AVCaptureDevicePosition.Back;
|
||||
}
|
||||
|
||||
// 关闭
|
||||
func didTappedCloseButton(button: UIButton) -> Void {
|
||||
func didTappedCloseButton(_ button: UIButton) -> Void {
|
||||
|
||||
}
|
||||
|
||||
@@ -148,7 +146,7 @@ class ViewController: UIViewController, LFLiveSessionDelegate {
|
||||
// 默认分辨率368 * 640 音频:44.1 iphone6以上48 双声道 方向竖屏
|
||||
lazy var session: LFLiveSession = {
|
||||
let audioConfiguration = LFLiveAudioConfiguration.defaultConfiguration()
|
||||
let videoConfiguration = LFLiveVideoConfiguration.defaultConfigurationForQuality(LFLiveVideoQuality.Low3, landscape: false)
|
||||
let videoConfiguration = LFLiveVideoConfiguration.defaultConfigurationForQuality(LFLiveVideoQuality.Low3)
|
||||
let session = LFLiveSession(audioConfiguration: audioConfiguration, videoConfiguration: videoConfiguration)
|
||||
|
||||
session?.delegate = self
|
||||
@@ -159,8 +157,8 @@ class ViewController: UIViewController, LFLiveSessionDelegate {
|
||||
// 视图
|
||||
lazy var containerView: UIView = {
|
||||
let containerView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height))
|
||||
containerView.backgroundColor = UIColor.clearColor()
|
||||
containerView.autoresizingMask = [UIViewAutoresizing.FlexibleHeight, UIViewAutoresizing.FlexibleHeight]
|
||||
containerView.backgroundColor = UIColor.clear
|
||||
containerView.autoresizingMask = [UIViewAutoresizing.flexibleHeight, UIViewAutoresizing.flexibleHeight]
|
||||
return containerView
|
||||
}()
|
||||
|
||||
@@ -168,33 +166,33 @@ class ViewController: UIViewController, LFLiveSessionDelegate {
|
||||
lazy var stateLabel: UILabel = {
|
||||
let stateLabel = UILabel(frame: CGRect(x: 20, y: 20, width: 80, height: 40))
|
||||
stateLabel.text = "未连接"
|
||||
stateLabel.textColor = UIColor.whiteColor()
|
||||
stateLabel.font = UIFont.systemFontOfSize(14)
|
||||
stateLabel.textColor = UIColor.white
|
||||
stateLabel.font = UIFont.systemFont(ofSize: 14)
|
||||
return stateLabel
|
||||
}()
|
||||
|
||||
// 关闭按钮
|
||||
lazy var closeButton: UIButton = {
|
||||
let closeButton = UIButton(frame: CGRect(x: self.view.frame.width - 10 - 44, y: 20, width: 44, height: 44))
|
||||
closeButton.setImage(UIImage(named: "close_preview"), forState: UIControlState.Normal)
|
||||
closeButton.addTarget(self, action: #selector(didTappedCloseButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
|
||||
closeButton.setImage(UIImage(named: "close_preview"), for: UIControlState())
|
||||
closeButton.addTarget(self, action: #selector(didTappedCloseButton(_:)), for: UIControlEvents.touchUpInside)
|
||||
return closeButton
|
||||
}()
|
||||
|
||||
// 摄像头
|
||||
lazy var cameraButton: UIButton = {
|
||||
let cameraButton = UIButton(frame: CGRect(x: self.view.frame.width - 54 * 2, y: 20, width: 44, height: 44))
|
||||
cameraButton.setImage(UIImage(named: "camra_preview"), forState: UIControlState.Normal)
|
||||
cameraButton.addTarget(self, action: #selector(didTappedCameraButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
|
||||
cameraButton.setImage(UIImage(named: "camra_preview"), for: UIControlState())
|
||||
cameraButton.addTarget(self, action: #selector(didTappedCameraButton(_:)), for: UIControlEvents.touchUpInside)
|
||||
return cameraButton
|
||||
}()
|
||||
|
||||
// 摄像头
|
||||
lazy var beautyButton: UIButton = {
|
||||
let beautyButton = UIButton(frame: CGRect(x: self.view.frame.width - 54 * 3, y: 20, width: 44, height: 44))
|
||||
beautyButton.setImage(UIImage(named: "camra_preview"), forState: UIControlState.Selected)
|
||||
beautyButton.setImage(UIImage(named: "camra_beauty_close"), forState: UIControlState.Normal)
|
||||
beautyButton.addTarget(self, action: #selector(didTappedBeautyButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
|
||||
beautyButton.setImage(UIImage(named: "camra_preview"), for: UIControlState.selected)
|
||||
beautyButton.setImage(UIImage(named: "camra_beauty_close"), for: UIControlState())
|
||||
beautyButton.addTarget(self, action: #selector(didTappedBeautyButton(_:)), for: UIControlEvents.touchUpInside)
|
||||
return beautyButton
|
||||
}()
|
||||
|
||||
@@ -202,20 +200,20 @@ class ViewController: UIViewController, LFLiveSessionDelegate {
|
||||
lazy var startLiveButton: UIButton = {
|
||||
let startLiveButton = UIButton(frame: CGRect(x: 30, y: self.view.frame.height - 50, width: self.view.frame.width - 10 - 44, height: 44))
|
||||
startLiveButton.layer.cornerRadius = 22
|
||||
startLiveButton.setTitleColor(UIColor.blackColor(), forState:UIControlState.Normal)
|
||||
startLiveButton.setTitle("开始直播", forState: UIControlState.Normal)
|
||||
startLiveButton.titleLabel!.font = UIFont.systemFontOfSize(14)
|
||||
startLiveButton.setTitleColor(UIColor.black, for:UIControlState())
|
||||
startLiveButton.setTitle("开始直播", for: UIControlState())
|
||||
startLiveButton.titleLabel!.font = UIFont.systemFont(ofSize: 14)
|
||||
startLiveButton.backgroundColor = UIColor(colorLiteralRed: 50, green: 32, blue: 245, alpha: 1)
|
||||
startLiveButton.addTarget(self, action: #selector(didTappedStartLiveButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
|
||||
startLiveButton.addTarget(self, action: #selector(didTappedStartLiveButton(_:)), for: UIControlEvents.touchUpInside)
|
||||
return startLiveButton
|
||||
}()
|
||||
|
||||
// 转屏
|
||||
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
|
||||
return UIInterfaceOrientationMask.Portrait
|
||||
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
|
||||
return UIInterfaceOrientationMask.portrait
|
||||
}
|
||||
|
||||
override func shouldAutorotate() -> Bool {
|
||||
override var shouldAutorotate : Bool {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
source 'https://github.com/CocoaPods/Specs.git'
|
||||
platform :ios,'7.0'
|
||||
|
||||
target “LFLiveKitSwiftDemo” do
|
||||
pod 'LFLiveKit', :path => '../.'
|
||||
end
|
||||
@@ -66,71 +66,74 @@ LFLiveKit
|
||||
* VideoToolbox
|
||||
* AudioToolbox
|
||||
* libz
|
||||
* libstdc++
|
||||
|
||||
## Usage example
|
||||
|
||||
#### Objective-C
|
||||
```objc
|
||||
- (LFLiveSession*)session {
|
||||
if (!_session) {
|
||||
_session = [[LFLiveSession alloc] initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfiguration] videoConfiguration:[LFLiveVideoConfiguration defaultConfiguration]];
|
||||
_session.preView = self;
|
||||
_session.delegate = self;
|
||||
}
|
||||
return _session;
|
||||
}
|
||||
|
||||
- (LFLiveSession*)session {
|
||||
if (!_session) {
|
||||
_session = [[LFLiveSession alloc] initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfiguration] videoConfiguration:[LFLiveVideoConfiguration defaultConfiguration]];
|
||||
_session.preView = self;
|
||||
_session.delegate = self;
|
||||
}
|
||||
return _session;
|
||||
}
|
||||
|
||||
- (void)startLive {
|
||||
LFLiveStreamInfo *streamInfo = [LFLiveStreamInfo new];
|
||||
streamInfo.url = @"your server rtmp url";
|
||||
[self.session startLive:streamInfo];
|
||||
}
|
||||
- (void)startLive {
|
||||
LFLiveStreamInfo *streamInfo = [LFLiveStreamInfo new];
|
||||
streamInfo.url = @"your server rtmp url";
|
||||
[self.session startLive:streamInfo];
|
||||
}
|
||||
|
||||
- (void)stopLive {
|
||||
[self.session stopLive];
|
||||
}
|
||||
|
||||
//MARK: - CallBack:
|
||||
- (void)liveSession:(nullable LFLiveSession *)session liveStateDidChange: (LFLiveState)state;
|
||||
- (void)liveSession:(nullable LFLiveSession *)session debugInfo:(nullable LFLiveDebug*)debugInfo;
|
||||
- (void)liveSession:(nullable LFLiveSession*)session errorCode:(LFLiveSocketErrorCode)errorCode;
|
||||
- (void)stopLive {
|
||||
[self.session stopLive];
|
||||
}
|
||||
|
||||
//MARK: - CallBack:
|
||||
- (void)liveSession:(nullable LFLiveSession *)session liveStateDidChange: (LFLiveState)state;
|
||||
- (void)liveSession:(nullable LFLiveSession *)session debugInfo:(nullable LFLiveDebug*)debugInfo;
|
||||
- (void)liveSession:(nullable LFLiveSession*)session errorCode:(LFLiveSocketErrorCode)errorCode;
|
||||
```
|
||||
#### Swift
|
||||
```swift
|
||||
// import LFLiveKit in [ProjectName]-Bridging-Header.h
|
||||
#import <LFLiveKit.h>
|
||||
|
||||
// import LFLiveKit in [ProjectName]-Bridging-Header.h
|
||||
import <LFLiveKit.h>
|
||||
//MARK: - Getters and Setters
|
||||
lazy var session: LFLiveSession = {
|
||||
let audioConfiguration = LFLiveAudioConfiguration.defaultConfiguration()
|
||||
let videoConfiguration = LFLiveVideoConfiguration.defaultConfigurationForQuality(LFLiveVideoQuality.Low3, landscape: false)
|
||||
let session = LFLiveSession(audioConfiguration: audioConfiguration, videoConfiguration: videoConfiguration)
|
||||
|
||||
session?.delegate = self
|
||||
session?.preView = self.view
|
||||
return session!
|
||||
}()
|
||||
|
||||
//MARK: - Getters and Setters
|
||||
lazy var session: LFLiveSession = {
|
||||
let audioConfiguration = LFLiveAudioConfiguration.defaultConfiguration()
|
||||
let videoConfiguration = LFLiveVideoConfiguration.defaultConfigurationForQuality(LFLiveVideoQuality.Low3, landscape: false)
|
||||
let session = LFLiveSession(audioConfiguration: audioConfiguration, videoConfiguration: videoConfiguration)
|
||||
|
||||
session?.delegate = self
|
||||
session?.preView = self.view
|
||||
return session!
|
||||
}()
|
||||
//MARK: - Event
|
||||
func startLive() -> Void {
|
||||
let stream = LFLiveStreamInfo()
|
||||
stream.url = "your server rtmp url";
|
||||
session.startLive(stream)
|
||||
}
|
||||
|
||||
//MARK: - Event
|
||||
func startLive() -> Void {
|
||||
let stream = LFLiveStreamInfo()
|
||||
stream.url = "your server rtmp url";
|
||||
session.startLive(stream)
|
||||
}
|
||||
|
||||
func stopLive() -> Void {
|
||||
session.stopLive()
|
||||
}
|
||||
|
||||
//MARK: - Callback
|
||||
func liveSession(session: LFLiveSession?, debugInfo: LFLiveDebug?)
|
||||
func liveSession(session: LFLiveSession?, errorCode: LFLiveSocketErrorCode)
|
||||
func liveSession(session: LFLiveSession?, liveStateDidChange state: LFLiveState)
|
||||
func stopLive() -> Void {
|
||||
session.stopLive()
|
||||
}
|
||||
|
||||
//MARK: - Callback
|
||||
func liveSession(session: LFLiveSession?, debugInfo: LFLiveDebug?)
|
||||
func liveSession(session: LFLiveSession?, errorCode: LFLiveSocketErrorCode)
|
||||
func liveSession(session: LFLiveSession?, liveStateDidChange state: LFLiveState)
|
||||
```
|
||||
|
||||
## Release History
|
||||
* 2.0.0
|
||||
* CHANGE: modify bugs,support ios7 live.
|
||||
* 2.2.4.3
|
||||
* CHANGE: modify bugs,support swift import.
|
||||
|
||||
|
||||
## License
|
||||
|
||||
Vendored
BIN
Binary file not shown.
-42
@@ -1,42 +0,0 @@
|
||||
// This is Jeff LaMarche's GLProgram OpenGL shader wrapper class from his OpenGL ES 2.0 book.
|
||||
// A description of this can be found at his page on the topic:
|
||||
// http://iphonedevelopment.blogspot.com/2010/11/opengl-es-20-for-ios-chapter-4.html
|
||||
// I've extended this to be able to take programs as NSStrings in addition to files, for baked-in shaders
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE
|
||||
#import <OpenGLES/ES2/gl.h>
|
||||
#import <OpenGLES/ES2/glext.h>
|
||||
#else
|
||||
#import <OpenGL/OpenGL.h>
|
||||
#import <OpenGL/gl.h>
|
||||
#endif
|
||||
|
||||
@interface GLProgram : NSObject
|
||||
{
|
||||
NSMutableArray *attributes;
|
||||
NSMutableArray *uniforms;
|
||||
GLuint program,
|
||||
vertShader,
|
||||
fragShader;
|
||||
}
|
||||
|
||||
@property(readwrite, nonatomic) BOOL initialized;
|
||||
@property(readwrite, copy, nonatomic) NSString *vertexShaderLog;
|
||||
@property(readwrite, copy, nonatomic) NSString *fragmentShaderLog;
|
||||
@property(readwrite, copy, nonatomic) NSString *programLog;
|
||||
|
||||
- (id)initWithVertexShaderString:(NSString *)vShaderString
|
||||
fragmentShaderString:(NSString *)fShaderString;
|
||||
- (id)initWithVertexShaderString:(NSString *)vShaderString
|
||||
fragmentShaderFilename:(NSString *)fShaderFilename;
|
||||
- (id)initWithVertexShaderFilename:(NSString *)vShaderFilename
|
||||
fragmentShaderFilename:(NSString *)fShaderFilename;
|
||||
- (void)addAttribute:(NSString *)attributeName;
|
||||
- (GLuint)attributeIndex:(NSString *)attributeName;
|
||||
- (GLuint)uniformIndex:(NSString *)uniformName;
|
||||
- (BOOL)link;
|
||||
- (void)use;
|
||||
- (void)validate;
|
||||
@end
|
||||
-170
@@ -1,170 +0,0 @@
|
||||
#import "GLProgram.h"
|
||||
|
||||
// Base classes
|
||||
#import "GPUImageContext.h"
|
||||
#import "GPUImageOutput.h"
|
||||
#import "GPUImageView.h"
|
||||
#import "GPUImageVideoCamera.h"
|
||||
#import "GPUImageStillCamera.h"
|
||||
#import "GPUImageMovie.h"
|
||||
#import "GPUImagePicture.h"
|
||||
#import "GPUImageRawDataInput.h"
|
||||
#import "GPUImageRawDataOutput.h"
|
||||
#import "GPUImageMovieWriter.h"
|
||||
#import "GPUImageFilterPipeline.h"
|
||||
#import "GPUImageTextureOutput.h"
|
||||
#import "GPUImageFilterGroup.h"
|
||||
#import "GPUImageTextureInput.h"
|
||||
#import "GPUImageUIElement.h"
|
||||
#import "GPUImageBuffer.h"
|
||||
#import "GPUImageFramebuffer.h"
|
||||
#import "GPUImageFramebufferCache.h"
|
||||
|
||||
// Filters
|
||||
#import "GPUImageFilter.h"
|
||||
#import "GPUImageTwoInputFilter.h"
|
||||
#import "GPUImagePixellateFilter.h"
|
||||
#import "GPUImagePixellatePositionFilter.h"
|
||||
#import "GPUImageSepiaFilter.h"
|
||||
#import "GPUImageColorInvertFilter.h"
|
||||
#import "GPUImageSaturationFilter.h"
|
||||
#import "GPUImageContrastFilter.h"
|
||||
#import "GPUImageExposureFilter.h"
|
||||
#import "GPUImageBrightnessFilter.h"
|
||||
#import "GPUImageLevelsFilter.h"
|
||||
#import "GPUImageSharpenFilter.h"
|
||||
#import "GPUImageGammaFilter.h"
|
||||
#import "GPUImageSobelEdgeDetectionFilter.h"
|
||||
#import "GPUImageSketchFilter.h"
|
||||
#import "GPUImageToonFilter.h"
|
||||
#import "GPUImageSmoothToonFilter.h"
|
||||
#import "GPUImageMultiplyBlendFilter.h"
|
||||
#import "GPUImageDissolveBlendFilter.h"
|
||||
#import "GPUImageKuwaharaFilter.h"
|
||||
#import "GPUImageKuwaharaRadius3Filter.h"
|
||||
#import "GPUImageVignetteFilter.h"
|
||||
#import "GPUImageGaussianBlurFilter.h"
|
||||
#import "GPUImageGaussianBlurPositionFilter.h"
|
||||
#import "GPUImageGaussianSelectiveBlurFilter.h"
|
||||
#import "GPUImageOverlayBlendFilter.h"
|
||||
#import "GPUImageDarkenBlendFilter.h"
|
||||
#import "GPUImageLightenBlendFilter.h"
|
||||
#import "GPUImageSwirlFilter.h"
|
||||
#import "GPUImageSourceOverBlendFilter.h"
|
||||
#import "GPUImageColorBurnBlendFilter.h"
|
||||
#import "GPUImageColorDodgeBlendFilter.h"
|
||||
#import "GPUImageScreenBlendFilter.h"
|
||||
#import "GPUImageExclusionBlendFilter.h"
|
||||
#import "GPUImageDifferenceBlendFilter.h"
|
||||
#import "GPUImageSubtractBlendFilter.h"
|
||||
#import "GPUImageHardLightBlendFilter.h"
|
||||
#import "GPUImageSoftLightBlendFilter.h"
|
||||
#import "GPUImageColorBlendFilter.h"
|
||||
#import "GPUImageHueBlendFilter.h"
|
||||
#import "GPUImageSaturationBlendFilter.h"
|
||||
#import "GPUImageLuminosityBlendFilter.h"
|
||||
#import "GPUImageCropFilter.h"
|
||||
#import "GPUImageGrayscaleFilter.h"
|
||||
#import "GPUImageTransformFilter.h"
|
||||
#import "GPUImageChromaKeyBlendFilter.h"
|
||||
#import "GPUImageHazeFilter.h"
|
||||
#import "GPUImageLuminanceThresholdFilter.h"
|
||||
#import "GPUImagePosterizeFilter.h"
|
||||
#import "GPUImageBoxBlurFilter.h"
|
||||
#import "GPUImageAdaptiveThresholdFilter.h"
|
||||
#import "GPUImageSolarizeFilter.h"
|
||||
#import "GPUImageUnsharpMaskFilter.h"
|
||||
#import "GPUImageBulgeDistortionFilter.h"
|
||||
#import "GPUImagePinchDistortionFilter.h"
|
||||
#import "GPUImageCrosshatchFilter.h"
|
||||
#import "GPUImageCGAColorspaceFilter.h"
|
||||
#import "GPUImagePolarPixellateFilter.h"
|
||||
#import "GPUImageStretchDistortionFilter.h"
|
||||
#import "GPUImagePerlinNoiseFilter.h"
|
||||
#import "GPUImageJFAVoronoiFilter.h"
|
||||
#import "GPUImageVoronoiConsumerFilter.h"
|
||||
#import "GPUImageMosaicFilter.h"
|
||||
#import "GPUImageTiltShiftFilter.h"
|
||||
#import "GPUImage3x3ConvolutionFilter.h"
|
||||
#import "GPUImageEmbossFilter.h"
|
||||
#import "GPUImageCannyEdgeDetectionFilter.h"
|
||||
#import "GPUImageThresholdEdgeDetectionFilter.h"
|
||||
#import "GPUImageMaskFilter.h"
|
||||
#import "GPUImageHistogramFilter.h"
|
||||
#import "GPUImageHistogramGenerator.h"
|
||||
#import "GPUImageHistogramEqualizationFilter.h"
|
||||
#import "GPUImagePrewittEdgeDetectionFilter.h"
|
||||
#import "GPUImageXYDerivativeFilter.h"
|
||||
#import "GPUImageHarrisCornerDetectionFilter.h"
|
||||
#import "GPUImageAlphaBlendFilter.h"
|
||||
#import "GPUImageNormalBlendFilter.h"
|
||||
#import "GPUImageNonMaximumSuppressionFilter.h"
|
||||
#import "GPUImageRGBFilter.h"
|
||||
#import "GPUImageMedianFilter.h"
|
||||
#import "GPUImageBilateralFilter.h"
|
||||
#import "GPUImageCrosshairGenerator.h"
|
||||
#import "GPUImageToneCurveFilter.h"
|
||||
#import "GPUImageNobleCornerDetectionFilter.h"
|
||||
#import "GPUImageShiTomasiFeatureDetectionFilter.h"
|
||||
#import "GPUImageErosionFilter.h"
|
||||
#import "GPUImageRGBErosionFilter.h"
|
||||
#import "GPUImageDilationFilter.h"
|
||||
#import "GPUImageRGBDilationFilter.h"
|
||||
#import "GPUImageOpeningFilter.h"
|
||||
#import "GPUImageRGBOpeningFilter.h"
|
||||
#import "GPUImageClosingFilter.h"
|
||||
#import "GPUImageRGBClosingFilter.h"
|
||||
#import "GPUImageColorPackingFilter.h"
|
||||
#import "GPUImageSphereRefractionFilter.h"
|
||||
#import "GPUImageMonochromeFilter.h"
|
||||
#import "GPUImageOpacityFilter.h"
|
||||
#import "GPUImageHighlightShadowFilter.h"
|
||||
#import "GPUImageFalseColorFilter.h"
|
||||
#import "GPUImageHSBFilter.h"
|
||||
#import "GPUImageHueFilter.h"
|
||||
#import "GPUImageGlassSphereFilter.h"
|
||||
#import "GPUImageLookupFilter.h"
|
||||
#import "GPUImageAmatorkaFilter.h"
|
||||
#import "GPUImageMissEtikateFilter.h"
|
||||
#import "GPUImageSoftEleganceFilter.h"
|
||||
#import "GPUImageAddBlendFilter.h"
|
||||
#import "GPUImageDivideBlendFilter.h"
|
||||
#import "GPUImagePolkaDotFilter.h"
|
||||
#import "GPUImageLocalBinaryPatternFilter.h"
|
||||
#import "GPUImageColorLocalBinaryPatternFilter.h"
|
||||
#import "GPUImageLanczosResamplingFilter.h"
|
||||
#import "GPUImageAverageColor.h"
|
||||
#import "GPUImageSolidColorGenerator.h"
|
||||
#import "GPUImageLuminosity.h"
|
||||
#import "GPUImageAverageLuminanceThresholdFilter.h"
|
||||
#import "GPUImageWhiteBalanceFilter.h"
|
||||
#import "GPUImageChromaKeyFilter.h"
|
||||
#import "GPUImageLowPassFilter.h"
|
||||
#import "GPUImageHighPassFilter.h"
|
||||
#import "GPUImageMotionDetector.h"
|
||||
#import "GPUImageHalftoneFilter.h"
|
||||
#import "GPUImageThresholdedNonMaximumSuppressionFilter.h"
|
||||
#import "GPUImageHoughTransformLineDetector.h"
|
||||
#import "GPUImageParallelCoordinateLineTransformFilter.h"
|
||||
#import "GPUImageThresholdSketchFilter.h"
|
||||
#import "GPUImageLineGenerator.h"
|
||||
#import "GPUImageLinearBurnBlendFilter.h"
|
||||
#import "GPUImageGaussianBlurPositionFilter.h"
|
||||
#import "GPUImagePixellatePositionFilter.h"
|
||||
#import "GPUImageTwoInputCrossTextureSamplingFilter.h"
|
||||
#import "GPUImagePoissonBlendFilter.h"
|
||||
#import "GPUImageMotionBlurFilter.h"
|
||||
#import "GPUImageZoomBlurFilter.h"
|
||||
#import "GPUImageLaplacianFilter.h"
|
||||
#import "GPUImageiOSBlurFilter.h"
|
||||
#import "GPUImageLuminanceRangeFilter.h"
|
||||
#import "GPUImageDirectionalNonMaximumSuppressionFilter.h"
|
||||
#import "GPUImageDirectionalSobelEdgeDetectionFilter.h"
|
||||
#import "GPUImageSingleComponentGaussianBlurFilter.h"
|
||||
#import "GPUImageThreeInputFilter.h"
|
||||
#import "GPUImageFourInputFilter.h"
|
||||
#import "GPUImageWeakPixelInclusionFilter.h"
|
||||
#import "GPUImageColorConversion.h"
|
||||
#import "GPUImageColourFASTFeatureDetector.h"
|
||||
#import "GPUImageColourFASTSamplingOperation.h"
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
#import "GPUImage3x3TextureSamplingFilter.h"
|
||||
|
||||
/** Runs a 3x3 convolution kernel against the image
|
||||
*/
|
||||
@interface GPUImage3x3ConvolutionFilter : GPUImage3x3TextureSamplingFilter
|
||||
{
|
||||
GLint convolutionMatrixUniform;
|
||||
}
|
||||
|
||||
/** Convolution kernel to run against the image
|
||||
|
||||
The convolution kernel is a 3x3 matrix of values to apply to the pixel and its 8 surrounding pixels.
|
||||
The matrix is specified in row-major order, with the top left pixel being one.one and the bottom right three.three
|
||||
If the values in the matrix don't add up to 1.0, the image could be brightened or darkened.
|
||||
*/
|
||||
@property(readwrite, nonatomic) GPUMatrix3x3 convolutionKernel;
|
||||
|
||||
@end
|
||||
@@ -1,18 +0,0 @@
|
||||
#import "GPUImageFilter.h"
|
||||
|
||||
extern NSString *const kGPUImageNearbyTexelSamplingVertexShaderString;
|
||||
|
||||
@interface GPUImage3x3TextureSamplingFilter : GPUImageFilter
|
||||
{
|
||||
GLint texelWidthUniform, texelHeightUniform;
|
||||
|
||||
CGFloat texelWidth, texelHeight;
|
||||
BOOL hasOverriddenImageSizeFactor;
|
||||
}
|
||||
|
||||
// The texel width and height determines how far out to sample from this texel. By default, this is the normalized width of a pixel, but this can be overridden for different effects.
|
||||
@property(readwrite, nonatomic) CGFloat texelWidth;
|
||||
@property(readwrite, nonatomic) CGFloat texelHeight;
|
||||
|
||||
|
||||
@end
|
||||
@@ -1,9 +0,0 @@
|
||||
#import "GPUImageFilterGroup.h"
|
||||
|
||||
@interface GPUImageAdaptiveThresholdFilter : GPUImageFilterGroup
|
||||
|
||||
/** A multiplier for the background averaging blur radius in pixels, with a default of 4
|
||||
*/
|
||||
@property(readwrite, nonatomic) CGFloat blurRadiusInPixels;
|
||||
|
||||
@end
|
||||
@@ -1,5 +0,0 @@
|
||||
#import "GPUImageTwoInputFilter.h"
|
||||
|
||||
@interface GPUImageAddBlendFilter : GPUImageTwoInputFilter
|
||||
|
||||
@end
|
||||
@@ -1,11 +0,0 @@
|
||||
#import "GPUImageTwoInputFilter.h"
|
||||
|
||||
@interface GPUImageAlphaBlendFilter : GPUImageTwoInputFilter
|
||||
{
|
||||
GLint mixUniform;
|
||||
}
|
||||
|
||||
// Mix ranges from 0.0 (only image 1) to 1.0 (only image 2), with 1.0 as the normal level
|
||||
@property(readwrite, nonatomic) CGFloat mix;
|
||||
|
||||
@end
|
||||
@@ -1,17 +0,0 @@
|
||||
#import "GPUImageFilterGroup.h"
|
||||
|
||||
@class GPUImagePicture;
|
||||
|
||||
/** A photo filter based on Photoshop action by Amatorka
|
||||
http://amatorka.deviantart.com/art/Amatorka-Action-2-121069631
|
||||
*/
|
||||
|
||||
// Note: If you want to use this effect you have to add lookup_amatorka.png
|
||||
// from Resources folder to your application bundle.
|
||||
|
||||
@interface GPUImageAmatorkaFilter : GPUImageFilterGroup
|
||||
{
|
||||
GPUImagePicture *lookupImageSource;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,20 +0,0 @@
|
||||
#import "GPUImageFilter.h"
|
||||
|
||||
extern NSString *const kGPUImageColorAveragingVertexShaderString;
|
||||
|
||||
@interface GPUImageAverageColor : GPUImageFilter
|
||||
{
|
||||
GLint texelWidthUniform, texelHeightUniform;
|
||||
|
||||
NSUInteger numberOfStages;
|
||||
|
||||
GLubyte *rawImagePixels;
|
||||
CGSize finalStageSize;
|
||||
}
|
||||
|
||||
// This block is called on the completion of color averaging for a frame
|
||||
@property(nonatomic, copy) void(^colorAverageProcessingFinishedBlock)(CGFloat redComponent, CGFloat greenComponent, CGFloat blueComponent, CGFloat alphaComponent, CMTime frameTime);
|
||||
|
||||
- (void)extractAverageColorAtFrameTime:(CMTime)frameTime;
|
||||
|
||||
@end
|
||||
@@ -1,8 +0,0 @@
|
||||
#import "GPUImageFilterGroup.h"
|
||||
|
||||
@interface GPUImageAverageLuminanceThresholdFilter : GPUImageFilterGroup
|
||||
|
||||
// This is multiplied by the continually calculated average image luminosity to arrive at the final threshold. Default is 1.0.
|
||||
@property(readwrite, nonatomic) CGFloat thresholdMultiplier;
|
||||
|
||||
@end
|
||||
@@ -1,10 +0,0 @@
|
||||
#import "GPUImageGaussianBlurFilter.h"
|
||||
|
||||
@interface GPUImageBilateralFilter : GPUImageGaussianBlurFilter
|
||||
{
|
||||
CGFloat firstDistanceNormalizationFactorUniform;
|
||||
CGFloat secondDistanceNormalizationFactorUniform;
|
||||
}
|
||||
// A normalization factor for the distance between central color and sample color.
|
||||
@property(nonatomic, readwrite) CGFloat distanceNormalizationFactor;
|
||||
@end
|
||||
@@ -1,7 +0,0 @@
|
||||
#import "GPUImageGaussianBlurFilter.h"
|
||||
|
||||
/** A hardware-accelerated box blur of an image
|
||||
*/
|
||||
@interface GPUImageBoxBlurFilter : GPUImageGaussianBlurFilter
|
||||
|
||||
@end
|
||||
@@ -1,11 +0,0 @@
|
||||
#import "GPUImageFilter.h"
|
||||
|
||||
@interface GPUImageBrightnessFilter : GPUImageFilter
|
||||
{
|
||||
GLint brightnessUniform;
|
||||
}
|
||||
|
||||
// Brightness ranges from -1.0 to 1.0, with 0.0 as the normal level
|
||||
@property(readwrite, nonatomic) CGFloat brightness;
|
||||
|
||||
@end
|
||||
@@ -1,10 +0,0 @@
|
||||
#import "GPUImageFilter.h"
|
||||
|
||||
@interface GPUImageBuffer : GPUImageFilter
|
||||
{
|
||||
NSMutableArray *bufferedFramebuffers;
|
||||
}
|
||||
|
||||
@property(readwrite, nonatomic) NSUInteger bufferSize;
|
||||
|
||||
@end
|
||||
@@ -1,16 +0,0 @@
|
||||
#import "GPUImageFilter.h"
|
||||
|
||||
/// Creates a bulge distortion on the image
|
||||
@interface GPUImageBulgeDistortionFilter : GPUImageFilter
|
||||
{
|
||||
GLint aspectRatioUniform, radiusUniform, centerUniform, scaleUniform;
|
||||
}
|
||||
|
||||
/// The center about which to apply the distortion, with a default of (0.5, 0.5)
|
||||
@property(readwrite, nonatomic) CGPoint center;
|
||||
/// The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.25
|
||||
@property(readwrite, nonatomic) CGFloat radius;
|
||||
/// The amount of distortion to apply, from -1.0 to 1.0, with a default of 0.5
|
||||
@property(readwrite, nonatomic) CGFloat scale;
|
||||
|
||||
@end
|
||||
@@ -1,5 +0,0 @@
|
||||
#import "GPUImageFilter.h"
|
||||
|
||||
@interface GPUImageCGAColorspaceFilter : GPUImageFilter
|
||||
|
||||
@end
|
||||
@@ -1,62 +0,0 @@
|
||||
#import "GPUImageFilterGroup.h"
|
||||
|
||||
@class GPUImageGrayscaleFilter;
|
||||
@class GPUImageSingleComponentGaussianBlurFilter;
|
||||
@class GPUImageDirectionalSobelEdgeDetectionFilter;
|
||||
@class GPUImageDirectionalNonMaximumSuppressionFilter;
|
||||
@class GPUImageWeakPixelInclusionFilter;
|
||||
|
||||
/** This applies the edge detection process described by John Canny in
|
||||
|
||||
Canny, J., A Computational Approach To Edge Detection, IEEE Trans. Pattern Analysis and Machine Intelligence, 8(6):679–698, 1986.
|
||||
|
||||
and implemented in OpenGL ES by
|
||||
|
||||
A. Ensor, S. Hall. GPU-based Image Analysis on Mobile Devices. Proceedings of Image and Vision Computing New Zealand 2011.
|
||||
|
||||
It starts with a conversion to luminance, followed by an accelerated 9-hit Gaussian blur. A Sobel operator is applied to obtain the overall
|
||||
gradient strength in the blurred image, as well as the direction (in texture sampling steps) of the gradient. A non-maximum suppression filter
|
||||
acts along the direction of the gradient, highlighting strong edges that pass the threshold and completely removing those that fail the lower
|
||||
threshold. Finally, pixels from in-between these thresholds are either included in edges or rejected based on neighboring pixels.
|
||||
*/
|
||||
@interface GPUImageCannyEdgeDetectionFilter : GPUImageFilterGroup
|
||||
{
|
||||
GPUImageGrayscaleFilter *luminanceFilter;
|
||||
GPUImageSingleComponentGaussianBlurFilter *blurFilter;
|
||||
GPUImageDirectionalSobelEdgeDetectionFilter *edgeDetectionFilter;
|
||||
GPUImageDirectionalNonMaximumSuppressionFilter *nonMaximumSuppressionFilter;
|
||||
GPUImageWeakPixelInclusionFilter *weakPixelInclusionFilter;
|
||||
}
|
||||
|
||||
/** The image width and height factors tweak the appearance of the edges.
|
||||
|
||||
These parameters affect the visibility of the detected edges
|
||||
|
||||
By default, they match the inverse of the filter size in pixels
|
||||
*/
|
||||
@property(readwrite, nonatomic) CGFloat texelWidth;
|
||||
/** The image width and height factors tweak the appearance of the edges.
|
||||
|
||||
These parameters affect the visibility of the detected edges
|
||||
|
||||
By default, they match the inverse of the filter size in pixels
|
||||
*/
|
||||
@property(readwrite, nonatomic) CGFloat texelHeight;
|
||||
|
||||
/** The underlying blur radius for the Gaussian blur. Default is 2.0.
|
||||
*/
|
||||
@property (readwrite, nonatomic) CGFloat blurRadiusInPixels;
|
||||
|
||||
/** The underlying blur texel spacing multiplier. Default is 1.0.
|
||||
*/
|
||||
@property (readwrite, nonatomic) CGFloat blurTexelSpacingMultiplier;
|
||||
|
||||
/** Any edge with a gradient magnitude above this threshold will pass and show up in the final result.
|
||||
*/
|
||||
@property(readwrite, nonatomic) CGFloat upperThreshold;
|
||||
|
||||
/** Any edge with a gradient magnitude below this threshold will fail and be removed from the final result.
|
||||
*/
|
||||
@property(readwrite, nonatomic) CGFloat lowerThreshold;
|
||||
|
||||
@end
|
||||
@@ -1,32 +0,0 @@
|
||||
#import "GPUImageTwoInputFilter.h"
|
||||
|
||||
/** Selectively replaces a color in the first image with the second image
|
||||
*/
|
||||
@interface GPUImageChromaKeyBlendFilter : GPUImageTwoInputFilter
|
||||
{
|
||||
GLint colorToReplaceUniform, thresholdSensitivityUniform, smoothingUniform;
|
||||
}
|
||||
|
||||
/** The threshold sensitivity controls how similar pixels need to be colored to be replaced
|
||||
|
||||
The default value is 0.3
|
||||
*/
|
||||
@property(readwrite, nonatomic) CGFloat thresholdSensitivity;
|
||||
|
||||
/** The degree of smoothing controls how gradually similar colors are replaced in the image
|
||||
|
||||
The default value is 0.1
|
||||
*/
|
||||
@property(readwrite, nonatomic) CGFloat smoothing;
|
||||
|
||||
/** The color to be replaced is specified using individual red, green, and blue components (normalized to 1.0).
|
||||
|
||||
The default is green: (0.0, 1.0, 0.0).
|
||||
|
||||
@param redComponent Red component of color to be replaced
|
||||
@param greenComponent Green component of color to be replaced
|
||||
@param blueComponent Blue component of color to be replaced
|
||||
*/
|
||||
- (void)setColorToReplaceRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent;
|
||||
|
||||
@end
|
||||
@@ -1,30 +0,0 @@
|
||||
#import "GPUImageFilter.h"
|
||||
|
||||
@interface GPUImageChromaKeyFilter : GPUImageFilter
|
||||
{
|
||||
GLint colorToReplaceUniform, thresholdSensitivityUniform, smoothingUniform;
|
||||
}
|
||||
|
||||
/** The threshold sensitivity controls how similar pixels need to be colored to be replaced
|
||||
|
||||
The default value is 0.3
|
||||
*/
|
||||
@property(readwrite, nonatomic) CGFloat thresholdSensitivity;
|
||||
|
||||
/** The degree of smoothing controls how gradually similar colors are replaced in the image
|
||||
|
||||
The default value is 0.1
|
||||
*/
|
||||
@property(readwrite, nonatomic) CGFloat smoothing;
|
||||
|
||||
/** The color to be replaced is specified using individual red, green, and blue components (normalized to 1.0).
|
||||
|
||||
The default is green: (0.0, 1.0, 0.0).
|
||||
|
||||
@param redComponent Red component of color to be replaced
|
||||
@param greenComponent Green component of color to be replaced
|
||||
@param blueComponent Blue component of color to be replaced
|
||||
*/
|
||||
- (void)setColorToReplaceRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent;
|
||||
|
||||
@end
|
||||
@@ -1,19 +0,0 @@
|
||||
#import "GPUImageFilterGroup.h"
|
||||
|
||||
@class GPUImageErosionFilter;
|
||||
@class GPUImageDilationFilter;
|
||||
|
||||
// A filter that first performs a dilation on the red channel of an image, followed by an erosion of the same radius.
|
||||
// This helps to filter out smaller dark elements.
|
||||
|
||||
@interface GPUImageClosingFilter : GPUImageFilterGroup
|
||||
{
|
||||
GPUImageErosionFilter *erosionFilter;
|
||||
GPUImageDilationFilter *dilationFilter;
|
||||
}
|
||||
|
||||
@property(readwrite, nonatomic) CGFloat verticalTexelSpacing, horizontalTexelSpacing;
|
||||
|
||||
- (id)initWithRadius:(NSUInteger)radius;
|
||||
|
||||
@end
|
||||
@@ -1,5 +0,0 @@
|
||||
#import "GPUImageTwoInputFilter.h"
|
||||
|
||||
@interface GPUImageColorBlendFilter : GPUImageTwoInputFilter
|
||||
|
||||
@end
|
||||
@@ -1,9 +0,0 @@
|
||||
#import "GPUImageTwoInputFilter.h"
|
||||
|
||||
/** Applies a color burn blend of two images
|
||||
*/
|
||||
@interface GPUImageColorBurnBlendFilter : GPUImageTwoInputFilter
|
||||
{
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,12 +0,0 @@
|
||||
#ifndef GPUImageColorConversion_h
|
||||
#define GPUImageColorConversion_h
|
||||
|
||||
extern GLfloat *kColorConversion601;
|
||||
extern GLfloat *kColorConversion601FullRange;
|
||||
extern GLfloat *kColorConversion709;
|
||||
extern NSString *const kGPUImageYUVVideoRangeConversionForRGFragmentShaderString;
|
||||
extern NSString *const kGPUImageYUVFullRangeConversionForLAFragmentShaderString;
|
||||
extern NSString *const kGPUImageYUVVideoRangeConversionForLAFragmentShaderString;
|
||||
|
||||
|
||||
#endif /* GPUImageColorConversion_h */
|
||||
@@ -1,9 +0,0 @@
|
||||
#import "GPUImageTwoInputFilter.h"
|
||||
|
||||
/** Applies a color dodge blend of two images
|
||||
*/
|
||||
@interface GPUImageColorDodgeBlendFilter : GPUImageTwoInputFilter
|
||||
{
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,7 +0,0 @@
|
||||
#import "GPUImageFilter.h"
|
||||
|
||||
@interface GPUImageColorInvertFilter : GPUImageFilter
|
||||
{
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,5 +0,0 @@
|
||||
#import "GPUImage3x3TextureSamplingFilter.h"
|
||||
|
||||
@interface GPUImageColorLocalBinaryPatternFilter : GPUImage3x3TextureSamplingFilter
|
||||
|
||||
@end
|
||||
@@ -1,19 +0,0 @@
|
||||
#import "GPUImageFilter.h"
|
||||
|
||||
/** Transforms the colors of an image by applying a matrix to them
|
||||
*/
|
||||
@interface GPUImageColorMatrixFilter : GPUImageFilter
|
||||
{
|
||||
GLint colorMatrixUniform;
|
||||
GLint intensityUniform;
|
||||
}
|
||||
|
||||
/** A 4x4 matrix used to transform each color in an image
|
||||
*/
|
||||
@property(readwrite, nonatomic) GPUMatrix4x4 colorMatrix;
|
||||
|
||||
/** The degree to which the new transformed color replaces the original color for each pixel
|
||||
*/
|
||||
@property(readwrite, nonatomic) CGFloat intensity;
|
||||
|
||||
@end
|
||||
@@ -1,10 +0,0 @@
|
||||
#import "GPUImageFilter.h"
|
||||
|
||||
@interface GPUImageColorPackingFilter : GPUImageFilter
|
||||
{
|
||||
GLint texelWidthUniform, texelHeightUniform;
|
||||
|
||||
CGFloat texelWidth, texelHeight;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,21 +0,0 @@
|
||||
#import "GPUImageFilterGroup.h"
|
||||
|
||||
// This generates image-wide feature descriptors using the ColourFAST process, as developed and described in
|
||||
//
|
||||
// A. Ensor and S. Hall. ColourFAST: GPU-based feature point detection and tracking on mobile devices. 28th International Conference of Image and Vision Computing, New Zealand, 2013, p. 124-129.
|
||||
//
|
||||
// Seth Hall, "GPU accelerated feature algorithms for mobile devices", PhD thesis, School of Computing and Mathematical Sciences, Auckland University of Technology 2014.
|
||||
// http://aut.researchgateway.ac.nz/handle/10292/7991
|
||||
|
||||
@class GPUImageColourFASTSamplingOperation;
|
||||
@class GPUImageBoxBlurFilter;
|
||||
|
||||
@interface GPUImageColourFASTFeatureDetector : GPUImageFilterGroup
|
||||
{
|
||||
GPUImageBoxBlurFilter *blurFilter;
|
||||
GPUImageColourFASTSamplingOperation *colourFASTSamplingOperation;
|
||||
}
|
||||
// The blur radius of the underlying box blur. The default is 3.0.
|
||||
@property (readwrite, nonatomic) CGFloat blurRadiusInPixels;
|
||||
|
||||
@end
|
||||
@@ -1,22 +0,0 @@
|
||||
#import "GPUImageTwoInputFilter.h"
|
||||
|
||||
// This is the feature extraction phase of the ColourFAST feature detector, as described in:
|
||||
//
|
||||
// A. Ensor and S. Hall. ColourFAST: GPU-based feature point detection and tracking on mobile devices. 28th International Conference of Image and Vision Computing, New Zealand, 2013, p. 124-129.
|
||||
//
|
||||
// Seth Hall, "GPU accelerated feature algorithms for mobile devices", PhD thesis, School of Computing and Mathematical Sciences, Auckland University of Technology 2014.
|
||||
// http://aut.researchgateway.ac.nz/handle/10292/7991
|
||||
|
||||
@interface GPUImageColourFASTSamplingOperation : GPUImageTwoInputFilter
|
||||
{
|
||||
GLint texelWidthUniform, texelHeightUniform;
|
||||
|
||||
CGFloat texelWidth, texelHeight;
|
||||
BOOL hasOverriddenImageSizeFactor;
|
||||
}
|
||||
|
||||
// The texel width and height determines how far out to sample from this texel. By default, this is the normalized width of a pixel, but this can be overridden for different effects.
|
||||
@property(readwrite, nonatomic) CGFloat texelWidth;
|
||||
@property(readwrite, nonatomic) CGFloat texelHeight;
|
||||
|
||||
@end
|
||||
@@ -1,64 +0,0 @@
|
||||
#import "GLProgram.h"
|
||||
#import "GPUImageFramebuffer.h"
|
||||
#import "GPUImageFramebufferCache.h"
|
||||
|
||||
#define GPUImageRotationSwapsWidthAndHeight(rotation) ((rotation) == kGPUImageRotateLeft || (rotation) == kGPUImageRotateRight || (rotation) == kGPUImageRotateRightFlipVertical || (rotation) == kGPUImageRotateRightFlipHorizontal)
|
||||
|
||||
typedef NS_ENUM(NSUInteger, GPUImageRotationMode) {
|
||||
kGPUImageNoRotation,
|
||||
kGPUImageRotateLeft,
|
||||
kGPUImageRotateRight,
|
||||
kGPUImageFlipVertical,
|
||||
kGPUImageFlipHorizonal,
|
||||
kGPUImageRotateRightFlipVertical,
|
||||
kGPUImageRotateRightFlipHorizontal,
|
||||
kGPUImageRotate180
|
||||
};
|
||||
|
||||
@interface GPUImageContext : NSObject
|
||||
|
||||
@property(readonly, nonatomic) dispatch_queue_t contextQueue;
|
||||
@property(readwrite, retain, nonatomic) GLProgram *currentShaderProgram;
|
||||
@property(readonly, retain, nonatomic) EAGLContext *context;
|
||||
@property(readonly) CVOpenGLESTextureCacheRef coreVideoTextureCache;
|
||||
@property(readonly) GPUImageFramebufferCache *framebufferCache;
|
||||
|
||||
+ (void *)contextKey;
|
||||
+ (GPUImageContext *)sharedImageProcessingContext;
|
||||
+ (dispatch_queue_t)sharedContextQueue;
|
||||
+ (GPUImageFramebufferCache *)sharedFramebufferCache;
|
||||
+ (void)useImageProcessingContext;
|
||||
- (void)useAsCurrentContext;
|
||||
+ (void)setActiveShaderProgram:(GLProgram *)shaderProgram;
|
||||
- (void)setContextShaderProgram:(GLProgram *)shaderProgram;
|
||||
+ (GLint)maximumTextureSizeForThisDevice;
|
||||
+ (GLint)maximumTextureUnitsForThisDevice;
|
||||
+ (GLint)maximumVaryingVectorsForThisDevice;
|
||||
+ (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension;
|
||||
+ (BOOL)deviceSupportsRedTextures;
|
||||
+ (BOOL)deviceSupportsFramebufferReads;
|
||||
+ (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize;
|
||||
|
||||
- (void)presentBufferForDisplay;
|
||||
- (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragmentShaderString:(NSString *)fragmentShaderString;
|
||||
|
||||
- (void)useSharegroup:(EAGLSharegroup *)sharegroup;
|
||||
|
||||
// Manage fast texture upload
|
||||
+ (BOOL)supportsFastTextureUpload;
|
||||
|
||||
@end
|
||||
|
||||
@protocol GPUImageInput <NSObject>
|
||||
- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex;
|
||||
- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex;
|
||||
- (NSInteger)nextAvailableTextureIndex;
|
||||
- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex;
|
||||
- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex;
|
||||
- (CGSize)maximumOutputSize;
|
||||
- (void)endProcessing;
|
||||
- (BOOL)shouldIgnoreUpdatesToThisTarget;
|
||||
- (BOOL)enabled;
|
||||
- (BOOL)wantsMonochromeInput;
|
||||
- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue;
|
||||
@end
|
||||
@@ -1,14 +0,0 @@
|
||||
#import "GPUImageFilter.h"
|
||||
|
||||
/** Adjusts the contrast of the image
|
||||
*/
|
||||
@interface GPUImageContrastFilter : GPUImageFilter
|
||||
{
|
||||
GLint contrastUniform;
|
||||
}
|
||||
|
||||
/** Contrast ranges from 0.0 to 4.0 (max contrast), with 1.0 as the normal level
|
||||
*/
|
||||
@property(readwrite, nonatomic) CGFloat contrast;
|
||||
|
||||
@end
|
||||
@@ -1,14 +0,0 @@
|
||||
#import "GPUImageFilter.h"
|
||||
|
||||
@interface GPUImageCropFilter : GPUImageFilter
|
||||
{
|
||||
GLfloat cropTextureCoordinates[8];
|
||||
}
|
||||
|
||||
// The crop region is the rectangle within the image to crop. It is normalized to a coordinate space from 0.0 to 1.0, with 0.0, 0.0 being the upper left corner of the image
|
||||
@property(readwrite, nonatomic) CGRect cropRegion;
|
||||
|
||||
// Initialization and teardown
|
||||
- (id)initWithCropRegion:(CGRect)newCropRegion;
|
||||
|
||||
@end
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user