IOS音频的流媒体播放

iOS音频播放之AudioQueue(三):网络流媒体的播放 从AudioStreamer讲起 为什么要使用CFNetwork CFNetwork示例下载图片 代码示例 代码说明 代码演示 流媒体的播放 CFNetwork的预处理 Seek操作 播放完成 在前两篇中讲了使用AudioQueue流式播放本地文件的功能,本篇就来讲讲网络流媒体的播放。其实已经有了本地流式播放功能,网络流媒体播放基本就没问题了,只是数据来源于网络而已,但还是有些问题要注意。 从A 阅读详情

大家应该已经注意到了,无论是前面的录音还是音频播放均不支持网络流媒体播放,当然对于录音来说这种需求可能不大,但是对于音频播放来说有时候就很有必要了。AVAudioPlayer只能播放本地文件,并且是一次性加载所以音频数据,初始化AVAudioPlayer时指定的URL也只能是File URL而不能是HTTP URL。当然,将音频文件下载到本地然后再调用AVAudioPlayer来播放也是一种播放网络音频的办法,但是这种方式最大的弊端就是必须等到整个音频播放完成才能播放,而不能使用流式播放,这往往在实际开发中是不切实际的。那么在iOS中如何播放网络流媒体呢?就是使用AudioToolbox框架中的音频队列服务Audio Queue Services。

使用音频队列服务完全可以做到音频播放和录制,首先看一下录音音频服务队列:

recording_architecture_2x

一个音频服务队列Audio Queue有三部分组成:

三个缓冲器Buffers:每个缓冲器都是一个存储音频数据的临时仓库。

一个缓冲队列Buffer Queue:一个包含音频缓冲器的有序队列。

一个回调Callback:一个自定义的队列回调函数。

声音通过输入设备进入缓冲队列中,首先填充第一个缓冲器;当第一个缓冲器填充满之后自动填充下一个缓冲器,同时会调用回调函数;在回调函数中需要将缓冲器中的音频数据写入磁盘,同时将缓冲器放回到缓冲队列中以便重用。下面是Apple官方关于音频队列服务的流程示意图:

recording_callback_function_2x

类似的,看一下音频播放缓冲队列,其组成部分和录音缓冲队列类似。

playback_architecture_2x

但是在音频播放缓冲队列中,回调函数调用的时机不同于音频录制缓冲队列,流程刚好相反。将音频读取到缓冲器中,一旦一个缓冲器填充满之后就放到缓冲队列中,然后继续填充其他缓冲器;当开始播放时,则从第一个缓冲器中读取音频进行播放;一旦播放完之后就会触发回调函数,开始播放下一个缓冲器中的音频,同时填充第一个缓冲器放;填充满之后再次放回到缓冲队列。下面是详细的流程:

playback_callback_function_2x

当然,要明白音频队列服务的原理并不难,问题是如何实现这个自定义的回调函数,这其中我们有大量的工作要做,控制播放状态、处理异常中断、进行音频编码等等。由于牵扯内容过多,而且不是本文目的,如果以后有时间将另开一篇文章重点介绍,目前有很多第三方优秀框架可以直接使用,例如AudioStreamer、FreeStreamer。由于前者当前只有非ARC版本,所以下面不妨使用FreeStreamer来简单演示在线音频播放的过程,当然在使用之前要做如下准备工作:

1.拷贝FreeStreamer中的Reachability.h、Reachability.m和Common、astreamer两个文件夹中的内容到项目中。

2.添加FreeStreamer使用的类库:CFNetwork.framework、AudioToolbox.framework、AVFoundation.framework
、libxml2.dylib、MediaPlayer.framework。

3.如果引用libxml2.dylib编译不通过,需要在Xcode的Targets-Build Settings-Header Build Path中添加$(SDKROOT)/usr/include/libxml2。

