井波 顧少偉



摘要:傳統媒體直播行業存在著諸多痛點,包括受時間和空間限制、成本高昂、內容單一和互動性差等問題。隨著媒體融合的不斷深入和移動互聯網的快速發展,網絡直播已成為重要的信息傳播方式,直播輕量化已成為傳媒領域的熱門話題。與傳統的電視直播方式相比,基于手機端的新媒體直播系統具有成本低、操作簡便、用戶體驗好、實時性和便捷性更高等諸多優勢。基于手機端的新媒體直播系統不僅可以充分發揮手機直播的優勢,提高傳統直播的效率,同時也可以克服傳統直播的時間和空間限制,拓寬媒體傳播的渠道,為媒體行業帶來了更多的發展機遇和商業機會。
關鍵詞:新媒體直播;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.
【通聯編輯:謝媛媛】