Giter Site home page Giter Site logo

pili-engineering / plcamerastreamingkit Goto Github PK

View Code? Open in Web Editor NEW
1.0K 99.0 257.0 83.13 MB

PLCameraStreamingKit 是 Pili 直播 SDK 的 iOS 推流端,是带有采集模块老版本 SDK。如果是新用户接入,建议使用 PLMediaStreamingKit。该版本支持 RTMP 推流,h.264 和 AAC 编码,硬编软编支持。具有丰富的数据和状态回调,方便用户根据自己的业务定制化开发。具有直播场景下的重要功能,如:美颜、背景音乐、水印等功能。

Home Page: https://github.com/pili-engineering/PLMediaStreamingKit

License: Apache License 2.0

Objective-C 38.01% Ruby 0.09% Shell 0.50% C 47.10% C++ 13.68% Objective-C++ 0.62%

plcamerastreamingkit's Introduction

PLCameraStreamingKit

概述

PLCameraStreamingKit 是一个适用于 iOS 的 RTMP 直播推流 SDK,可高度定制化和二次开发。特色是支持 iOS Camera 画面捕获并进行 H.264 硬编码,以及支持 iOS 麦克风音频采样并进行 AAC 硬编码;同时,还根据移动网络环境的多变性,实现了一套可供开发者灵活选择的编码参数集合。借助 PLCameraStreamingKit,开发者可以快速构建一款类似 MeerkatPeriscope 的手机直播应用。

PLCameraStreamingKit Wiki

请参考 Wiki 文档:PLCameraStreamingKit 开发指南

重要通知

PLCameraStreamingKit 已与 PLStreamingKit 合并为 PLMediaStreamingKit, 此 repo 将停止更新,请老用户迁移到 PLMediaStreamingKit

plcamerastreamingkit's People

Contributors

lawder avatar longbai avatar why404 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

plcamerastreamingkit's Issues

现在遇到的一个很苦恼的问题,就是推流有时会反复重试失败

这是一个staic的推流地址 "rtmp://pub.z1.glb.pili.qiniup.com/gouhuolive/5544ef69fb16df2e330001d7?key=e51a45450d680f32"

大部分时间是正常的,但有时会出现问题

2015-05-29 18:22:19.698 gouhuo-native[3617:1092423] Stream State: Connecting
2015-05-29 18:22:19.973 gouhuo-native[3617:1092423] Stream State: Connected
ERROR: WriteN, RTMP send error 32 (129 bytes)
ERROR: WriteN, RTMP send error 32 (80 bytes)
ERROR: WriteN, RTMP send error 9 (42 bytes)
2015-05-29 18:22:25.287 gouhuo-native[3617:1092423] Stream State: Error
2015-05-29 18:22:29.667 gouhuo-native[3617:1092423] Stream State: Connecting
2015-05-29 18:22:29.991 gouhuo-native[3617:1092423] Stream State: Connected
ERROR: WriteN, RTMP send error 32 (129 bytes)
ERROR: WriteN, RTMP send error 32 (80 bytes)
ERROR: WriteN, RTMP send error 9 (42 bytes)
2015-05-29 18:22:43.943 gouhuo-native[3617:1092423] Stream State: Error
2015-05-29 18:22:45.835 gouhuo-native[3617:1092423] Stream State: Connecting
2015-05-29 18:22:46.159 gouhuo-native[3617:1092423] Stream State: Connected

比较苦恼的是,也无法做什么事情。。。。

直播的时候,进入后台,偶尔会发送这个错误

  • thread #49: tid = 0x31c4e5, 0x003a96c2 AGVideo`RTMP_Close(r=0x717f513c) + 14 at rtmp.c:4073, queue = 'pili.queue.rtmpSent', stop reason = EXC_BAD_ACCESS (code=1, address=0x717f92d4)
    • frame #0: 0x003a96c2 AGVideo`RTMP_Close(r=0x717f513c) + 14 at rtmp.c:4073

      frame #1: 0x003a8b46 AGVideo`_pili_stream_push_close(context=0x17f2f820, stream_state=) + 26 at push.c:107

      frame #2: 0x01369172 libdispatch.dylib`_dispatch_call_block_and_release + 10

      frame #3: 0x01371d66 libdispatch.dylib`_dispatch_queue_drain + 1718

      frame #4: 0x0136ba60 libdispatch.dylib`_dispatch_queue_invoke + 88

      frame #5: 0x01373b08 libdispatch.dylib`_dispatch_root_queue_drain + 1308

      frame #6: 0x01374e18 libdispatch.dylib`_dispatch_worker_thread3 + 100

      frame #7: 0x32e17dc0 libsystem_pthread.dylib`_pthread_wqthread + 668

      frame #8: 0x32e17b14 libsystem_pthread.dylib`start_wqthread + 8

