2015-11-10 10 views
5

-kullanım sıfırlatıcılığı paramenter kullandığımda 30 fps ile gerçek zamanlı olarak x11'den alınan bir 720p ekranı kodlamak için ffmpeg libx264 kullanıyorum, çerçeve başına ortalama kodlama süresi profille 12 ms kadar büyük olabilir bazal. Neden dilimlenmiş iplik ffmpeg x264 kullanarak gerçek zamanlı kodlamada bu kadar çok etkiler?

ffmpeg x264 kaynak kodu bir çalışma sonrasında, böyle uzun bir süre kodlamak giden anahtar parametre -Tune zerolatency olarak etkin dilimlenmiş-ipler olduğu bulunmuştur. -x264-params dilimlenmiş-thread = 0 kullanılarak devre dışı bırakıldıktan sonra kodlama süresi 2ms

kadar düşük olabilir ve dilimlenmiş iş parçacıkları devre dışı bırakıldığında, CPU kullanımı% 40, etkinken yalnızca% 20 olur.

Birisi bu dilimlenmiş iplik hakkında ayrıntıları açıklayabilir mi? Özellikle gerçek zamanlı kodlamada (kodlanacak hiçbir çerçevenin arabelleğe alınmadığını varsayın. Sadece bir kare yakalandığında kodlayın).

+0

Varsayılan "ön ayar" kullanıyor musunuz? -preset ultrafast'ı kullanırsanız ne olur? – aergistal

+0

Ultrafast, yukarıdaki her iki durumda da kullanılır. – CurtisGuo

+0

Bu ilginç bir soru. 'Ffmpeg' ve' libx264'ün son sürümlerini ve hangi OS/CPU’yu kullanıyorsunuz. Ayrıca nasıl ölçüyorsun? – aergistal

cevap

8

documentation, çerçeve tabanlı iş parçacığının dilime göre daha iyi bir üretkenliğe sahip olduğunu gösterir. Ayrıca, kodlayıcının seri olan bölümleri nedeniyle ikincinin iyi ölçeklenmediğini de not eder. veryfast profili (gerçek zamanlı olmayan) için kodlama parçacıkları genel

Speedup: üzerinde çalışmak için farklı çerçeveler ihtiyacı olduğu süre

threads speedup  psnr 
     slice frame slice frame 
x264 --preset veryfast --tune psnr --crf 30 
1: 1.00x 1.00x +0.000 +0.000 
2: 1.41x 2.29x -0.005 -0.002 
3: 1.70x 3.65x -0.035 +0.000 
4: 1.96x 3.97x -0.029 -0.001 
5: 2.10x 3.98x -0.047 -0.002 
6: 2.29x 3.97x -0.060 +0.001 
7: 2.36x 3.98x -0.057 -0.001 
8: 2.43x 3.98x -0.067 -0.001 
9:   3.96x   +0.000 
10:   3.99x   +0.000 
11:   4.00x   +0.001 
12:   4.00x   +0.001 

temel fark, çerçeve parçacığı gibi görünüyor, çerçeve gecikme ekler dilim tabanlı iş parçacığı tüm iş parçacıkları aynı çerçeve üzerinde çalışır. Gerçek zamanlı kodlamada, çevrimdışına göre boru hattını doldurmak için daha fazla karenin gelmesini beklemek gerekir.

Çerçeve temelli iş parçacığı olarak da bilinen normal iş parçacığı, paralellik için zekice sıralanmış bir çerçeve sistemi kullanır. Ama bir maliyete varıyor: Daha önce de belirtildiği gibi, her ekstra iş parçacığı bir gecikme süresi daha gerektirir. Dilime dayalı iş parçacığı böyle bir soruna sahip değildir: her kare dilimlere bölünür, her dilim bir çekirdek üzerinde kodlanır ve sonuç son kareyi oluşturmak için birbirine eklenir. Maksimum verimi, çeşitli nedenlerle çok daha düşüktür, ancak en azından gecikme olmadan bir miktar paralellik sağlar. Diary of an x264 Developer

Sliceless diş: kaynaktan

2 parçacığı ile örnek. Kodlama çerçevesini başlat # 0. Yarısı bittiğinde, # 1 çerçevesini kodlamaya başlayın. Geri kalanlar henüz kodlanmadığı için, 1. no.lı iplik sadece referans çerçevesinin en üst yarısına erişebiliyor. Yani hareket arama aralığını kısıtlamak zorunda. Ama bu muhtemelen tamam (küçük bir çerçeve üzerinde çok sayıda iplik kullanmıyorsanız), çünkü bu kadar uzun dikey hareket vektörlerine sahip olmak oldukça nadirdir. Kısa bir süre sonra, her iki iplik bir satır makro bloku kodladı, yani iplik # 1 hala hareket aralığı = +/- 1/2 çerçeve yüksekliğini kullanmaktadır. Daha sonra, iş parçacığı # 0, # 0 çerçevesini bitirir ve # 2 numaralı kareye gider. Konu # 0 şimdi hareket kısıtlamaları alır ve # 1 iş parçacığı sınırlandırılmamış. Gönderen

: http://web.archive.org/web/20150307123140/http://akuvian.org/src/x264/sliceless_threads.txt

nedenle ziyade ardından bunları verimli kodlamak (performans ve kalite bilge) mümkün olduğunca çabuk bir çerçeve göndermek gerekir olarak duyu -tune zereolatency ile sliced-threads etkinleştirmeyi kolaylaştırır.

Aksine çok fazla iplik kullanmak, performansı potansiyel kazanımları aşabilecek şekilde tutmak için performansı etkileyebilir.

+0

“Gerçek zamanlı kodlamada, çevrimdışına göre boru hattını doldurmak için daha fazla karenin gelmesini beklemek gerekir.” Bu, çerçeve ipliği hakkında mı konuşuyor? Ve dilim veya çerçeve diş çekme, kod çözme süresini artırır? Konu numarası ne olacak? Teşekkürler – CurtisGuo

+0

Evet Farklı karelerde çalışırken çerçeve iş parçacığı hakkında konuşuyordum. Çerçeve varsayılan olarak işlenir (#threads = 1.5 * çekirdek) ve imo bu yüzden dilimleri etkinleştirirken daha düşük değerler görürsünüz. Çok fazla iş parçacığı (16) = çok fazla yük. Kod çözme süresi hakkında, dilimlerin kullanılması dekoderin çoklu iplikten faydalanmasını ve daha hızlı çözülmesini sağlar (örneğin: blu-ray 4 dilim gerektirir). – aergistal

+0

Merak ettiğim bir şey daha, eğer şasi kullanılmıyorsa, kodlayıcının neden sadece önceki çerçeveleri kullanmak yerine daha sonraki kareleri beklediğidir. – CurtisGuo

İlgili konular