AVAssetWriter 硬編碼bug解決


 

   

 

 

一、需求

  直播助手在錄屏過程中,產品要求跟隨用戶手機屏幕旋轉,錄屏的視頻跟隨旋轉

二、實施方案

  目前觸手錄,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控制對象的釋放

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM