web-gelistirme-sc.com

Sürekli video dosyalarını bir RTMP sunucusuna aktarmak için FFMPEG kullanma

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

21
kketch

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.

  1. 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.

  2. 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

    [...]

  3. ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port> oynamaya başlayın

  4. Kızgın bir sistem yöneticisi tarafından takip edilip isimleri alın

5
aergistal

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. 

  • Mpeg'nin biraz daha kararlı olduğunu anlıyorum, daha sonra giriş akımı için x264
  • Nedenini bilmiyorum ama, mpeg sıkıştırması için minimum 2 konu daha iyi çalışıyor
  • giriş sıkıştırmasının, çıktı kare hızından daha hızlı olması gerekir, bu nedenle yeterince hızlı yeni girdi elde ederiz.
  • Devam etmeyen zaman damgası nedeniyle onları atlamalı ve çıktıda yeni bir tane yaratmalıyız.
  • Tampon boyutunun, ilmeğin yeni klibi almak için yeterli zamanı olması için yeterince büyük olması gerekir.

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:

ffplayout

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.

1
jb_alvarado

İ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.

0
bnku