Tôi có một FFMPEG AVFrame
trong YUVJ420P
và tôi muốn chuyển đổi nó thành một CVPixelBufferRef
với CVPixelBufferCreateWithBytes
. Lý do tôi muốn làm điều này là sử dụng AVFoundation để hiển thị/mã hóa các khung hình.Làm thế nào để chuyển đổi một khung hình FFMPEG AVFrame trong YUVJ420P thành AVFoundation cVPixelBufferRef?
tôi chọn kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
và cố gắng chuyển đổi nó kể từ khi AVFrame có dữ liệu trong ba mặt phẳng Y480
Cb240
Cr240
. Và theo những gì tôi đã nghiên cứu này phù hợp với các lựa chọn kCVPixelFormatType
. Bởi là biplanar tôi cần phải chuyển đổi nó thành một bộ đệm có chứa Y480
và CbCr480
xen kẽ.
tôi đã cố gắng để tạo ra một bộ đệm với 2 máy bay:
frame->data[0]
trên máy bay đầu tiên,frame->data[1]
vàframe->data[2]
xen kẽ trên máy bay thứ hai.
Tuy nhiên, tôi nhận được lỗi lại -6661 (invalid a)
từ CVPixelBufferCreateWithBytes
:
"Invalid function parameter. For example, out of range or the wrong type."
Tôi không có chuyên môn về xử lý ảnh nào cả, vì vậy bất kỳ con trỏ đến tài liệu mà có thể làm cho tôi bắt đầu ở bên phải tiếp cận vấn đề này được đánh giá cao. Kỹ năng C của tôi không phải là hàng đầu nên tôi có thể mắc lỗi cơ bản ở đây.
uint8_t **buffer = malloc(2*sizeof(int *));
buffer[0] = frame->data[0];
buffer[1] = malloc(frame->linesize[0]*sizeof(int));
for(int i = 0; i<frame->linesize[0]; i++){
if(i%2){
buffer[1][i]=frame->data[1][i/2];
}else{
buffer[1][i]=frame->data[2][i/2];
}
}
int ret = CVPixelBufferCreateWithBytes(NULL, frame->width, frame->height, kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, buffer, frame->linesize[0], NULL, 0, NULL, cvPixelBufferSample)
Khung là AVFrame
với rawData từ FFMPEG Giải mã.
Có phải 'cvPixelBufferSample' là CVPixelBufferRef không? Nếu vậy, tham số cuối cùng trong 'CVPixelBufferCreateWithBytes()' sẽ cần phải là '& cvPixelBufferSample' để cho phép con trỏ tới bộ đệm pixel mới được trả về bằng tham chiếu. –