4.将FreeStreamer中的FreeStreamerMobile-Prefix.pch文件添加到项目中并将Targets-Build Settings-Precompile Prefix Header设置为YES,在Targets-Build Settings-Prefix Header设置为$(SRCROOT)/项目名称/FreeStreamerMobile-Prefix.pch(因为Xcode6默认没有pch文件)

然后就可以编写代码播放网络音频了:

//
//  ViewController.m
//  AudioQueueServices
//
//  Created by Kenshin Cui on 14/03/30.
//  Copyright (c) 2014年 cmjstudio. All rights reserved.
//  使用FreeStreamer实现网络音频播放

#import "ViewController.h"
#import "FSAudioStream.h"

@interface ViewController ()

@property (nonatomic,strong) FSAudioStream *audioStream;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.audioStream play];
}

/**
 *  取得本地文件路径
 *
 *  @return 文件路径
 */
-(NSURL *)getFileUrl{
    NSString *urlStr=[[NSBundle mainBundle]pathForResource:@"刘若英 - 原来你也在这里.mp3" ofType:nil];
    NSURL *url=[NSURL fileURLWithPath:urlStr];
    return url;
}
-(NSURL *)getNetworkUrl{
    NSString *urlStr=@"http://192.168.1.102/liu.mp3";
    NSURL *url=[NSURL URLWithString:urlStr];
    return url;
}

/**
 *  创建FSAudioStream对象
 *
 *  @return FSAudioStream对象
 */
-(FSAudioStream *)audioStream{
    if (!_audioStream) {
        NSURL *url=[self getNetworkUrl];
        //创建FSAudioStream对象
        _audioStream=[[FSAudioStream alloc]initWithUrl:url];
        _audioStream.onFailure=^(FSAudioStreamError error,NSString *description){
            NSLog(@"播放过程中发生错误,错误信息:%@",description);
        };
        _audioStream.onCompletion=^(){
            NSLog(@"播放完成!");
        };
        [_audioStream setVolume:0.5];//设置声音
    }
    return _audioStream;
}

@end

其实FreeStreamer的功能很强大,不仅仅是播放本地、网络音频那么简单,它还支持播放列表、检查包内容、RSS订阅、播放中断等很多强大的功能,甚至还包含了一个音频分析器,有兴趣的朋友可以访问官网查看详细用法

注释:文章转自http://www.cnblogs.com/kenshincui/p/4186022.html,如需转载请注明该地址

流媒体开发(一)音频播放 流媒体开发 音频播放,音效播放,AudioToolbox,AVAudioPlayer,AVPlayer,音频队列 阅读详情

相关推荐

javaCV【音视频像素、编码、格式和协议及图片的关系解析】: 图片压缩、图像与视频帧的关系、编码与封装的区别、音/视频源(在iOS下进行音频解码及播放的流程、PCM原理)、流媒体协议、流媒体服务

javaCV入门基础知识【音视频像素、编码、格式和协议及图片的关系解析】: 图片压缩、图像与视频帧的关系、编码与封装的区别、音/视频源、流媒体协议、流媒体服务

专注于计算机研发知识和资讯分享 1万+

【亲测免费】 AudioStreamer: 高效流畅的音频流播放解决方案

AudioStreamer: 高效流畅的音频流播放解决方案 是一个开源的音频流播放框架,旨在为 iOS 和 macOS 平台提供高效、可靠的音频流处理功能。该项目由 Matt Gallagher 开发,并且获得了广大开发者们的认可与支持。 功能特性 AudioStreamer 提供了以下关键功能: 实时解码:支持多种音频编码格式(如 MP3、AAC 等)的实时解码。 缓存管理:通过自动管理缓冲区...

gitblog_00005的博客 772

iOS音频流媒体边缓冲边播放完整解决方案

