一、需求
直播助手在錄屏過程中,產品要求跟隨用戶手機屏幕旋轉,錄屏的視頻跟隨旋轉
二、實施方案
目前觸手錄,iTools PC端均已經實現該功能,並且該功能只適配iOS9和iOS10系統。猜測實現方案有兩種方式:
1、Airplay協議升級,支持在用戶旋轉之后,系統發送過來的H264數據已經旋轉,可能性比較小
2、系統發送過來的H264數據需要解碼,然后手動根據屏幕方向,進行旋轉。
1方式實施時間較長,暫時按照方案2來實施。2方案中需要感知用戶屏幕的方向,注意這里的方向是渲染的朝向而不是重力朝向,渲染方向通過下面的方式獲取
三、iOS9 硬編碼的bug
iOS上面主要硬編碼兩種方式,一種VideoToolBox,一種AVAssetWriter;AVAssetWriter要求同一時刻只能存在一個對象在工作,否則在系統的log中可能會出現下面的警告
Sep 7 10:26:11 Administratorde-iPhone kernel[0] <Notice>: AVE: openGated (ID 8000 dev f8 (force f0)) with CL REGISTERED = 4 (clock 1) Sep 7 10:26:11 Administratorde-iPhone kernel[0] <Notice>: H264SecurityCheck WARNING: m_NumberOfClients reached MAX 4 Sep 7 10:26:11 Administratorde-iPhone kernel[0] <Notice>: AVE WARNING: m_ClientsSecurityCheck->AddClient failed
並且AVAssetWriterInputPixelBufferAdaptor 在追加數據的時候,也會添加失敗,導致無法再進行編碼。
項目中參照VideoCore的硬編碼代碼存在缺陷
https://github.com/jgh-/VideoCore-Inactive/blob/master/transforms/iOS/H264Encode.h
該C++類的實現文件中第一個未采用ARC編譯方式;第二個AVAssetWriter在指針轉換過程中大量使用void*指針,導致AVAssetWriter在C++對象析構之后無法正常釋放,產生無法再編碼的bug
三、bug修復
將AVAssetWriter void*指針數組改為AVAssetWriter*指針,分成兩個對象,讓ARC控制對象的釋放