Snelle verzending van gecomprimeerde videoframes met behulp van GPUImage

stemmen
1

Ik schrijf een Swift app die een iPhone camera video-ingang (frames) door het netwerk stuurt, zodat ik ze later op een macOS app kan weergeven.

Op dit moment pak ik de videoframes van een AVCaputreSession, en krijg een PixelBuffervan de captureOutputmethode. Aangezien elk frame enorm is (RAW pixels) converteer ik CVPixelBufferdat naar een CGImagemet VTCreateCGImageFromCVPixelBufferen later naar een UIImagemet JPEG compressie (50%). Ik stuur die JPEG dan door het netwerk en geef het weer op de Mac OS app.

Zoals u kunt zien is dit verre van ideaal en draait op ~25 FPS op een iPhone 11. Na wat onderzoek kwam ik op de proppen met GPU Image 2. Het lijkt erop dat ik de data uit de camera kon halen en zoiets als dit kon toepassen (zodat de transformatie in GPU gedaan wordt):

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

En ik zou in staat moeten zijn om die UIImage uit te zenden en weer te geven op de macOS app. Is er een betere manier om dit hele proces te implementeren? Misschien kan ik de H264 hardware codering van de iPhone gebruiken in plaats van het omzetten van beelden naar JPEG, maar het lijkt erop dat het niet zo eenvoudig is (en het lijkt erop dat GPUImage zoiets doet van wat ik heb gelezen).

Elke hulp wordt op prijs gesteld, dank bij voorbaat!

De vraag is gesteld op 18/05/2020 om 18:35
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

Ik begrijp dat u deze operatie wilt doen in een niet-internetomgeving.

Wat zijn de beperkingen van uw project;

  1. Minimum fps?
  2. Minimale videoresolutie?
  3. Moet er geluid worden verzonden?
  4. Wat is uw netwerkomgeving?
  5. Minimale iOS- en OSX-versie?

Afgezien daarvan is GPUImage geen geschikte oplossing voor u. Als u video's gaat overzetten, moet u H264 of H265 (HEVC) op elk moment coderen. Op deze manier kunt u video's op een performante manier overbrengen.

De oplossing die u nu doet is CMSampleBuffer-> CVPixelBuffer-> JPEG-> Dataconversie belast de processor ernstig. Het verhoogt ook het risico op geheugenlekken.

Als je een beetje kunt vertellen, wil ik graag helpen. Ik heb ervaring met videobewerking.

Sorry voor mijn engels.

antwoordde op 24/05/2020 om 23:59
bron van user

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