Record video with ffmpeg in Xcode

FFMPEG là một công cụ hữu ích cho việc quay và chỉnh sửa video. Bài viết này mình sẽ giới thiệu cách để tích hợp ffmpeg vào trong xcode để có thể record video trong ứng dụng Macos.


Bước 1. Tích hợp ffmpeg vào Xcode

1, Download package cho Macos để tích hợp vào trong Xcode của ffmpeg tại đây https://ffmpeg.org/download.html#build-mac

2, Sau khi đã có file package thì sẽ kéo vào trong thư mục của project như sau

Bước 2. Xử dụng FFMPEG trong xcode

Để có thể sử dụng ffmpeg trong ứng dụng macos chúng ta sẽ sử dụng "Process" như sau


guard let launchPath = Bundle.main.path(forResource: "ffmpeg", ofType: "") else { return }
        DispatchQueue.global().async {
            let compressTask  = Process()
            compressTask.launchPath = launchPath
            compressTask.arguments = [
               // Command của FFMPEG sẽ được dùng ở đây
            ]
            do {
                try compressTask.run()
            } catch {
                
            }
        }
  • Khởi tại một biến launchPath chính là source của ffmpeg trong project.
  • Khởi tạo một Process compressTask có các thuộc tính launchPath là biến launchPath vừa tạo và thuộc tính arguments chính là các command của ffmpeg.
  • Sau khi đã có hai thuộc tính trên thì chúng ta có thể sử dụng câu lệnh compressTask.run()

Như vậy là chúng ta đã tích hợp và sử dụng được bộ package của ffmpeg. Tiếp theo sẽ là thêm command vào trong thuộc tính arguments để có thể chạy được ffmpeg.

Bước 3. Xử dụng command FFMPEG để record video từ camera.

Trước để biết những index device nào support việc record thì cũng ta sẽ sử dụng câu lệnh

-f avfoundation -list_devices true -i ""

Câu lệnh này sẽ list ra những devices cho phép record với macos. Thường thì

  • index 0: sẽ là default camera
  • index :0 sẽ là default mic
  • index 1: sẽ là default screen - Nếu máy không sử dụng 2 camera

Record camera

Lưu ý: Command sử dụng ffmpeg trong xcode được chia bởi từng biến nhỏ như sau

"-f", "avfoundation",
                "-framerate", "30",
                "-i", "0:0",
                "-vcodec", "libx264",
                "-force_key_frames", "expr:gte(t,n_forced*2)",
                "-preset", "ultrafast",
                "-tune", "zerolatency" ,
                "-pix_fmt", "yuv422p",
                "-b:a", "384k",
                "-b:v", "2500k",
                "-acodec", "aac",
                "-strict", "-2",
                "-t", "60",
                "-c", "copy",
                "-an", "\(folderRecord)/testCam.ts"

Một số commond cần lưu ý trong command trên

  • "-i", "0:0": Record camera và Mic
  • "-t", "60": Video sẽ có độ dài 60s
  • "-an", "(folderRecord)/testCam.ts": File chứa có định dạng .ts và được lưu ở folder record camera

Record screen

"-f", "avfoundation",
                "-framerate", "30",
                "-i", "1:",
                "-vcodec", "libx264",
                "-force_key_frames", "expr:gte(t,n_forced*2)",
                "-preset", "ultrafast",
                "-tune", "zerolatency" ,
                "-pix_fmt", "yuv422p",
                "-b:a", "384k",
                "-b:v", "2500k",
                "-acodec", "aac",
                "-strict", "-2",
                "-t", "60",
                "-c", "copy",
                "-an", "\(folderRecord)/testScreen.ts"

Một số commond cần lưu ý trong command trên

  • "-i", "1:": Record screen và không có audio
  • "-t", "60": Video sẽ có độ dài 60s
  • "-an", "(folderRecord)/testScreen.ts": File chứa có định dạng .ts và được lưu ở folder record camera

Bên trên là những cách cơ bản để tích hợp FFMPEG vào Xcode và run 1 vài command đơn giản.

Lưu Ý: Khi submit/verify app thì cần sign file ffmpeg trong folder của projet bằng Cer và Provisionning của Apple. Có thể tham khảo command sau

pkgbuild --root build/pkgroot --identifier "com.iden.app" --version "1.0" --install-location "/" --sign "Developer ID Installer: AVCzczcQDAD (ten-num)" path_ffmpeg


All Rights Reserved