在当今数字化世界中,音频流媒体技术已成为我们日常生活不可或缺的一部分。无论是在线音乐播放、网络电台,还是实时语音通讯服务,音频流媒体都在背后发挥着关键作用。本章将为您提供音频流媒体技术的全面概述,包括其定义、工作原理以及在不同应用中的重要性。我们将探讨音频流媒体如何通过互联网实时传输音频内容,并深入分析其在用户体验优化、数据传输效率和网络资源管理等方面的挑战与机遇。此外,本章还会介绍音频流媒体技术的发展趋势,以及它在未来的应用前景。让我们开始深入探索音频流媒体这一充满活力的技术世界。

weixin_42356162的博客 1249

AudioStreamer 使用教程

AudioStreamer 使用教程 1. 项目目录结构及介绍 AudioStreamer 是一个用Swift编写的音频流框架,适用于播放远程音频并支持实时效果处理,基于AVAudioEngine。以下是该仓库的基本目录结构概述: Sources: 包含核心的Swift代码文件,这里是AudioStreamer框架的核心实现部分。 AudioStreamer.swift: 主要的流式音频播放...

gitblog_00367的博客 813

EMC案例:解决千兆网口RTL8211F EMI问题

摘要:本文分析了Amlogic S812平台OEM项目中RTL8211F-CG千兆网卡EMI辐射超标问题。发现百兆测试时25MHz时钟有3dB余量,但千兆125MHz时钟导致超标。问题根源包括:未关闭PHY芯片悬空CLKOUT引脚、TX/RXCLK端RC位置错误、包地不完整及参考地缺失。解决方案涉及软件关闭无用时钟、优化RC布局、加强包地与打孔、调整共模电感位置,并在HDMI 3.3V加磁珠。关键结论指出千兆网125MHz时钟需严格包地打孔,且RC取值需平衡EMI与通信性能。

电子绿洲的博客 1278

Zabbix在Ubuntu 22.04上的性能优化与监控实战:从基础安装到高级配置

本文详细介绍了在Ubuntu 22.04系统上部署和优化Zabbix监控系统的完整流程,从基础安装到高级配置。内容包括MySQL数据库设置、Zabbix服务器与Web前端优化、性能调优策略以及实战监控场景应用,帮助用户构建高效的企业级监控解决方案。

sss66的博客 895

推荐开源项目:AudioStreamer - HTML5 实时音频流传输至 Node.js

推荐开源项目:AudioStreamer - HTML5 实时音频流传输至 Node.js 1、项目介绍 AudioStreamer 是一个创新的开源项目,它利用 HTML5 的 Web Audio API 功能,实现从浏览器中的麦克风实时捕获音频并将其无延迟地传输到运行在 Node.js 服务器上的应用。该项目提供了一种简单且高效的方式来处理和存储来自用户的音频数据,为开发者提供了构建音频相关应...

gitblog_00100的博客 731

ACS驱动器直线电机回零程序与误差补偿Buffer实战解析

本文深入解析了ACS驱动器控制直线电机时,实现高精度回零与误差补偿的完整实战流程。核心在于利用驱动器的D-Buffer功能,将激光干涉仪测量的误差数据导入补偿数组,通过ERRORMAP1D指令进行映射,从而实时修正定位误差,显著提升设备重复定位精度。文章详细拆解了回零程序逻辑、补偿参数设置及关键调试避坑指南。

647

AudioStreamer:基于AVAudioEngine的实时音频流处理框架

AudioStreamer:基于AVAudioEngine的实时音频流处理框架 AudioStreamer 是一个使用 Swift 4 开发的开源框架,旨在为开发者提供一种便捷的方式来流式传输远程音频,并支持实时音频效果处理。该框架基于 Apple 的 AVAudioEngine,允许开发者轻松地实现对远程音频的实时处理。 项目基础介绍 主要编程语言:Swift AudioStreamer 框...

gitblog_01131的博客 1125

RFSOC实战解析:MTS多片同步的时序校准与相位相干实现

