ffmpeg, RTMP akışını giriş veya çıkış olarak ele alır ve iyi çalışır.
RTMP sunucusuna bazı videoları (bir python betiği tarafından yönetilen dinamik bir çalma listesi) yayınlamak istiyorum ve şu anda oldukça basit bir şey yapıyorum: videolarımın FFMPEG ile tek tek RTMP sunucusuna aktarılması, ancak bu bir bağlantı kopmasına neden oluyor Bir video her zaman sonlanır ve bir sonraki video başladığında akış çalışmaya hazırdır.
Bu videoları hiçbir bağlantı kopması olmadan sürekli olarak yayınlamak istiyorum, ardından akış doğru bir şekilde izlenebilir.
Bu komutu, videolarımı sunucuya birer birer yayınlamak için kullanıyorum.
ffmpeg -re -y -i myvideo.mp4 -vcodec libx264 -b:v 600k -r 25 -s 640x360 \ -filter:v yadif -ab 64k -ac 1 -ar 44100 -f flv \ "rtmp://mystreamingserver/app/streamName"
Günlerce internet üzerinden bazı geçici çözümler aradım ve bazı kişilerin
ffmpeg içinde giriş olarak adlandırılmış bir boru kullanmaktan bahsettiğini gördüm, denedim ve
ffmpeg yalnızca RTMP akışını kapatmadığı için iyi çalışmadı. yeni bir video geliyor ama aynı zamanda kendisini kapatıyor.
Bunu yapmanın bir yolu var mı? (
ffmpeg ile RTMP sunucusuna bağlantı kesilmeden videoların dinamik bir oynatma listesini yayınla
Güncelleme (kabul edilen cevabı silemediğim için): doğru çözüm, concat'a benzer bir özel demuxer uygulamaktır. Şu anda başka temiz bir yol yok. Ellerin kirlenmeli ve kodlanmalı!
Aşağıda çirkin bir kesmek. Bu yapmak için çok kötü bir yol, sadece yapma!
Çözüm concat demuxer kullanmaktadır ve tüm kaynak medya dosyalarınızın aynı codec bileşenini kullandığını varsaymaktadır. Örnek MPEG-TS'e dayanır, ancak aynı şey RTMP için de yapılabilir.
Dinamik çalma listesi için aşağıdaki formatta çok sayıda giriş noktası listesi içeren bir çalma listesi dosyası oluşturun:
file 'item_1.ts'
file 'item_2.ts'
file 'item_3.ts'
[...]
file 'item_[ENOUGH_FOR_A_LIFETIME].ts'
Bu dosyalar sadece yer tutucudur.
Mevcut çalma listesi dizinini takip eden ve
current_index + 1 için anında sembolik bağlantılar oluşturan bir komut dosyası oluşturun
ln -s /path/to/what/to/play/next.ts item_1.ts
ln -s /path/to/what/to/play/next.ts item_2.ts
ln -s /path/to/what/to/play/next.ts item_3.ts
[...]
ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port> oynamaya başlayın
Kızgın bir sistem yöneticisi tarafından takip edilip isimleri alın
Döngünüzü bir ara belleğe yönlendirebilir ve bu arabellekten akış örneğinize yönlendirebilirsiniz.
Shell'de şöyle görünürdü:
#!/bin/bash for i in *.mp4; do ffmpeg -hide_banner -nostats -i "$i" -c:v mpeg2video [proper settings] -f mpegts - done | mbuffer -q -c -m 20000k | ffmpeg -hide_banner -nostats -re -fflags +igndts -thread_queue_size 512 -i pipe:0 -fflags +genpts [proper codec setting] -f flv rtmp://127.0.0.1/live/stream
Elbette, herhangi bir tür döngüyü, ayrıca bir oynatma listesini kullanarak da kullanabilirsiniz.
Python tabanlı bir çözüm üzerinde çalışıyorum, henüz tamamlanmadı, ancak bazı uyarılar dışında test akışım birkaç gün sürüyor:
Bu bir xml çalma listesi formatı kullanır. Ve Çalma Listesi dinamiktir, bu şekilde her zaman geçerli çalma listesini düzenleyebilir ve parçaları değiştirebilir veya yenilerini ekleyebilirsiniz.
İki çalma listesi dosyası oluşturmanız gerekir ve her dosyanın sonunda başka bir dosyaya bir bağlantı belirtir.
list_1.txt
ffconcat version 1.0 file 'item_1.mp4' file 'list_2.txt'
list_2.txt
ffconcat version 1.0 file 'item_2.mp4' file 'list_1.txt'
Şimdi tek ihtiyacınız olan, bir sonraki çalma listesi dosyasının içeriğini dinamik olarak değiştirmek.