ffmpeg ile videonun (+ ses) doğru kesilmesi


10

Web sitemin, kullanıcıların sağladığım kaynak videodan kendi kliplerini doğru bir şekilde oluşturmalarına izin vermesini istiyorum.

İlk önce bir web sitesi için uygun bir şeye dönüştürmek istediğiniz bir kaynak video dosyası var:

Input #0, matroska,webm, from 'source.mkv': 
Duration: 00:28:18.57, start: 0.000000, bitrate: 10183 kb/s 
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 48 tbc (default)
Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s (default)

Ben böyle dönüştürmek için ffmpeg kullanın:

ffmpeg -i source.mkv -c:v libx264 -c:a aac -strict experimental -vf scale="960:-1" source.mp4

Bu videoyu geri izlemek, yeterince iyi kalitede ve ihtiyaçlarım için yeterince küçük dosya boyutu ve web siteme yükler / oynatır.

Kullanıcıların bu videoda bir başlangıç ​​ve bitiş noktası seçmesine ve bir klip oluşturmasına olanak tanıyan bir web sayfam var. Bunun için kullandığım ffmpeg komutunun bir örneği:

-ss 577.920 -i source.mp4 -t 011.980 -codec:v copy -codec:a copy -vf scale="960:-1" clip1.mp4

Sorun klibin her zaman yeterince doğru olmamasıdır. Genellikle ses yeterince doğrudur, ancak video yarım saniye erken durur.

Bunu bir saniyede 0,2 oranında doğru ve senkronize yapmanın bir yolu var mı?

EDIT: Eklemek -force_key_frames 00:00:00.2yardımcı olmadı.

EDIT: kırpma (iyi) sonuçları -c:v libx264 -c:a aac -strict experimentalyerine kullanmak için değiştirdim -codec:v copy -codec:a copy.

Dosya harici olarak sorunsuz bir şekilde oynatılabilir - ancak html5 video öğeme yükleyip oynattığımda - videonun son kısmı (ses iyi) donuyor. Donmuş olan son kısım bir saniyeden daha kısa.

Başka bir video kodlayıcıyla mı denemeliyim? Libx264 için en iyi alternatif nedir? Bunu göz önünde bulundurarak muhtemelen bunun herkese açık bir web sitesinde olmasını isteyeceğim.

Ancak, MPC veya Windows Media Player gibi bir oynatıcıyla sorunsuz bir şekilde oynatılması, Google Chrome veya HTML video öğesinde bir sorun olduğunu göstermiyor mu? Yoksa desteklenmeyen bir kodlama falan mı kullanıyorum?


Bu, anahtar çerçevelerin zamanlamasıyla ilgili olabilir. Her durumda, bu SuperUser.com'a taşınmalıdır.
Brad

Merhaba, ffmpeg videoyu hiçbir noktada kesemez, sadece anahtar karelerde kesebilir; bu nedenle video neredeyse kesin değilken ses neredeyse kesindir.

Kendim taşıyabilir miyim? Kaynak dosyaya -force_key_frames 00: 00: 00.2 ile anahtar kareler eklemeyi deneyeceğim
Pete Oakey

Yanıtlar:


9

-ssBir giriş veya çıkış seçeneği olarak kullanılmasına bağlı olarak değişiklik davranışı ve genellikle daha yavaştır, ancak bir çıkış seçeneği olarak kullanıldığında daha doğru olabilir. Daha fazla ayrıntı ve örnek için ffmpeg'nin belirtilen zaman diliminden videoyu yavaşça dönüştürmesine verilen cevaba bakınız .

Çıktı kalitesini source.mp4kullanmak üzere -crf18-28 arasında bir değerle değiştirmek için (varsayılan değer 23'tür). Örnekler için FFmpeg ve x264 Kodlama Kılavuzunun CRF bölümüne bakın .

Kırpma komutunuz basitleştirilebilir:

ffmpeg -ss 577.92 -i source.mp4 -ss 0 -t 11.98 -c copy -map 0 clip1.mp4

Ben yerini -codec:v copy -codec:a copyile -c copy -map 0. Bu, yalnızca önceki video ve ses akışları yerine tüm akışları kopyalayacaktır - girişin önceki komutunuz nedeniyle yalnızca iki akışı vardır. Yeniden kodlamadan -codec:v copyölçeklenemediğiniz için , bu nedenle birbirini dışlayan ve girişiniz önceden ayarlanan boyuta ölçeklendiğinden, filtre seçeneklerini kaldırdım.

Hala yeterince doğru değilse, deneyin:

ffmpeg -i source.mp4 -ss 577.92 -t 11.98 -c copy -map 0 clip1.mp4

Daha yavaş, ama muhtemelen daha doğru olacaktır. Bu iki örneğin farklılıklarının açıklaması için, sağladığım ilk bağlantıdaki yanıttaki bağlantılara bakın.

Son olarak, (ffmpeg kaynağındaki tools dizininde bulunur) source.mp4üzerinden geçmeli qt-faststartveya -movflags faststartseçeneği kullanmalısınız . Bu, bazı verileri dosyanın başlangıcına yeniden yerleştirir, böylece tamamen indirilmeden önce oynatmaya başlayabilir.


İpuçları için +1 ama ffmpeg -i kaynağı denedim. video kaçırıldı, ses olsa iyi.
Pete Oakey

@PeteOakey Bit akımı kopyası olmadan kesmeyi denediniz, ancak gerçek yeniden kodlama?
slhck

Bitstream kopyası olmadan denedim - sonuçlar soruma eklendi.
Pete Oakey

3
-ssGiriş seçeneği yerine çıkış seçeneği olarak kullanmak sorunumu çözdü: ilk video çerçevesi çıkış videosunda 1s civarındaydı, bundan önce sadece ses vardı (ayrıca onaylandı ffprobe -show_frames). -ssSonra hareket -i0 kare başlayan ses ve video kareleri çıktı yaptı.
CodeManX
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.