本文深入解析了在RFSOC平台上实现MTS多片同步的关键技术与实战流程。文章从相位相干的重要性出发,详细阐述了SYSREF与SYNC信号的协同工作机制,并提供了从硬件时钟配置到软件API调用的完整MTS实现步骤。重点探讨了时序校准的核心方法,旨在帮助工程师解决多通道系统相位不一致的难题,确保ADC与DAC达到精确的相位相干,从而构建高性能的MIMO和相控阵系统。

weixin_29206669的博客 192

超酷炫,Python实现交通数据可视化!

此时输出的栅格化参数params的内容存储了栅格坐标系的原点坐标(slon、slat)、单个栅格的经纬度长宽 (deltalon、deltalat)、栅格的旋转角度(theta)、栅格的形状(method参数,其值可以是方形rect、三角形tri和六边形hexa)以及栅格的大小(gridsize参数,单位为米)。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。今天分享一次Python交通数据分析与可视化的实战!

m0_59236127的博客 1697

基于FreeStreamer实现音频播放器

前段时间根据产品经理的要求,要把H5播放音频的换成App原生的播放器,开始查了一些相关知识和博客就开始自己写了一个音频框架,不写不知道,写完才知道,缓存资源和播放的时候会遇到各种问题,各种问题,各种问题ing...刚开始自己和开发小伙伴测试的时候甚至还有崩溃发生,这吓得我有点头皮发麻...然后自己在没事的时候搜索了各大博客,也问了很多人,然后就有了现在音频播放器模型,没用的的话说的有点多了,下面进入正题 主要音频框架 FreeStreamer GitHub API使用文档 MobileV.

Alexander Wei的博客 1284

学习STM32的CAN总线通信

在配置时,确保您启用了CAN总线功能。CAN节点是CAN总线上的一个设备,每个节点都有唯一的标识符。在CAN总线中,有两种类型的节点:CAN控制器和CAN外设。步骤2:配置CAN总线 在STM32CubeMX中,选择CAN总线模块并进行必要的配置。在CAN总线中,有两个重要的概念:CAN节点和CAN帧。步骤5:测试CAN总线通信 在成功编译和烧录代码后,您可以使用串口调试助手或其他CAN总线工具来测试CAN总线通信。步骤3:编写CAN总线通信代码 在项目的主代码文件中,我们将编写CAN总线通信的示例代码。

2401_85258012的博客 496

iOS在线音频播放实战:AVPlayer流媒体播放与后台控制详解

流媒体播放是移动端音频处理的核心技术之一,其原理是通过HTTP渐进式下载或HLS协议实现边下边播,避免完整下载带来的延迟与存储开销。在iOS开发中,AVPlayer作为AVFoundation框架的原生播放器,天然支持网络音频流播放,能自动处理缓冲、重连与码率切换,技术价值在于系统级稳定性与简洁API。典型应用场景包括在线音乐、电台、播客等App。使用AVPlayer播放网络音频时,需重点关注AVPlayerItem状态机、缓冲策略、后台播放与锁屏控制等关键细节,这些直接决定播放体验的流畅性与稳定性。

weixin_29006701的博客 156

航天设备研制中的形态分类:电性件、正样件及其他关键形态详解

航天设备的研制是一个高度复杂且严谨的工程过程,涉及多个阶段的不同产品形态。这些形态各具特点,在研制流程中承担着不同的验证任务和工程目标。本文将系统介绍航天设备研制中的主要形态,包括**电性件(EM)**、**正样件(FM)**以及**结构热控件(STM)**、**鉴定件(QM)**和**初样件(PFM)**等,详细解析它们的定义、用途和工程意义,帮助读者全面理解航天产品从设计到飞行的全生命周期管理。

ScilogyHunter的博客 1656

Scale-up,scale-out技术概述

本文系统分析了Scale-up与Scale-out两种扩展技术在现代计算中的应用与发展。Scale-up通过增强单节点性能,适用于高耦合任务,而Scale-out通过横向扩展节点,实现高可用性和无限扩展。在芯片层面,Chiplet技术推动Scale-up发展;在数据中心层面,二者协同工作构建强大集群。光模块在长距离高带宽传输中发挥关键作用。文章对比了NVIDIA、AMD和Broadcom三家公司的技术路线,指出NVIDIA采用封闭生态,AMD选择开放标准,Broadcom则主导底层连接技术。未来发展方向将聚

