Vậy làm cách nào tôi có thể tạo thứ gì đó như thế này trong api của nó:
Bộ mã hóa = EncodeFormat(tên định dạng); // chuẩn bị bộ mã hóa
//...mã tạo khung...bây giờ chúng ta muốn mã hóa khung!//
EncodeFrame(const CImage* src, void* dest, int* is_keyframe, thêm đối số nếu cần);
Điều này có thể thực hiện được không? Bất cứ ai có thể vui lòng cung cấp một ví dụ đơn giản về cách tạo ra một cái gì đó như thế này?
Điều này là không thể nếu không dùng đến các phương pháp lập trình cực kỳ tệ như các biến toàn cục. Việc mã hóa các khung không độc lập; bộ mã hóa phải duy trì trạng thái (ngữ cảnh) và mỗi lần bạn phải giữ một con trỏ để chuyển đến hàm mã hóa. Ý tưởng chuyển lựa chọn định dạng sang EncodeFrame cũng khá ngu ngốc, vì bạn không thể chọn định dạng trên mỗi khung hình mà không đóng bối cảnh bộ mã hóa hiện có và chuyển sang bối cảnh mới.
Trừ khi hình ảnh nguồn đã có định dạng mà bộ mã hóa muốn (có thể là YUV 4:2:0), trình bao bọc của bạn sẽ cần phải chuyển đổi nó. Việc này có thể tự thực hiện hoặc sử dụng libswscale từ ffmpeg. Bạn cũng cần cung cấp dấu thời gian cho từng khung hình. Nếu bạn muốn một API đơn giản mà không phải lo lắng về nội dung này, bạn có thể muốn bọc con trỏ ngữ cảnh codec av do libavcodec cung cấp trong một cấu trúc khác nơi bạn có thể lưu giá trị dấu thời gian chạy, con trỏ ngữ cảnh swscale, v.v.
Ngoài ra, API của bạn không thể chỉ định kích thước của bộ đệm đích, vì vậy điều này hoàn toàn không an toàn. Có thể tốt hơn là trả về một con trỏ tới bộ đệm bên trong (thông qua giá trị trả về hoặc đối số con trỏ tới con trỏ) cùng với kích thước khung được mã hóa, thay vì ghi vào bộ đệm của trình gọi.
Tôi là một lập trình viên xuất sắc, rất giỏi!