dfsd

PLStream Dictionary for Wowza Server

NSDictionary *streamJSON = @{@"id": @"live",
@"title": @"Sample",
@"hub": @"live",
@"publishKey": @"publish_key",
@"publishSecurity": @"dynamic", // or static
@"disabled": @(NO),
@"profiles": @[@"480p", @"720p"], // or empty Array []
@"hosts": @{
@"publish": @{
@"rtmp": @"xx.xx.xx.xx:1935"
}
}

                                  }; 

Is it right configurations for Wowza server.

Thanks,
Chinna

关于延时的问题

今天实测了一下,从RTMP播出去,到HLS获取,中间有47s的延时,就是说HLS收看那一端是47s后的内容,这个延时有什么参数可以控制变小呢?感谢

fps不能有20吗,只有15和30

我想在20fps上提高码率,提高分辨率,想在512kbps上面获取更清晰的画面。但现在是有15fps和30fps。30fps的情况下,码率提高了很多,但画面还是模糊。如果我提高分辨率,保持码率不变的话,画面会出现方块。

为啥这个回调中没有告诉我为啥失败了呢?在iPhone5中总是失败

[self.session startWithCompleted:^(BOOL success) {
// 这里的代码在主线程运行,所以可以放心对 UI 控件做操作
if (success) {
// 连接成功后的处理
// 成功后,在这里才可以读取 self.session.pushURL,start 失败和之前不能确保读取到正确的 URL
} else {
// 连接失败后的处理
}
}];

Help Wanted

streamJSON 结构中的有些参数不太清楚,能在介绍的详细点吗?比如hub,publishKey等

音频相关经常报错

ERROR: [0x3cd3000] >aurioc> 806: failed: -66635 (enable 3, outf< 1 ch, 0 Hz, Float32> inf< 2 ch, 44100 Hz, Int16, inter>)

添加推流 buffer 队列

可变 buffer 长度,有上下阈值可以设定。开发者可以基于 buffer 队列的情况自行切换 Quality。

想问下这些流的参数应该怎么填写

PLStream *stream = [PLStream streamWithJSON:@{@"id": @"STREAM_ID",
@"title": @"STREAM_TITLE",
@"hub": @"HUB_NAME",
@"publishKey": @"PUBLISH_KEY",
@"publishSecurity": @"dynamic", // or static
@"disabled": @(NO)}];

我配置了几次都抱错误:ERROR: Problem accessing the DNS. (addr: rtmp)

startWithCompleted失败的代理回调问题

startWithCompleted失败后会回调- (void)cameraStreamingSession:(PLCameraStreamingSession *)session streamStateDidChange:(PLStreamState)state进入PLStreamStateDisconnected状态,但我觉得这样不合理。PLStreamStateDisconnected只应该发生在PLStreamStateConnected之后,只有连上后才会有断开的的状态,但startWithCompleted失败的过程中并没有经历PLStreamStateConnected状态。

pod更新之后出现大量符号重复

/Users/mao/AGVideo/AGVideo/Pods/PLCameraStreamingKit/Pod/Library/lib/libPLCameraStreamingKit.a(tls_srp.o)
/Users/mao/AGVideo/AGVideo/Pods/PLCameraStreamingKit/Pod/Library/lib/libssl-ios.a(tls_srp.o)

