我制作了一个视频播放器,正在分析来自正在播放的视频的实时音频和视频轨道.视频存储在iOS设备上(在Apps文档目录中).

这一切都很好.我使用MTAudioProcessingTap来获取所有的音频样本并进行一些FFT,我正在分析视频,只需复制当前播放的CMTime(AVPlayer currentTime属性)的像素缓冲区.正如我所说,这工作正常.

但现在我想支持Airplay. Airplay本身并不困难,但是一旦Airplay被切换并且视频正在ATV上,我的点击就停止工作.不知何故,MTAudioProcessingTap不会处理,pixelbuffers都是空的…我无法获取数据.

有没有办法得到这些数据?

为了获得像素缓冲区,我只需每隔几毫秒触发一次事件并检索播放器的currentTime.然后:

CVPixelBufferRef imageBuffer = [videoOutput copyPixelBufferForItemTime:time itemTimeFordisplay:nil];
CVPixelBufferLockBaseAddress(imageBuffer,0);

uint8_t *tempAddress = (uint8_t *) CVPixelBufferGetBaseAddress(imageBuffer);

size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);

CVPixelBufferUnlockBaseAddress(imageBuffer,0);

其中tempAddress是我的pixelbuffer,而videoOutput是AVPlayerItemVideoOutput的一个实例.

对于音频,我使用:

AVMutableAudioMixInputParameters *inputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTrack];

// Create a processing tap for the input parameters
MTAudioProcessingTapCallbacks callbacks;

callbacks.version = kMTAudioProcessingTapCallbacksversion_0;
callbacks.clientInfo = (__bridge void *)(self);
callbacks.init = init;
callbacks.prepare = prepare;
callbacks.process = process;
callbacks.unprepare = unprepare;
callbacks.finalize = finalize;

MTAudioProcessingTapRef tap;
Osstatus err = MTAudioProcessingTapCreate(kcfAllocatorDefault,&callbacks,kMTAudioProcessingTapCreationFlag_PostEffects,&tap);
if (err || !tap) {
    NSLog(@"Unable to create the Audio Processing Tap");
    return;
}

inputParams.audioTapProcessor = tap;

// Create a new AVAudioMix and assign it to our AVPlayerItem
AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
audioMix.inputParameters = @[inputParams];
playerItem.audioMix = audioMix;

问候,
NIEK

解决方法

这里的解决方案:

这是为了实现AirPlay,我使用这个代码仅在我的应用程序的音频,我不知道如果你可以改进视频,但你可以尝试;)

在AppDelegate.m上:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [RADStyle applyStyle];
    [radiosound superclass];
    [self downloadZip];

    NSError *sessionError = nil;
    [[AVAudioSession sharedInstance] setDelegate:self];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
    [[AVAudioSession sharedInstance] setActive:YES error:nil];

    UInt32 sessionCategory = kAudioSessionCategory_mediaplayback;
    AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory),&sessionCategory);

    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
}

如果您使用airplay来实现LockScreen控件,ArtWork,停止/播放,标题ecc.

您在播放器的DetailViewController中使用此代码:

- (BOOL)canBecomeFirstResponder {

    return YES;
}
- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];

    NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString: (self.saved)[@"image"]]];

    if (imageData == nil){

    MPNowPlayingInfoCenter *infoCenter = [MPNowPlayingInfoCenter defaultCenter];
    MPMediaItemArtwork *albumart = [[MPMediaItemArtwork alloc] initWithImage:[UIImage imageNamed:@"lockScreen.png"]];

    infoCenter.NowPlayingInfo = @{MPMediaItemPropertyTitle: saved[@"web"],MPMediaItemPropertyArtist: saved[@"title"],MPMediaItemPropertyArtwork:albumart};

    } else {

        MPNowPlayingInfoCenter *infoCenter = [MPNowPlayingInfoCenter defaultCenter];
        MPMediaItemArtwork *albumart = [[MPMediaItemArtwork alloc] initWithImage:[UIImage imageWithData:imageData]];

        infoCenter.NowPlayingInfo = @{MPMediaItemPropertyTitle: saved[@"link"],MPMediaItemPropertyArtwork:albumart};

    }

}

