android錄製視頻有裂痕馬賽克的問題處理辦法

最近做一個項目, 錄製視頻添加水印功能, 但是完成之後發現高速晃動手機錄製的畫面有斷裂, 有馬賽克的問題。
處理過程是從攝像頭回調數據放入隊列中, 上層將數據的yuv轉換角度, 添加水印後放入編碼器中進行編碼,但出來的效果卻是這樣
在這裏插入圖片描述
在這裏插入圖片描述再跟蹤數據流的過程中發現是轉換角度之後纔出現的問題。網上查詢轉換角度的算法之後,更換了幾個, 都沒有解決問題。
後查詢代碼,原來是安卓的運行機制導致的該問題, 並非轉換角度的問題。

mCameraProxy.startPreview();
int size = mPreviewSize.getWidth() * mPreviewSize.getHeight() * ImageFormat.getBitsPerPixel(mPreviewFormat) / 8;
mCameraProxy.addCallbackBuffer(new byte[size]);
mCameraProxy.setPreviewCallbackWithBuffer(mFrameworkPreviewCallback);

獲取的數據是通過該方式獲取的。
private Camera.PreviewCallback mFrameworkPreviewCallback = new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] bytes, Camera camera) {
if (mPreviewCallback != null) {
mModeDeviceCallback.onPreviewStart();
Log.i(“fengq”, “mFrameworkPreviewCallback v1”);
mPreviewCallback.onPreviewCallback(bytes, mPreviewFormat, mCameraId);
}
if(mCameraProxy != null){
mCameraProxy.addCallbackBuffer(bytes);
}

        MediaMuxerUtils.getMuxerRunnableInstance().setCameraId(mCameraId);
        MediaMuxerUtils.getMuxerRunnableInstance().addVideoFrameData(bytes);
    }
};

通過該方式獲取的數據,如果上層處理速度跟不上,其中的bytes是後面的幀將前面的覆蓋。導致出現的問題
public void addData(byte[] yuvData) {
if(frameBytes != null && yuvData != null && isEncoderStart){
Log.i(“fengq”, “yuvData.length=” + yuvData.length + “frameBytes.size=” + frameBytes.size());
int length = yuvData.length;
if(frameLength == length){
boolean isOffer = frameBytes.offer(yuvData);
if(!isOffer){
frameBytes.poll();
frameBytes.offer(yuvData);
}
}
}
}

改成
public void addData(byte[] yuvData) {
if(frameBytes != null && yuvData != null && isEncoderStart){
Log.i(“fengq”, “yuvData.length=” + yuvData.length + “frameBytes.size=” + frameBytes.size());
int length = yuvData.length;
if(frameLength == length){
byte[] newYuvData = new byte[length];
System.arraycopy(yuvData, 0, newYuvData, 0, length);

boolean isOffer = frameBytes.offer(newYuvData);
if(!isOffer){
frameBytes.poll();
frameBytes.offer(yuvData);
}
}
}
}
在上層處理的時候,將原始數據複製到new出來的數組中, 這樣, 原始數據指針就不會被覆蓋, 該問題就會解決了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章