duplicate symbol _SSL_CTX_set_srp_client_pwd_callback in:
/Users/mao/AGVideo/AGVideo/Pods/PLCameraStreamingKit/Pod/Library/lib/libPLCameraStreamingKit.a(tls_srp.o)
/Users/mao/AGVideo/AGVideo/Pods/PLCameraStreamingKit/Pod/Library/lib/libssl-ios.a(tls_srp.o)
duplicate symbol _ssl_add_clienthello_renegotiate_ext in:
/Users/mao/AGVideo/AGVideo/Pods/PLCameraStreamingKit/Pod/Library/lib/libPLCameraStreamingKit.a(t1_reneg.o)
/Users/mao/AGVideo/AGVideo/Pods/PLCameraStreamingKit/Pod/Library/lib/libssl-ios.a(t1_reneg.o)
duplicate symbol _ssl_parse_clienthello_renegotiate_ext in:
/Users/mao/AGVideo/AGVideo/Pods/PLCameraStreamingKit/Pod/Library/lib/libPLCameraStreamingKit.a(t1_reneg.o)
/Users/mao/AGVideo/AGVideo/Pods/PLCameraStreamingKit/Pod/Library/lib/libssl-ios.a(t1_reneg.o)
duplicate symbol _ssl_add_serverhello_renegotiate_ext in:
/Users/mao/AGVideo/AGVideo/Pods/PLCameraStreamingKit/Pod/Library/lib/libPLCameraStreamingKit.a(t1_reneg.o)
/Users/mao/AGVideo/AGVideo/Pods/PLCameraStreamingKit/Pod/Library/lib/libssl-ios.a(t1_reneg.o)
duplicate symbol _ssl_parse_serverhello_renegotiate_ext in:
/Users/mao/AGVideo/AGVideo/Pods/PLCameraStreamingKit/Pod/Library/lib/libPLCameraStreamingKit.a(t1_reneg.o)
/Users/mao/AGVideo/AGVideo/Pods/PLCameraStreamingKit/Pod/Library/lib/libssl-ios.a(t1_reneg.o)
ld: 4890 duplicate symbols for architecture x86_64

[AVAssetWriter startSessionAtSourceTime:] Cannot call method when status is 0'

* Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '* -[AVAssetWriter startSessionAtSourceTime:] Cannot call method when status is 0'
*** First throw call stack:
(0x1848482d8 0x19606c0e4 0x18304caf8 0x183046f90 0x100299b8c 0x1830488bc 0x18304842c 0x1830e0cd0 0x1847ee2c4 0x18472b450 0x18474f570 0x185041a0c 0x186e9b2a4 0x186ea324c 0x101bcab50 0x101bc4f94 0x101bdc848 0x101bc71c0 0x101bd0384 0x101bc82c4 0x101bd25d4 0x101bd4248 0x19689d22c 0x19689cef0)
libc++abi.dylib: terminating with uncaught exception of type NSException

推流报错,RTMP connect stream failed.

Printing description of error:
Error Domain=pili.rtmp Code=-1014 "RTMP connect stream failed." UserInfo=0x17646d8c0 {NSLocalizedDescription=RTMP connect stream failed.}
已经配置了自己的rtmpPublishHost,最后为啥会请求到pili.rtmp了呢?

可不可以增加images推流

我看到VideoCore0.3.1增加了“Introduction of pixel buffer sources so you can add images to broadcast.”。现在有一个需求就是,需要读取图像并加入音轨来推流。

期望可以显示出更多调试信息

给开发者暴露更多的调试信息,可能更有利于开发,尤其是连上RTMP之后,现在的通信状况,以及中间发生了什么,现在显得有些黑箱。

例如出现下面的报错,显得很无能为力:

2015-05-21 10:39:20.449 gouhuo-native[1774:479908] Stream State: Connecting
2015-05-21 10:39:20.555 gouhuo-native[1774:479908] Stream State: Connected
ERROR: WriteN, RTMP send error 32 (129 bytes)
ERROR: WriteN, RTMP send error 32 (114 bytes)
ERROR: WriteN, RTMP send error 9 (42 bytes)
2015-05-21 10:41:26.448 gouhuo-native[1774:479908] Stream State: Error
2015-05-21 10:41:29.129 gouhuo-native[1774:480028] CFNetwork SSLHandshake failed (-9806)

创建一个推流地址的成本高吗?

因为业务的需求,可能会在用户填写一些信息的时候,就去预先创建一个推流地址出来,但这个推流地址可能未必会被使用到。所以我想知道大量的创建推流地址对七牛这边成本高吗?还是定期删除比较好?

感谢 🍺

streamJSON,rtmpPublishHost的一些疑问

我大概是想做一个RTMP的推流客户端,看之前有人提过streamJSON结构中的有些参数不太清楚,反馈是“具体参数由 pili 后台返回”,我理解为是你们提供的某种RTMP视频流的服务吧,具体着了一下也找不到相关的资料。
但我现在的需求是把视频流推送到某一个指定地址,那我也没有从pili的后台拿streamJSON。如果我自己直接定义一个streamJSON,其中的id,title,hub,publishKey,publishSecurity,disabled分别又怎么定义呢?包括rtmpPublishHost又该填什么?我看了很久也没明白,我就随便填了,测试了各种组合,发现session生成后,其pushURL还是nil,怪不得后面使用startWithCompleted方法就一直60秒超时呢。
不过似乎startWithPushURL这个方法还可用,可以将将视屏流推送到指定的URL,但是感觉也是挺混乱的。希望能补全这方面的说明,谢谢。

