Γρήγορη αποστολή συμπιεσμένων καρέ βίντεο χρησιμοποιώντας το GPUImage

ψήφοι
1

Γράφω μια εφαρμογή Swift που στέλνει μια είσοδο βίντεο κάμερας iPhone (καρέ) μέσω του δικτύου, ώστε να μπορώ αργότερα να τις εμφανίσω σε μια εφαρμογή macOS.

Προς το παρόν, αρπάζω καρέ βίντεο από ένα AVCaputreSession και πάρτε ένα PixelBuffer από το captureOutput μέθοδος. Δεδομένου ότι κάθε πλαίσιο είναι τεράστιο (RAW pixels) μετατρέπω το CVPixelBuffer αυτό σε ένα CGImage με VTCreateCGImageFromCVPixelBuffer και αργότερα σε ένα UIImage με συμπίεση JPEG (50%). Στη συνέχεια, στέλνω αυτό το JPEG μέσω του δικτύου και το εμφανίζω στην εφαρμογή Mac OS.

Όπως μπορείτε να δείτε, αυτό απέχει πολύ από το ιδανικό και λειτουργεί με ταχύτητα ~ 25 FPS σε iPhone 11. Μετά από κάποια έρευνα, βρήκα την εικόνα 2 της GPU . Φαίνεται ότι θα μπορούσα να λάβω τα δεδομένα από την κάμερα και να εφαρμόσω κάτι τέτοιο (έτσι ώστε ο μετασχηματισμός να γίνει σε GPU):

camera = try Camera(sessionPreset:AVCaptureSessionPreset640x480)
let pictureOutput = PictureOutput()
pictureOutput.encodedImageFormat = .JPEG
pictureOutput.imageAvailableCallback = {image in
    // Send the picture through the network here
}
camera --> pictureOutput

Και θα πρέπει να μπορώ να μεταδώσω αυτό το UIImage και να το εμφανίσω στην εφαρμογή macOS. Υπάρχει καλύτερος τρόπος για να εφαρμοστεί όλη αυτή η διαδικασία; Ίσως θα μπορούσα να χρησιμοποιήσω την κωδικοποίηση υλικού H264 του iPhone αντί να μετατρέψω εικόνες σε JPEG, αλλά φαίνεται ότι δεν είναι τόσο απλό (και φαίνεται ότι το GPUImage κάνει κάτι τέτοιο από αυτό που διάβασα).

Οποιαδήποτε βοήθεια εκτιμάται, ευχαριστώ εκ των προτέρων!

Δημοσιεύθηκε 18/05/2020 στις 18:35
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Κατανοώ ότι θέλετε να κάνετε αυτήν τη λειτουργία σε περιβάλλον εκτός Διαδικτύου.

Ποιοι είναι οι περιορισμοί του έργου σας;

  1. Ελάχιστο fps;
  2. Ελάχιστη ανάλυση βίντεο;
  3. Πρέπει να μεταδίδεται ήχος;
  4. Ποιο είναι το περιβάλλον του δικτύου σας;
  5. Ελάχιστη έκδοση iOS και OSX;

Εκτός από αυτά, το GPUImage δεν είναι η κατάλληλη λύση για εσάς. Εάν πρόκειται να μεταφέρετε βίντεο, πρέπει να κωδικοποιήσετε H264 ή H265 (HEVC) κάθε στιγμή. Με αυτόν τον τρόπο, μπορείτε να μεταδώσετε βίντεο με τρόπο απόδοσης.

Η λύση που κάνετε τώρα είναι CMSampleBuffer-> CVPixelBuffer-> JPEG-> Η μετατροπή δεδομένων επιβαρύνει σοβαρά τον επεξεργαστή. Αυξάνει επίσης τον κίνδυνο διαρροής μνήμης.

Εάν μπορείτε να πείτε λίγο, θα ήθελα να βοηθήσω. Έχω εμπειρία με την επεξεργασία βίντεο.

Συγνώμη για τα αγγλικά μου.

Απαντήθηκε 24/05/2020 στις 23:59
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more