2017-09-01 3 views
0

Wenn auf iOS ein Video kodiert, die meisten Lösungen um diesen Schritt:Warum müssen wir den Thread nach appendPixelBuffer anhalten: withPresentationTime :?

while(encoding) { 
    if(assetWriterInput.readyForMoreMediaData) { 
     [adaptor appendPixelBuffer:buffer withPresentationTime:presentTime]; 
     if(buffer) 
      CVBufferRelease(buffer); 
     [NSThread sleepForTimeInterval:0.05]; // <=== This line slows down encoding 
    } 
} 

Wenn ich das Ergebnis Video ruckelt aussehen wird, auch den Faden nicht schlafen, wenn readyForMoreMediaData immer JA zurück. Wenn ich den Thread pausiere, sieht das Ergebnis perfekt aus.

Aber ich verstehe den Zweck von "readyForMoreMediaData" nicht, wenn wir den Thread trotzdem pausieren müssen? Es sieht so aus, als ob ich die Ruhezeit auf 0.03 reduzieren kann, ohne dass das Ergebnis ruckelnd wirkt, aber es verlangsamt immer noch den Kodierprozess.

Jede Hilfe wäre willkommen, danke!

Antwort

0

Ich habe den Assetwriter mehrere Jahre lang in mehreren Apps Echtzeitvideos geschrieben, darunter eines mit 240 fps als Standard. Ich hatte keine Probleme mit ruckelndem Video. Ich habe nie Schlafbefehle und keine CVBufferRelease verwendet. Mein Code sieht im Wesentlichen wie folgt aus:

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 
{ 
    if (videoWriterInput.readyForMoreMediaData) [videoWriterInput appendSampleBuffer:sampleBuffer]) 

} 

Vielleicht sollten Sie überprüfen, wie Sie Ihre assetwriter einrichten? Es gibt eine Einstellung "recommendedVideoSettingsForAssetWriterWithOutputFileType", die Ihnen bei der Optimierung helfen kann. Ich würde ohne den Adapter versuchen, wenn Sie es nicht unbedingt brauchen, nach meiner Erfahrung läuft es ohne mehr glatt.

+0

Entschuldigung, ich hätte sagen sollen, dass ich OpenGL verwende, um Objekte zu zeichnen und das Ergebnis in ein Video zu kodieren. Ich benutze die Kamera oder ein vorhandenes Video nicht als Quelle. Ich brauche einen Adapter, weil ich einen pixelBufferPool brauche. Ich werde den "recommendedVideoSettingsForAssetWriterWithOutputFileType" versuchen. – Xys

+0

Dank Ich denke recommendedVideoSettingsForAssetWriterWithOutputFileType nur für „AVCaptureVideoDataOutput“ ist, aber ich nicht verwenden diese – Xys

+0

Wenn Sie mehr Code sehen wollen, hier ist ein Beitrag erklärt es: https://stackoverflow.com/a/9704392/5120292 – Xys

Verwandte Themen