变更推流质量一两分钟内必定crash

crash时控制台输出

2015-10-22 10:32:40.307 AGVideoDev[1572:146482] Items dropped, buffer duration: 3.44
2015-10-22 10:32:40.309 AGVideoDev[1572:146482] Items dropped, buffer duration: 3.44
2015-10-22 10:32:40.374 AGVideoDev[1572:146482] Items dropped, buffer duration: 3.46
2015-10-22 10:32:40.378 AGVideoDev[1572:146482] Items dropped, buffer duration: 3.46
2015-10-22 10:32:40.438 AGVideoDev[1572:146482] Items dropped, buffer duration: 3.53
2015-10-22 10:32:40.442 AGVideoDev[1572:146482] Items dropped, buffer duration: 3.53
ERROR: WriteN, RTMP send error 32, Broken pipe, (129 bytes)
ERROR: WriteN, RTMP send error 32, Broken pipe, (110 bytes)
ERROR: WriteN, RTMP send error 32, Broken pipe, (42 bytes)

一般变更几次videoQuality就会crash。我初始化的kPLVideoStreamingQualityHigh1。然后变更如下:

- (void)streamingSessionSendingBufferFillDidLowerThanLowThreshold:(id)session{
    if ([self.session.videoConfiguration.videoQuality isEqualToString:kPLVideoStreamingQualityHigh1]) {
        [self.session beginUpdateConfiguration];
        self.session.videoConfiguration.videoQuality = kPLVideoStreamingQualityHigh2;
        [self.session endUpdateConfiguration];
    }
    else if ([self.session.videoConfiguration.videoQuality isEqualToString:kPLVideoStreamingQualityHigh2]) {
        [self.session beginUpdateConfiguration];
        self.session.videoConfiguration.videoQuality = kPLVideoStreamingQualityHigh3;
        [self.session endUpdateConfiguration];
    }
    DDLogVerbose(@"%@", self.session.videoConfiguration.videoQuality);
}
- (void)streamingSessionSendingBufferFillDidHigherThanHighThreshold:(id)session{
    if ([self.session.videoConfiguration.videoQuality isEqualToString:kPLVideoStreamingQualityHigh3]) {
        [self.session beginUpdateConfiguration];
        self.session.videoConfiguration.videoQuality = kPLVideoStreamingQualityHigh2;
        [self.session endUpdateConfiguration];
    }
    else if ([self.session.videoConfiguration.videoQuality isEqualToString:kPLVideoStreamingQualityHigh2]) {
        [self.session beginUpdateConfiguration];
        self.session.videoConfiguration.videoQuality = kPLVideoStreamingQualityHigh1;
        [self.session endUpdateConfiguration];
    }
    DDLogVerbose(@"%@", self.session.videoConfiguration.videoQuality);
}

函数栈如下:

* thread #1: tid = 0x23a26, 0x0000000193c90e0c libsystem_kernel.dylib`mach_msg_trap + 8, queue = 'com.apple.main-thread', stop reason = signal SIGPIPE
    frame #0: 0x0000000193c90e0c libsystem_kernel.dylib`mach_msg_trap + 8
    frame #1: 0x0000000193c90c88 libsystem_kernel.dylib`mach_msg + 72
    frame #2: 0x0000000182053724 CoreFoundation`__CFRunLoopServiceMachPort + 200
    frame #3: 0x0000000182051678 CoreFoundation`__CFRunLoopRun + 940
    frame #4: 0x0000000181f7d2d4 CoreFoundation`CFRunLoopRunSpecific + 396
    frame #5: 0x000000018b87b6fc GraphicsServices`GSEventRunModal + 168
    frame #6: 0x0000000186b7af40 UIKit`UIApplicationMain + 1488
  * frame #7: 0x000000010017e610 AGVideoDev`main(argc=1, argv=0x000000016fdc3998) + 124 at main.m:14
    frame #8: 0x0000000193b92a08 libdyld.dylib`start + 4

我的系统是iOS8.4,SDK版本是1.4.4

运行自带的Example出现报错

可以在真机运行起来,但是点击Start之后,出现如下报错:

error: failed to launch '/private/var/mobile/Containers/Bundle/Application/F9A1E37F-E2E2-4CBA-ACA2-8531D5E1C656/PLCameraStreamingKit.app' -- process launch failed: failed to get the task for process 967

求解。。。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.