Twitch'in bu konuda bir yayını var. Kendi programlarını çeşitli nedenlerle kullanmaya karar verdiklerini açıklarlar; bunlardan biri, ffmpeg'in farklı iş parçacıklarında farklı x264 örnekleri çalıştırmanıza izin vermemesiydi, bunun yerine bir sonraki çıktıya geçmeden önce belirtilen iş parçacıklarını bir çıktıdaki bir kareye ayırıyordu.
Gerçek zamanlı yayın yapmıyorsanız, daha fazla lüksünüz vardır. 'Doğru' yol muhtemelen bir çözünürlükte sadece -g ile belirtilen GOP boyutunda kodlamak ve ardından aynı yerlerde anahtar kareleri zorlayan diğer çözünürlükleri kodlamaktır.
Bunu yapmak istiyorsanız, ana kare zamanlarını almak için ffprobe'yi kullanabilir ve ardından bunu bir ffmpeg komutuna dönüştürmek için bir kabuk betiği veya gerçek bir programlama dili kullanabilirsiniz.
Ancak çoğu içerik için, her 5 saniyede bir anahtar kareye ve her 5 saniyede bir iki anahtar kareye sahip olmak (biri zorunlu ve senaryodan biri olmak) arasında çok az bir fark vardır. Bu, P-kare ve B-kare boyutuna kıyasla ortalama I-kare boyutuyla ilgilidir. X264'ü tipik ayarlarla kullanıyorsanız (bunları etkilemek için her şeyi yapmanız gerektiğini düşündüğüm tek neden, x264'ün kolay içerikte bit hızını kullanmasını engellemenin kötü bir yolu olarak -qmin'i ayarlamanızdır; bu, tüm kare türlerini aynı değerle sınırlar , Sanırım) ve I-kare ortalama 46 kB ortalama boyutu, P-kare 24 kB, B-kare 17 kB (P-kare'ler kadar sık), ardından her saniyede 30 fps'de ekstra bir I-kare gibi bir sonuç alıyor. dosya boyutunda sadece% 3 artış. H264 ve h263 arasındaki fark% 3'lük bir düşüş grubundan oluşuyor olabilir, ancak bir tanesi çok önemli değil.
Diğer içerik türlerinde kare boyutları farklı olacaktır. Adil olmak gerekirse, bu zamansal karmaşıklık ile ilgilidir ve mekansal karmaşıklık ile ilgili değildir, bu nedenle zor içerikle yalnızca kolay içerik değildir. Ancak, genel olarak, akışlı video sitelerinin bit hızı sınırlaması vardır ve göreceli olarak büyük I kareleri olan içerik, ne kadar fazla anahtar kare eklenirse yapılsın yüksek kalitede kodlanacak kolay içeriktir. Atılgandır, ancak bu atık genellikle fark edilmez. En israf verici durum, muhtemelen her bir anahtar karenin tamamen aynı olduğu, bir şarkıya eşlik eden statik bir görüntü olan bir videodur.
Emin değilim, zorunlu anahtar karelerin -maxrate ve -bufsize ile ayarlanan hız sınırlayıcı ile nasıl etkileşime girdiğidir. YouTube’un bile, tutarlı bir kalite vermek için arabellek ayarlarını doğru bir şekilde yapılandırmakta sıkıntı yaşadığını düşünüyorum. Bazı siteler tarafından görülebileceği gibi sadece ortalama bit hızı ayarları kullanıyorsanız (x264'ün başlık / mov atomundaki (bir hex editörüyle? kullanıcı tarafından oluşturulan içeriği sunan ortalama bit hızı, kullanıcıları videolarının sonuna siyah ekran eklemeye teşvik eder.
Ffmpeg'in -g seçeneği veya kullandığınız diğer herhangi bir kodlayıcı seçeneği, kodlayıcıya özgü seçeneğe eşlenir. Yani '-x264-params keyint = GOPSIZE', '-g GOPSIZE' ile eşdeğerdir.
Sahne algılamanın kullanılmasıyla ilgili bir sorun, herhangi bir nedenden ötürü belirli numaraların yanında anahtar kareleri tercih etmenizdir. Her 5 saniyede bir anahtar kare belirlerseniz ve sahne algılamayı kullanırsanız ve 4.5'te bir sahne değişikliği varsa, o zaman algılanmalıdır, ancak bir sonraki anahtar kare 9.5'te olacaktır. Zaman böyle artmaya devam ederse, 40, 45, 50, 55 yerine 42.5, 47.5, 52.5, vb. Anahtar karelere sahip olabilirsiniz. Buna karşılık, 5.5'te bir sahne değişikliği varsa, o zaman 5 ve 5.5'teki bir anahtar kare bir başkası için çok erken olacak. Ffmpeg, "gelecek 30 karede sahne değişikliği olmazsa burada bir ana kare yap" seçeneğini belirtmeme izin vermiyor. C anlayan biri bu seçeneği ekleyebilir.
Değişken kare hızındaki video için, Twitch gibi canlı akış yapmadığınızda, sürekli kare hızına dönüştürmeden sahne değişikliklerini kullanabilmelisiniz. Ffmpeg'de 'select' filtresini kullanırsanız ve ifadede 'scene' sabitini kullanırsanız, hata ayıklama çıktısı (-v debug veya kodlama sırasında birkaç kez '+' tuşuna basmak) sahne değişim numarasını gösterir. Bu muhtemelen x264 tarafından kullanılan sayıdan farklıdır ve bu kadar kullanışlı değildir, ancak yine de yararlı olabilir.
O zaman prosedür, muhtemelen sadece ana kare değişiklikleri için olan bir test videosu yapmak olacaktır, ancak 2-pass kullanılıyorsa hız kontrol verileri için kullanılabilir. (Oluşturulan verinin farklı çözünürlükler ve ayarlar için hiç faydalı olup olmadığından emin değil; makroblok ağacı verileri olmayacak.) Sabit kare hızındaki videoya dönüştürün, ancak karar verirseniz kare hızını yarı yarıya düşürürken bu kekemelik çıktısını görün fps filtresini başka amaçlarla kullanmak için. İstediğiniz ana kare ve GOP ayarlarınızla x264 üzerinden çalıştırın.
Ardından, sadece bu ana kare zamanlarını orijinal değişken kare hızlı videoyla kullanın.
Çerçeveler arasında 20 saniyelik bir boşlukla tamamen delice kullanıcı tarafından oluşturulan içeriğe izin verirseniz, değişken kare hızı kodlaması için çıktıyı bölebilir, fps filtresi, bir şekilde seçme filtresi kullanabilirsiniz (belki de çok uzun bir ifade oluşturabilir. Her anahtar kare zamanında) ... veya belki de test videosunu girdi olarak kullanabilir ve eğer ffmpeg seçeneği işe yaradıysa, sadece ana karelerin kodunu çözebilir veya ana kareleri seçmek için seçim filtresini kullanabilirsiniz. Ardından doğru boyuta ölçeklendirin (bunun için bir scale2ref filtresi bile var) ve orijinal videoyu üzerine yerleştirin. Ardından, bu zorlamalı ana anahtar kareleri orijinal video ile birleştirmek için ara süzgeci kullanın. Bu, interleave filtresinin engellememesi dışında 0,001 sn'lik iki kareyle sonuçlanırsa, bu sorunu başka bir seçme filtresiyle kendiniz çözün. Serpiştirici filtre için çerçeve tamponu sınırlarıyla başa çıkmak, burada ana sorun olabilir. Bunların hepsi işe yarayabilir: daha yoğun akımı tamponlamak için bir tür filtre kullanın (beşli filtre?); giriş dosyasına birden çok kez bakın, böylece bir kereden fazla kod çözülür ve karelerin kaydedilmesi gerekmez; Ana kareler zamanında, hiç yapmadığım 'streamselect' filtresini kullanın; varsayılan davranışını değiştirerek veya en eski kareyi bir kare bırakmak yerine arabellekte çıkarmak için bir seçenek ekleyerek ara süzgeci geliştirin. Anahtar karelerin tam zamanında, hiç yapmadığım; varsayılan davranışını değiştirerek veya en eski kareyi bir kare bırakmak yerine arabellekte çıkarmak için bir seçenek ekleyerek ara süzgeci geliştirin. Anahtar karelerin tam zamanında, hiç yapmadığım; varsayılan davranışını değiştirerek veya en eski kareyi bir kare bırakmak yerine arabellekte çıkarmak için bir seçenek ekleyerek ara süzgeci geliştirin.