元直的博客 1446

IOS 播放音频流媒体

  #pragma mark - 加载播放数据 - (void)loadData:(NSString *)musicUrl {       NSURL *playURL = [NSURL URLWithString:musicUrl];     self.playerItem = [AVPlayerItem playerItemWithURL:playURL];           ...

weixin_33729196的博客 230

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

iOS在线音频播放FreeStreamer

FreeStreamer是适用于iOS和OS X的音频播放引擎, 专门为播放音频流而设计。该引擎示范UI简单,效率高,占用内存少,用C++写成。 功能: 高效低内存占用(Objective-C方法调用不会额外消耗性能) 支持ShoutCast和IceCast流媒体以及标准的HTTP协议 可检测流媒体格式 支持ShoutCast metadata 支持暂停,比如因通话暂停播放 支持后台播放

jueyi1127的博客 3734

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

iOS音频流媒体播放方案(边下载边播放)

能想到的方案 这类的技术方案其实有不少: 思路1. 最直接的方式,自行实现音频数据的请求在请求的过程中把数据缓存到磁盘,然后基于磁盘的数据自己实现解码、播放等功能;这个方法作为直接也最为复杂,开发者需要对音频播放的原理、操作系统等知识有一定程度的理解。如果能够实现这种方式所达到的效果也将会是最好的,整个过程都由开发者掌控,出现问题也可以对症下药。开源播放器FreeStreamer就是一

lzy_persist的专栏 2598

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

iOS多媒体播放音乐AVAudioPlayer和AVPlayer

iOS多媒体播放音乐AVAudioPlayer和AVPlayer 1 iOS系统的音频播放方式 AVAudioPlayer AVPlayer 系统声音音频排列 AVAudioPlayer 使用简单方便,但只能播放本地音频,不支持流媒体播放 AVPlayer iOS4.0以后,可以使用AVPlayer播放本地音频和支持流媒体播放,但是提供接口较少,处理音频不够灵活 音频队列 音频

xujingjing 学习iOS开发历程 4144

FreeStreamer - 高效、易用的音频流媒体播放器

**FreeStreamer** 是一个高效且易于使用的音频流媒体播放器,支持各种音频格式,并可以在多个平台上运行。它提供了一个简单的 API,方便开发者将其集成到自己的应用程序中。 ## 功能与用途 - 支持多种音频格式,如 MP3、AAC 等; - 可以播放在线广播; - 提供简单易用的 API,便于集成到其他应用中; - 支持多个平台,包括 iOS、Android 和 macOS; -

gitblog_00071的博客 594

iOS 音频录制、播放(本地、网络)

文章目录 一、录音机(AVAudioRecorder) 1、简介 2、如何使用 3、具体实现(开始、暂停、停止、播放 四个功能) 4、附件实现demo 二、播放音频 1、播放本地音频文件(AVAudioPlayer) 2、播放网络音频文件(Audio Queue Servies - 音频队列服务) <1> 音频...

风中的劲草 9375

音频流媒体库AudioStreaming —— 播放和增强你的音频体验

音频流媒体库AudioStreaming —— 播放和增强你的音频体验 项目介绍 AudioStreaming是一个用Swift编写的iOS音频播放和流媒体库,它能处理在线音频流、本地文件,并支持无缝队列播放。该库利用了Apple的AVAudioEngine和CoreAudio框架,提供了实时音频增强功能。 项目技术分析 AudioStreaming的核心是通过AVAudioEngine来管理音...

gitblog_00067的博客 747
上一篇: IOS开发之AVAudioRecorder
下一篇: IOS开发之AVPlayer(可定制播放器)
ciwei_numberOne
博客等级 码龄12年 5粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值