希望这段代码可以帮助你)

iOS:音频和视频从Airplay中点击的更多相关文章

  1. ios – MPNowPlayingInfoCenter nowPlayingInfo通过AirPlay忽略AVPlayer音频

    我已经使用AVPlayer实现音频播放,播放远程mp3网址.我想使用MPNowPlayingInfoCenterNowPlayingInfo方法显示当前正在播放的音频的信息.当我锁定屏幕时,我会看到我设置的图像和标题,所以我知道这种方法是以某种方式注册信息,但是当我将AirPlay切换到AppleTV时,显示器看起来像通用的视频输出,进度条位于底部,但经过时间和持续时间正确显示.如果我设置相同的N

  2. iOS:音频和视频从Airplay中点击

    我无法获取数据.有没有办法得到这些数据?

  3. ios – Airplay:外部窗口镜像子视图

    米解决方法称为AirPlay镜像的技术命名不佳.它实际上以两种模式运行,一种是将整个iOS设备镜像到AirPlay设备,另一种模式下,一旦连接了镜像AirPlay设备,开发人员就可以使用两个UIWindow/UIScreen.您正在使用后一种模式,通常被称为“镜像”,但是您真的有一个完全独立的窗口/屏幕进行管理,应该有更好的术语来指代这种操作模式.上面所描述的内容基本上是将UIView从设备窗口移动到AirPlay窗口,它的工作原理与之一致!

  4. iOS AirPlay:我的应用程序仅在镜像开启时通知外部显示器?

    >为什么我的应用程序会收到通知我开镜像时的外部显示……我显然误解了一些东西,但是看起来像镜像应该通知我的应用程序外部显示器已经消失代码示例如下.在此先感谢您的帮助!

  5. 在Android上解码Java或C/C++中的Airplay数据包

    提前致谢马特解决方法虽然Java编译为在虚拟机中运行的字节码,但它可能不一定比本机编译的可执行文件更慢(或更快).这一切都取决于程序!在这种情况下,Java可能会变慢,原因有很多:>解码实现可能只是编码/优化不佳?(我必须在这里注意,我不是Java的专家!)但是,我仍然不会调用Java本质上比C或C慢.我相信你可以在互联网上找到many-abenchmarks和测试,比较一种语言和另一种语言,有些人声称在一定程度上(出于骄傲和自我?

  6. ios – MPVolumeView AirPlay按钮不可见

    我已经开始在我的应用程序中使用MPVolumeView,但AirPlay按钮根本没有出现.即使我有多个AirPlay设备可以将我的AVPlayer音频发送到网络上.例如,如果从控制中心检查AirPlay,可以看到这些.这是我的代码:很简单的东西.我有一个运行一些音乐的AVPlayer,就是这样.有趣的是,如果我从控制中心选择另一个AirPlay设备,它会强制AirPlay按钮出现在我的MPVolu

  7. 在iOS中如何使用AirPlay从应用程序(而不是控制面板)进行屏幕镜像?

    我正在使用MPVolumeView显示AirPlay按钮.我需要通过与音频镜像显示给AppleTV的自定义壁纸.音频在AppleTV上正常播放,但壁纸图像未显示.我正在使用AVAudioController播放音频.我已经检查了YouTube应用程序,哪个屏幕镜像正在从应用程序播放视频.可以使用AVAudioController在应用程序中屏幕镜像吗?

  8. 2d框架c

    我正在寻找一个2d框架,其中有层/粒子/屏幕管理器/sprite批处理/视差/等编码在那里?我正在寻找不一定有图形的东西,因为我想把它添加到airplaysdk上.或者我可以通过airplay轻松重新连接来制作图形.编辑:我找到了我需要的东西:cocos2d被封装到c和airplaysdk.谢谢你的答案!

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部