井波 顾少伟
摘要:传统媒体直播行业存在着诸多痛点,包括受时间和空间限制、成本高昂、内容单一和互动性差等问题。随着媒体融合的不断深入和移动互联网的快速发展,网络直播已成为重要的信息传播方式,直播轻量化已成为传媒领域的热门话题。与传统的电视直播方式相比,基于手机端的新媒体直播系统具有成本低、操作简便、用户体验好、实时性和便捷性更高等诸多优势。基于手机端的新媒体直播系统不仅可以充分发挥手机直播的优势,提高传统直播的效率,同时也可以克服传统直播的时间和空间限制,拓宽媒体传播的渠道,为媒体行业带来了更多的发展机遇和商业机会。
关键词:新媒体直播;CDN网络;视频编码;轻量化;流媒体
中图分类号:TP37 文献标识码:A
文章编号:1009-3044(2024)13-0058-05 开放科学(资源服务)标识码(OSID) :
0 引言
新媒体直播是即时现场直播的一种崭新手段,新媒体直播设备结构简单,小巧便携,智能手机、平板电脑等都可以充当直播的工具[1]。新媒体直播系统通过利用流媒体传输技术,将视频、音频等多媒体数据进行压缩编码,并通过互联网实时传输至服务器,服务器对接收到的流进行转码、分发,借助CDN网络确保各地用户都能获得快速、稳定的观看体验。采用先进的编码技术,可以确保数据在有限带宽下仍能流畅传输,播放端的手机设备通过拉流、解码技术接收并播放直播内容。本文从设计和实现两个角度深入探讨了这一系统,从视频采集、编码、传输、分发、播放等多个环节,解析了基于手机端的媒体直播系统的设计和实现。系统充分考虑了网络状况、设备性能等多方面因素,同时确保用户数据隐私得到保护,保证系统的稳定性与安全性。本文详细介绍了系统的设计思路、关键技术和实现过程,并对其在技术创新、市场竞争等方面的影响进行了分析和展望。
1 系统设计
1.1 系统架构
系统主要包括音视频采集端、管理端和观看端三个部分。采集端通过手机摄像头和麦克风将直播视频和音频信号进行采集,通过压缩转码技术转为H.264格式,随后将信号推送至最优的网络节点。服务端接收到数据之后使用FFmpeg等技术进行视频解码、切片、录制和存储,然后通过CDN分发至客户端。直播信号到达用户观看端后,将视频进行解码播放,通过优化传输机制与播放策略,可实现观看端音视频播放秒级延时。图1为系统架构图。
1.2 视频采集端设计
使用手机App 进行直播画面采集具有便捷、灵活、高清、实时预览、便于分享和节省成本等优势,为用户提供了随时随地进行直播的便利性和多样化的拍摄体验。相较于传统的摄像设备,使用手机进行直播节省了成本,降低了直播门槛,使更多人能够参与直播行业。
采集端的设计包括实现高质量、稳定的视频采集,确保直播画面的清晰流畅。同时提供良好的用户体验,包括界面友好性、操作便捷性等。考虑设备的兼容性,确保视频采集设备与软件系统的兼容。性能上确保App的运行效率和响应速度。用户可以通过房间推流码向业务服务端获取房间信息,信息中包括推流地址。通过移动设备的摄像头和麦克风,对音视频信号进行实时采集,将采集到的内容压缩编码,并通过获取推流地址,将编码后的音视频数据推送至流媒体服务器,实现移动端直播功能。
功能上主要设计了音视频采集、画面预览、音频采集、画面调整、音量调整、水印添加、美颜滤镜、特效等。用户可以通过手机应用实时捕获摄像头的图像和麦克风的声音,预览直播画面,调整画面分辨率、旋转画面和音量大小等,同时也可以控制直播的播放状态和监控网络状态。
用户可以选择合适的视频采集设备,包括前置摄像头、后置摄像头,甚至外接摄像头。iOS平台使用AVFoundation框架来实现音视频采集,控制摄像头参数、预览画面等。对采集到的视频流进行编码压缩,以减小数据体积并提高传输效率,常用编码方式包括H.264、H.265、AAC等。同时对视频采集和编码过程进行性能优化,包括预览帧率调节、编码参数优化等,确保视频采集端的稳定性和流畅性。
1.3 管理端设计
系统管理端是新媒体直播系统的后台管理工具,负责管理系统的用户、频道、直播间内容、权限、推流状态、回放以及互动等各项功能。总体的设计目标是:功能全面,使用便捷,接口稳定,界面设计简洁直观,高扩展性和灵活性,支持大规模用户和房间管理,保证高安全性和稳定性,防止数据泄露和系统故障。图2为管理端架构图。
管理员可以在管理端建立房间,系统向流媒体服务器申请推流和拉流地址,并将获得的地址配置在业务服务器的数据库内。房间信息包括:房间名、直播时间、简介、直播封面、横竖屏状态等,管理员可以控制房间状态和回放状态。
1.4 播放端设计
播放端的总体设计旨在提供稳定流畅的直播内容播放,并为用户提供丰富的互动功能。播放端采用现代化的前端技术实现,分为手机App和H5,按照横竖屏可分为横屏直播和竖屏直播两种页面。
播放端通过流媒体协议(如RTMP、HLS) 从服务器获取直播流,直播间支持点赞、评论、礼物赠送等互动功能,可以提升用户参与度和互动性。播放端同时还支持直播预约功能,用户可提前预约感兴趣的直播房间,在开始直播前可以及时收到开播提醒,确保不会错过精彩直播。在用户界面设计上,以简洁直观为主要思路,提供清晰的直播画面和易于操作的互动按钮。综合考虑用户需求和系统性能,播放端设计了稳定的播放引擎和流畅的交互体验,可以为用户提供优质的直播观看和互动体验。同时,为了保证系统的稳定性和可靠性,播放端还考虑了对不同网络环境的适应性和流畅度,以及用户数据的隐私保护和安全性。总体上,直播系统播放端通过合理的架构设计和功能实现,为直播平台的用户提供了一站式的直播观看和互动服务,满足了用户多样化的需求。用户还可通过App的分享功能将直播间H5页面分享给其他观众。
2 系统实现
系统客户端基于iOS平台进行开发,采用Xcode 作为主要的开发工具,Objective-C作为开发语言,使用CocoaPods 用于管理第三方库,同时遵循MVC(Model-View-Controller) 设计模式。系统使用了Foun?dation、UIKit、AVFoundation、AFNetworking、SDWebIm?age等框架。还使用了NSOperationQueue多线程技术实现数据的异步操作。
2.1 采集端
直播系统的视频采集端主要实现了以下几个方面的功能:首先,利用AVFoundation框架实现摄像头设备的调用和视频数据的采集,通过控制摄像头参数和实时预览画面,确保视频采集的稳定性和质量。同时,控制音频采样率和声道数,实现音频的同步采集。采集到的视频和音频数据经过编码压缩,使用VideoToolbox框架进行H.264的视频编码,保证数据体积的减小和传输效率的提高。此外,利用时间戳等方式实现音视频的同步,确保播放端能够准确地展示采集到的视频和音频内容。为了提高系统的稳定性和流畅性,采集端采取了预览帧率调节、编码参数优化等措施。在用户界面设计上,设计了简洁直观的界面,包括摄像头预览界面、录制控制界面等,提供了摄像头切换、闪光灯控制等功能,结合图像处理SDK,实现了美颜滤镜、视频特效等功能,以提升用户体验。综合考虑用户需求和系统性能,视频采集端功能实现旨在为用户提供稳定、高效的视频采集解决方案,满足直播应用的需求。
H.264是一种广泛使用的视频编码标准,也称为MPEG-4 AVC,是ITU-T VCEG和ISO/IEC MPEG联合制定的国际视频编解码标准[2],具有较高的压缩率和良好的画质,适用于移动设备上的直播推流。它能够在保证画质的同时减少带宽消耗,是目前手机直播中最常用的编码方式之一。
H.264编码的数据组织由多个NALU(Network Ab?straction Layer Unit) 单元组成,每个NALU单元包含了视频数据的一部分,主要有以下类型:SPS(SequenceParameter Set) :序列参数集,描述视频序列的参数;PPS(Picture Parameter Set) :图像参数集,描述图像的参数;IDR帧:关键帧,也称为I帧;非IDR帧:P帧或B帧。
在进行H.264编码之前,首先通过AVFoundation 获取视频数据。这个过程会生成一系列连续的视频帧,每一帧都包含了视频画面的像素信息。
在这里通过 AVCaptureDeviceInput获取到设备的前后摄像头和音频设备,并通过AVCaptureVideoData?Output的代理方法拿到CMSampleBufferRef格式的原始流数据。
1.@protocol SystemCaptureManagerDelegate
2. @optional
3. - (void)captureSampleBuffer: (CMSampleBuffer?Ref)sampleBuffer type:(SystemCaptureType)type;
4. @end
然后将原始流交给VideoToolbox进行压缩。创建一个编码器会话(VTCompressionSession) ,这个会话将负责管理编码器的配置和操作。同时设置编码器的属性,包括视频的分辨率、帧率、比特率等。
1. VTCompressionSessionRef compressionSession;
2. OSStatus status = VTCompressionSessionCreate(NULL, width, height, kCMVideoCodecType_H264, NULL,NULL, NULL, compressionOutputCallback, NULL, &com?pressionSession);
3. VTSessionSetProperty(compressionSession, kVT?CompressionPropertyKey_RealTime, kCFBooleanTrue);
4. VTSessionSetProperty(compressionSession,kVTCompressionPropertyKey_ProfileLevel, kVT?ProfileLevel_H264_Main_AutoLevel);
5. VTSessionSetProperty(compressionSession, kVT?CompressionPropertyKey_AverageBitRate,(__bridge CFTy?peRef)@(bitrate));
6. VTSessionSetProperty(compressionSession, kVT?CompressionPropertyKey_ExpectedFrameRate, (__bridgeCFTypeRef)@(30));
7. 调用VTCompressionSessionPrepareToEncode?Frames准备编码器,开始编码帧,并将AVFoundation 捕获的CVPixelBufferRef类型视频帧数据传递给编码器进行编码。
8. VTCompressionSessionPrepareToEncodeFrames(compressionSession);
9. CVPixelBufferRef pixelBuffer = // 获取捕获的视频帧
10. CMTime presentationTimeStamp = // 视频帧时间戳
11. VTCompressionSessionEncodeFrame(compres?sionSession,pixelBuffer, presentationTimeStamp, kCMTi?meInvalid, NULL, NULL, NULL);
编码器将编码后的数据通过回调函数返回给应用程序。在回调函数中,可以获取编码后的视频数据,并进行进一步处理。
1. void compressionOutputCallback(void *output?CallbackRefCon, void *sourceFrameRefCon, OSStatusstatus, VTEncodeInfoFlags infoFlags, CMSampleBuffer?Ref sampleBuffer) {
2. if (status != noErr) {
3. NSLog(@"Failed to encode frame with sta?tus: %d", (int)status);
4. return;
5. }
6. // 在这里处理编码后的视频数据,并推到网络
7. }
8. 编码结束后,释放编码器会话。
9. VTCompressionSessionCompleteFrames(compres?sionSession, kCMTimeInvalid);
10. VTCompressionSessionInvalidate(compres?sionSession);
11. CFRelease(compressionSession);
12. compressionSession = NULL;
2.2 播放端
直播流播放:使用了第三方的播放器框架PLPlayerKit,实现直播流的播放功能,在播放器SDK 中已经实现了音视频的解码。通过流媒体协议(RTMP、HLS) 从服务器获取直播流,并在应用中展示出来,让用户能够观看直播内容。以下列举部分代码:
1. self.playerOption = [PLPlayerOption defaultOp?tion];
2.PLPlayFormat format = kPLPLAY_FORMAT_Un?Known;
3. NSString *urlString = _media. videoURL. lower?caseString;
4. if ([urlString hasSuffix:@"mp4"]) {
5. format = kPLPLAY_FORMAT_MP4;
6. } else if ([urlString hasPrefix:@"rtmp:"]) {
7. format = kPLPLAY_FORMAT_FLV;
8. } else if ([urlString hasSuffix:@".m3u8"]) {
9. format = kPLPLAY_FORMAT_M3U8;
10. }
11. [self.playerOption setOptionValue:@(format) for?Key:PLPlayerOptionKeyVideoPreferFormat];
12. [self. playerOption setOptionValue: @(kPLLog?None) forKey:PLPlayerOptionKeyLogLevel];
13. NSString* docPathDir = [NSSearchPathForDirec?toriesInDomains(NSDocumentDirectory, NSUserDomain?Mask, YES) objectAtIndex:0];
14. docPathDir = [docPathDir stringByAppending?String:@"/PLCache/"];
15. [self. playerOption setOptionValue: docPathDirforKey:PLPlayerOptionKeyVideoCacheFolderPath];
16. [self.playerOption setOptionValue:@"mp4" for?Key:PLPlayerOptionKeyVideoCacheExtensionName];
17. NSDate *date = [NSDate date];
18. self.player = [PLPlayer playerWithURL:[NSURLURLWithString: _media. videoURL] option: self. playerOp?tion];
19. self.player.delegateQueue = dispatch_get_main_queue();
20. self.player.playerView.contentMode = UIView?ContentModeScaleAspectFit;
21. self.player.delegate = self;
22. self.player.loopPlay = NO;
23. [self insertSubview:self.player.playerView atIn?dex:0];
24. self.player.playerView.frame = self.bounds;
互动功能实现:直播互动,在播放界面上添加点赞、评论、礼物赠送等互动按钮,通过与后端服务器建立WebSocket长连接,实时获取和发送互动消息,如点赞数量、评论内容、礼物类型等。
1. - (void)sendMsgData:(NSDictionary *)msgData{
2. //发送消息
3. NSData *data = [NSJSONSerialization da?taWithJSONObject: msgData options: NSJSONWriting?PrettyPrinted error:nil];
4. NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
5. [[SocketRocketUtility instance] sendData:str];
6. }
7. - (void)SRWebSocketDidReceiveMsg: (NSNotifi?cation *)noti {
8. //收到服务端发送过来的消息
9. NSString * message = noti.object;
10. NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding];
11. NSDictionary *d = [NSJSONSerializationJSONObjectWithData: data options: NSJSONReadingMu?tableContainers error:nil];
12. if (self.receiveBlock) {
13. self.receiveBlock(d);
14. }
15. }
直播预约功能:在直播列表或直播详情页面提供预约按钮,用户点击预约按钮将直播加入预约列表,服务器记录预约信息,并在直播开始前发送通知提醒用户。
网络请求和数据处理:通过网络请求框架AFNet?working与服务器进行HTTP通信,使用SocketRocket 框架实现WebSocket长连接,实现用户互动功能的请求和数据交换。客户端接收服务器返回的数据,并根据数据更新UI,保持与服务器的数据同步。
错误处理和优化:在实现过程中,不可避免地会出现各类异常情况,如网络连接失败、服务器错误、软件闪退等,开发者需要使用断点、日志等调试方法对这些异常进行处理。同时需要优化给用户的提示信息,优化代码和性能,提高播放端的稳定性和用户体验。
2.3 流媒体传输
流媒体服务端基于阿里云的视频直播云服务,阿里云视频直播拥有全链路覆盖、全球布局、安全稳定、流畅体验、超低延时、高清体验等优势。阿里云视频直播服务支持常用的传输协议,包括RTMP(Real-Time Messaging Protocol) 、HLS(HTTP Live Streaming) 、RTSP(Real Time Streaming Protocol) 、WebRTC(WebReal-Time Communication) 等,通过综合考虑网络环境、设备支持、延迟要求和安全性等因素,结合实际情况进行选择。RTMP协议具有低延迟和较高的稳定性,并且在网络带宽较低的情况下仍能提供较好的观看体验,作为App端的传输协议。HLS传输协议对网络环境的要求较为宽松,能够在不稳定的网络条件下稳定推流,采用分段式传输的方式,选择其作为H5端的传输协议。
系统将通过视频采集端采集的直播内容,通过边缘推流的方式,推送到阿里云的直播云平台。直播流通过CDN选择最优的边缘节点进行加速,可以保证直播流上传的稳定性。当直播流传输到阿里云的直播中心后,系统通过程序和接口对视频流进行实时操作,包括转码、鉴黄、时移、录制、截图等。处理后的直播流再通过CDN网络进行分发加速,传输到播放端中进行播放。通过阿里云提供的直播后台,除了可以通过程序对视频进行转码、截图、保存等操作外,用户还可以将保存下来的视频转存至阿里云点播系统中,再进行播放和云剪辑。系统的业务服务端可以通过阿里云提供的接口对直播的回看视频进行编辑和调用[3]。
2.4 关键技术
系统的实现过程中,使用了许多关键技术:音视频的编码和解码是系统的核心技术之一,直接影响着直播内容的质量和传输效率;系统利用内容分发网络(CDN) 将直播内容缓存到全球各地的节点,用户访问时可以就近获取内容,减少传输时延和带宽占用,提高直播传输的速度和稳定性,从而提高系统的整体性能[4];采用多路复用技术(如HTTP/2、QUIC等)将多个数据流合并在一起传输,减少了连接建立的次数和头部开销,提高了传输效率和带宽利用率;利用智能路由选择算法根据网络拓扑结构和实时网络状态动态调整数据传输的路径,选择最优的传输路径和节点,降低网络延迟和拥塞,提高传输效率。使用流量控制和拥塞控制策略,根据网络情况和服务器负载动态调整传输速率,防止网络拥塞和数据丢失,确保数据传输的稳定性和可靠性;引入前向纠错码,将冗余数据添加到传输的数据流中,使接收端在接收到部分丢失或损坏的数据时仍能恢复原始数据,提高数据传输的容错能力。
3 分析与展望
新媒体直播作为一种新兴的媒体形式,正迅速成为人们获取信息、沟通互动的重要方式,其未来发展和面临的挑战备受关注。未来,随着5G网络的普及和移动设备技术的不断升级,新媒体直播将迎来更为多元化和全球化的发展趋势。多元化内容将成为新媒体直播的重要特征,用户将有更多选择,内容涵盖娱乐、教育、健康、体育等多个领域,满足不同用户的需求。同时,全球化的发展趋势将推动手机直播走向世界,吸引来自全球各地的观众和主播,促进文化交流和产业合作。商业化也将是未来手机直播的重要趋势,通过付费订阅、广告投放、商品销售等方式实现商业价值,推动行业的健康发展。
然而,目前直播行业的发展尚未成熟,缺乏完善的法律制度和行业自律规范,还存在很多问题[5]。内容质量的不稳定性、用户隐私保护的问题、平台监管的缺失等都是当前亟待解决的难题。此外,虚假信息和不良内容的传播也对手机直播的发展构成威胁。因此,直播平台和相关行业需要共同努力,加强内容审核和监管,保护用户的合法权益,营造良好的网络直播环境。未来,随着技术的不断进步和规范的完善,新媒体直播将成为人们生活和娱乐的重要组成部分,为用户带来更丰富、更便捷的观看体验,推动传媒产业向前发展。
参考文献:
[1] 张秀钟. 融媒体时代新媒体直播技术的发展[J]. 科技传播,2019,11(4):88-89.
[2] 王正宁. H. 264/AVC视频编码快速算法研究[D]. 成都:西南交通大学,2007.
[3] 刘以. 在线编程平台直播教学系统的设计与实现[D]. 北京: 北京邮电大学,2021.
[4] 蔡辉. 内容分发网络技术的研究[D]. 上海:复旦大学,2013.
[5] 祁蓉梅. 新媒体直播平台现状与发展前景[J]. 新闻文化建设,2021(20):175-176.
【通联编辑:谢媛媛】