New upstream version 19.0.3+dfsg1
This commit is contained in:
parent
3708b8e092
commit
1f1bbb3518
534 changed files with 13862 additions and 2459 deletions
|
|
@ -69,6 +69,7 @@ set(obs-outputs_HEADERS
|
|||
librtmp)
|
||||
set(obs-outputs_SOURCES
|
||||
obs-outputs.c
|
||||
null-output.c
|
||||
rtmp-stream.c
|
||||
rtmp-windows.c
|
||||
flv-output.c
|
||||
|
|
|
|||
|
|
@ -3,3 +3,4 @@ RTMPStream.DropThreshold="انخفاض البداية (مللي ثانية)"
|
|||
FLVOutput="اخراج الملف بصيغة FLV"
|
||||
FLVOutput.FilePath="مسار الملف"
|
||||
|
||||
|
||||
|
|
|
|||
5
plugins/obs-outputs/data/locale/bn-BD.ini
Normal file
5
plugins/obs-outputs/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
RTMPStream="RTMP স্ট্রিম"
|
||||
RTMPStream.DropThreshold="ড্রপ সীমার (মিলিসেকেন্ড)"
|
||||
Default="পূর্ব-নির্ধারিত"
|
||||
|
||||
|
||||
|
|
@ -4,3 +4,4 @@ FLVOutput="Sortida del fitxer FLV"
|
|||
FLVOutput.FilePath="Camí del fitxer"
|
||||
Default="Per defecte"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="Výstup do FLV souboru"
|
|||
FLVOutput.FilePath="Cesta k souboru"
|
||||
Default="Výchozí"
|
||||
|
||||
ConnectionTimedOut="Vypršel časový limit připojení. Přesvědčte se, zda jste správně nastavili vysílací službu a že žádná brána firewall neblokuje připojení."
|
||||
PermissionDenied="Připojení bylo zablokováno. Zkontrolujte, zda má OBS povolen přístup k internetu v nastavení své brány firewall / antiviru."
|
||||
ConnectionAborted="Připojení bylo přerušeno. Toto obvykle znamená, že nastaly problémy s připojením mezi vámi a vysílací službou."
|
||||
ConnectionReset="Připojení bylo resetováno druhou stranou. Toto obvykle znamená, že nastaly problémy s připojením mezi vámi a vysílací službou."
|
||||
HostNotFound="Hostitel nebyl nalezen. Zkontrolujte, zda jste zadali správný vysílací server a že vaše připojení k internetu / DNS funguje jak má."
|
||||
NoData="Hostitel byl nalezen, ale žádná data požadovaného typu. Toto se může stát, pokud používáte IPv6 adresu, ale vaše vysílací služba podporuje pouze připojení přes svou IPv4 adresu (viz. Nastavení / Rozšířené)."
|
||||
AddressNotAvailable="Adresa není k dispozici. Možná jste se snažili použít chybnou IP adresu (viz. Nastavení / Rozšířené)."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="FLV File Output"
|
|||
FLVOutput.FilePath="Filsti"
|
||||
Default="Standard"
|
||||
|
||||
ConnectionTimedOut="Forbindelsen fik timeout. Tjek venligst at du har opsat en gyldig streaming-tjeneste og at ingen firewall blokerer forbindelsen."
|
||||
PermissionDenied="Forbindelsen blev blokeret. Tjek venligst indstillingerne for firewall/antivirus for at sikre, at OBS har fuld adgang til Internet."
|
||||
ConnectionAborted="Forbindelsen blev afbrudt. Dette indikerer typisk et problem med Internetforbindelsen mellem dig og streaming-tjenesten."
|
||||
ConnectionReset="Forbindelsen blev afbrudt. Dette indikerer typisk et problem med Internetforbindelsen mellem dig og streaming-tjenesten."
|
||||
HostNotFound="Værtsnavn ikke fundet. Tjek at du har angivet en gyldig streaming-server, og at din Internetforbindelse/DNS fungerer korrekt."
|
||||
NoData="Værtsnavn fundet, men ingen data af den ønskede type. Dette kan forekomme, hvis du har tildelt en IPv6-adresse, og din streaming-tjeneste kun benytter IPv4-adresser (se Indstillinger/Avanceret)."
|
||||
AddressNotAvailable="Adresse utilgængelig. Du kan have forsøgt at tildele en ugyldig IP-adresse (se Indstillinger/Avanceret)."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="FLV Dateiausgabe"
|
|||
FLVOutput.FilePath="Dateipfad"
|
||||
Default="Standard"
|
||||
|
||||
ConnectionTimedOut="Zeitüberschreitung bei der Verbindung. Stellen Sie sicher, dass Sie einen gültigen Streaming-Service konfiguriert haben und keine Firewall die Verbindung blockiert."
|
||||
PermissionDenied="Die Verbindung wurde blockiert. Überprüfen Sie Ihre Firewall / Anti-Virus-Einstellungen, um sicherzustellen, dass OBS vollen Internetzugang hat."
|
||||
ConnectionAborted="Die Verbindung wurde abgebrochen. Dies bedeutet in der Regel Probleme mit der Internetverbindung zwischen Ihnen und dem Streaming-Dienst."
|
||||
ConnectionReset="Die Verbindung wurde durch Kommunikationspartner zurückgesetzt. Dies bedeutet in der Regel Probleme mit der Internetverbindung zwischen Ihnen und dem Streaming-Dienst."
|
||||
HostNotFound="Hostname nicht gefunden. Stellen Sie sicher, dass Sie einen gültigen Streaming-Server eingegeben haben und Ihre Internetverbindung / DNS korrekt arbeiten."
|
||||
NoData="Hostname gefunden, aber keine Daten des angeforderten Typs. Dies kann auftreten, wenn Sie eine IPv6-Adresse verwenden und Ihr Streaming-Dienst nur über IPv4-Adressen verfügt (siehe Einstellungen / Erweitert)."
|
||||
AddressNotAvailable="Adresse nicht Verfügbar. Sie haben möglicherweise versucht, eine ungültige IP-Adresse zu verwenden (siehe Einstellungen / Erweitert)."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,4 @@ FLVOutput="FLV Αρχείο Εξόδου"
|
|||
FLVOutput.FilePath="Διαδρομή Αρχείου"
|
||||
Default="Προεπιλογή"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,3 +3,11 @@ RTMPStream.DropThreshold="Drop Threshold (milliseconds)"
|
|||
FLVOutput="FLV File Output"
|
||||
FLVOutput.FilePath="File Path"
|
||||
Default="Default"
|
||||
|
||||
ConnectionTimedOut="The connection timed out. Make sure you've configured a valid streaming service and no firewall is blocking the connection."
|
||||
PermissionDenied="The connection was blocked. Check your firewall / anti-virus settings to make sure OBS is allowed full internet access."
|
||||
ConnectionAborted="The connection was aborted. This usually indicates internet connection problems between you and the streaming service."
|
||||
ConnectionReset="The connection was reset by the peer. This usually indicates internet connection problems between you and the streaming service."
|
||||
HostNotFound="Hostname not found. Make sure you entered a valid streaming server and your internet connection / DNS are working correctly."
|
||||
NoData="Hostname found, but no data of the requested type. This can occur if you have bound to an IPv6 address and your streaming service only has IPv4 addresses (see Settings / Advanced)."
|
||||
AddressNotAvailable="Address not available. You may have tried to bind to an invalid IP address (see Settings / Advanced)."
|
||||
|
|
|
|||
|
|
@ -4,3 +4,7 @@ FLVOutput="Archivo de salida FLV"
|
|||
FLVOutput.FilePath="Ruta de archivo"
|
||||
Default="Por defecto"
|
||||
|
||||
PermissionDenied="La conexión ha sido bloqueada. Compruebe su configuración del cortafuegos o anti-virus para asegurarse de que OBS tiene acceso completo a Internet."
|
||||
ConnectionAborted="La conexión ha sido abortada. Normalmente esto indica que hay problemas de conexión entre tu equipo y el servicio de transmisión."
|
||||
AddressNotAvailable="Dirección no disponible. Puede que hayas intentado enlazar con una dirección IP no valida (vea Configuración / Avanzado)."
|
||||
|
||||
|
|
|
|||
|
|
@ -1,2 +1,6 @@
|
|||
RTMPStream="RTMP voogedastus"
|
||||
FLVOutput="FLV faili väljund"
|
||||
FLVOutput.FilePath="Faili tee"
|
||||
Default="Vaikeseade"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="FLV irteera fitxategia"
|
|||
FLVOutput.FilePath="Fitxategiaren bidea"
|
||||
Default="Lehenetsia"
|
||||
|
||||
ConnectionTimedOut="Konexiorik ez dago. Begiratu baliozko transmisio zerbitzua ezarrita duzun eta inongo suebakirik ez duen konexioa galarazten ari."
|
||||
PermissionDenied="Konexioa blokeatuta dago. Begiratu zure suebakiaren / antibirusaren ezarpenak egiaztatzeko OBSek Internetera konektatzeko baimena duela."
|
||||
ConnectionAborted="Konexioa galarazita dago. Transmisioaren zerbitzurekin konektatzeko arazoak izaten dira ohiko arrazoiak."
|
||||
ConnectionReset="Pareak berrezarri du konexioa. Transmisioaren zerbitzurekin konektatzeko arazoak izaten dira ohiko arrazoiak."
|
||||
HostNotFound="Ez da ostalari-izena topatu. Egiaztatu baliozko transmisio zerbitzaria jarri duzula eta zure Internet-konexioa eta DNSa zuzen ari direla lanean."
|
||||
NoData="Ostalari-izena topatu da baina eskatutako datu motatik batere ez. Gerta daiteke IPv6 helbide bat eskatu izana eta zure transmisio zerbitzuak bakarrik onartzea IPv4 helbideak (Ikus ezarpen aurreratuak)."
|
||||
AddressNotAvailable="Helbidea ez dago eskuragarri. Agian saiatu zara baliozkoa ez den IP helbide batera konektatzen (ikus ezarpen aurreratuak)."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="FLV-tiedosto ulostulo"
|
|||
FLVOutput.FilePath="Tiedostopolku"
|
||||
Default="Oletusarvo"
|
||||
|
||||
ConnectionTimedOut="Yhteys keskeytyi. Varmista että olet asettanut lähetyspalvelun oikein ja palomuuri ei estä yhteyttä."
|
||||
PermissionDenied="Yhteys estettiin. Tarkista palomuurin / virusturvan asetukset ja varmista, että OBS:lle on sallittu täydet yhteydet."
|
||||
ConnectionAborted="Yhteys katkaistiin. Tämä tarkoittaa yleensä yhteysongelmia sinun ja lähetyspalvelun välillä."
|
||||
ConnectionReset="Yhteys katkaistiin. Tämä tarkoittaa yleensä yhteysongelmia sinun ja lähetyspalvelun välillä."
|
||||
HostNotFound="Isäntänimeä ei löytynyt. Varmista että syötit voimassaolevan lähetyspalvelimen ja että internet-yhteytesi tai DNS-palvelimesi toimivat oikein."
|
||||
NoData="Isäntänimi löytyi, mutta ei oikeanlaista pyydettyä dataa. Näin voi tapahtua jos olet rajannut yhteytesi IPv6 -osoitteeseen ja lähetyspalvelusi tukee vain IPv4-osoitteita (Katso Asetukset / Lisäasetukset)."
|
||||
AddressNotAvailable="Osoite ei ole saatavilla. Voi olla että yritit kiinnittää väärän IP-osoitteen (Katso Asetukset / Lisäasetukset)."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,7 @@ FLVOutput="Fichier FLV sortant"
|
|||
FLVOutput.FilePath="Chemin du fichier"
|
||||
Default="Interface par défaut"
|
||||
|
||||
ConnectionTimedOut="La connexion à expiré. Assurez-vous que vous avez configuré un service de streaming valide et qu'aucun pare-feu ne bloque la connexion."
|
||||
PermissionDenied="La connexion a été bloquée. Vérifiez vos paramètres de pare-feu / antivirus pour vous assurer OBS est autorisé à avoir l'accès complet d'internet."
|
||||
ConnectionAborted="La connexion à été interrompue. Cela indique généralement des problèmes de connexion internet entre vous et le service de streaming."
|
||||
|
||||
|
|
|
|||
|
|
@ -3,3 +3,4 @@ RTMPStream.DropThreshold="Limiar (milisegundos)"
|
|||
FLVOutput="Ficheiro de saída FLV"
|
||||
FLVOutput.FilePath="Camiño do ficheiro"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2,4 +2,6 @@ RTMPStream="זרם RTMP"
|
|||
RTMPStream.DropThreshold="הורד סף (אלפיות שניה)"
|
||||
FLVOutput="קובץ פלט FLV"
|
||||
FLVOutput.FilePath="נתיב קובץ"
|
||||
Default="ברירת מחדל"
|
||||
|
||||
|
||||
|
|
|
|||
3
plugins/obs-outputs/data/locale/hi-IN.ini
Normal file
3
plugins/obs-outputs/data/locale/hi-IN.ini
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
RTMPStream="RTMP स्ट्रीम"
|
||||
|
||||
|
||||
|
|
@ -4,3 +4,4 @@ FLVOutput="Izlaz u FLV datoteku"
|
|||
FLVOutput.FilePath="Putanja datoteke"
|
||||
Default="Podrazumevani"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="FLV kimeneti fájl"
|
|||
FLVOutput.FilePath="Fájl elérési útja"
|
||||
Default="Alapértelmezett"
|
||||
|
||||
ConnectionTimedOut="A kapcsolat időtúllépés miatt megszakadt. Győződjön meg róla, hogy a beállított stream szolgáltatás érvényes és hogy, tűzfal nem blokkolja a kapcsolatot."
|
||||
PermissionDenied="A kapcsolat blokkolásra került. Ellenőrizze a tűzfal / antivírus beállításait, hogy az OBS számára engedélyezve van e a hozzáférés."
|
||||
ConnectionAborted="A kapcsolat megszakadt. Ez általában azt jelzi, hogy az internetkapcsolat a stream kiszolgáló és ön között problémákkal néz szembe."
|
||||
ConnectionReset="A kapcsolat a peer által megszakítva. Ez általában azt jelzi, hogy az internetkapcsolat a stream kiszolgáló és ön között problémákkal néz szembe."
|
||||
HostNotFound="A hostnév nem található. Győződjön meg róla, hogy érvényes stream szervert adott meg és az internetkapcsolata / DNS szerver megfelelően működik."
|
||||
NoData="Hostnév megtalálva, viszont a kért típusú állomány nem elérhető. Ez akkor fordul elő, ha IPv6 címhez van rendelve és a stream kiszolgálójának csak IPv4 címei állnak rendelkezésre (lásd: Beállítások / Haladó)."
|
||||
AddressNotAvailable="A cím nem elérhető. Valószínűleg egy érvénytelen IP címet adott meg (Lásd: Beállítások / Haladó)."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,4 @@ FLVOutput="Uscita file FLV"
|
|||
FLVOutput.FilePath="Destinazione file"
|
||||
Default="Predefinito"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="FLV ファイル出力"
|
|||
FLVOutput.FilePath="ファイルのパス"
|
||||
Default="既定"
|
||||
|
||||
ConnectionTimedOut="接続がタイムアウトしました。 有効なストリーミングサービスを設定し、ファイアウォールが接続をブロックしていないことを確認してください。"
|
||||
PermissionDenied="接続がブロックされました。 ファイアウォール/アンチウィルスの設定をチェックして、OBSにインターネットへのアクセスがすべて許可されていることを確認してください。"
|
||||
ConnectionAborted="接続は中止されました。 ストリーミングサービスとの間のインターネット接続に問題があることを示しています。"
|
||||
ConnectionReset="接続はピアによってリセットされました。 ストリーミングサービスとの間のインターネット接続に問題があることを示しています。"
|
||||
HostNotFound="ホスト名が見つかりません。 有効なストリーミングサーバーを入力していることとインターネット接続/DNSが正しく機能していることを確認してください。"
|
||||
NoData="ホスト名が見つかりましたが、要求されたタイプのデータがありません。 これはIPv6アドレスにバインドしている状態でストリーミングサービスにIPv4アドレスしかない場合に発生します。 (設定 / 詳細設定 を参照)"
|
||||
AddressNotAvailable="アドレスを利用できません。 無効なIPアドレスにバインドしようとした可能性があります。 (設定 / 詳細設定 を参照)"
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="FLV 파일 출력"
|
|||
FLVOutput.FilePath="파일 경로"
|
||||
Default="기본값"
|
||||
|
||||
ConnectionTimedOut="연결 시간이 초과하였습니다. 방송 정보가 정확히 입력되었는지 확인하고, 방화벽 때문에 연결에 문제가 있는지 점검하십시오."
|
||||
PermissionDenied="연결이 차단되었습니다. 방화벽이나 백신 설정에서 OBS의 인터넷 연결을 가로막고 있는지 확인하십시오."
|
||||
ConnectionAborted="연결이 취소되었습니다. 보통 사용자와 방송 서비스 간의 연결 상태에 문제가 있음을 의미합니다."
|
||||
ConnectionReset="상호 연결 문제로 초기화되었습니다. 보통 사용자와 방송 서비스 간의 연결 상태에 문제가 있음을 의미합니다."
|
||||
HostNotFound="호스트 이름을 찾을 수 없습니다. 방송 서버 정보가 제대로 입력되었는지 확인하고, 인터넷 접속 혹은 DNS가 제대로 작동하고 있는지 점검하십시오."
|
||||
NoData="호스트 이름은 찾았지만 요청한 형식의 데이터가 없습니다. 이 문제는 보통 사용자가 IPv6 형식의 주소를 고정하여 사용하면서 IPv4 형식의 주소만 지원하는 방송 서비스에 접속을 시도한 경우 나타납니다 (설정 / 고급 창을 확인하십시오)."
|
||||
AddressNotAvailable="주소를 사용할 수 없습니다. 잘못된 IP주소를 고정하고 있습니다 (설정 / 고급 창을 확인하십시오)."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,4 @@ FLVOutput="FLV-filutgang"
|
|||
FLVOutput.FilePath="Filbane"
|
||||
Default="Standard"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="FLV Bestandsuitvoer"
|
|||
FLVOutput.FilePath="Bestandspad"
|
||||
Default="Standaard"
|
||||
|
||||
ConnectionTimedOut="Er is een time-out opgetreden in de verbinding. Controleer dat je een geldige streaming service hebt ingesteld en dat er geen firewall de verbinding blokkeert."
|
||||
PermissionDenied="De verbinding was geblokkeerd. Controleer je firewall/anti-virus instellingen om te controleren dat OBS volledige internettoegang heeft."
|
||||
ConnectionAborted="De verbinding was afgebroken. Dit duidt meestal op verbindingsproblemen tussen jou en de streaming service."
|
||||
ConnectionReset="De verbinding was gereset door de andere partij. Dit duidt meestal op verbindingsproblemen tussen jou en de streaming service."
|
||||
HostNotFound="Hostname niet gevonden. Controleer dat je een geldige streaming service hebt ingevuld en dat je internetverbinding / DNS correct werken."
|
||||
NoData="Hostname gevonden, maar geen data van het verwachte type. Dit kan gebeuren als je aan een IPv6 adres hebt gebonden, en je streaming service alleen IPv4 adressen heeft (zie Instellingen / Geavanceerd)."
|
||||
AddressNotAvailable="Adres niet beschikbaar. Je hebt misschien geprobeerd om aan een ongeldig IP adres te binden (zie Instellingen / Geavanceerd)."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="Wyjście do pliku FLV"
|
|||
FLVOutput.FilePath="Scieżka do pliku"
|
||||
Default="Domyślne"
|
||||
|
||||
ConnectionTimedOut="Upłynął limit czasu połączenia. Upewnij się, że usługa strumieniowania jest poprawnie skonfigurowana a zapora internetowa nie blokuje połączenia."
|
||||
PermissionDenied="Połączenie zostało zablokowane. Sprawdź stan zapory internetowej / ustawienia antywirusowe, aby upewnić się, że OBS ma pełny dostęp do internetu."
|
||||
ConnectionAborted="Połączenie zostało przerwane. Wskazuje to najczęściej na problemy w połączeniu między Tobą a usługą strumieniowania."
|
||||
ConnectionReset="Połączenie zostało przerwane po stronie serwera. Wskazuje to najczęściej na problemy w połączeniu między Tobą a usługą strumieniowania."
|
||||
HostNotFound="Nie znaleziono nazwy hosta. Upewnij się, że wprowadzono prawidłowe dane serwera przesyłania strumieniowego i połączenie z internetem / DNS są poprawne."
|
||||
NoData="Nazwa serwera została znaleziona ale nie stwierdzono poprawności odbieranych danych. Dzieje się tak najczęściej po przypisaniu aplikacji do adresu IPv6, gdy usługa strumieniowania obsługuje jedynie adresy IPv4 (zobacz Ustawienia -> Zaawansowane)."
|
||||
AddressNotAvailable="Adres IP niedostępny. Być może powiązano aplikację z nieprawidłowym adresem IP (zobacz Ustawienia -> Zaawansowane)."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="Arquivo de Saída FLV"
|
|||
FLVOutput.FilePath="Caminho do Arquivo"
|
||||
Default="Padrão"
|
||||
|
||||
ConnectionTimedOut="A conexão expirou. Verifique se você configurou um serviço de transmissão válido e nenhum firewall está bloqueando a conexão."
|
||||
PermissionDenied="A conexão foi bloqueada. Verifique seu firewall / configurações de antivírus para certificar-se do acesso completo do OBS à internet."
|
||||
ConnectionAborted="A conexão foi abortada. Isso geralmente indica problemas de conexão entre você e o serviço de transmissão."
|
||||
ConnectionReset="A conexão foi redefinida pelo usuário. Isso geralmente indica problemas de conexão entre você e o serviço de transmissão."
|
||||
HostNotFound="Host não encontrado. Verifique se você inseriu um servidor válido de transmissão e se sua conexão de internet / DNS estão funcionando corretamente."
|
||||
NoData="Host encontrado, mas não há dados do tipo solicitado. Isso pode ocorrer se você tiver vinculado a um endereço IPv6 e seu serviço de transmissão tem apenas endereços IPv4 (consulte Configurações / Avançado)."
|
||||
AddressNotAvailable="Endereço não disponível. Você pode ter tentado se vincular a um endereço IP inválido (consulte Configurações / Avançado)."
|
||||
|
||||
|
|
|
|||
|
|
@ -3,3 +3,4 @@ RTMPStream.DropThreshold="Limite de corte (milissegundos)"
|
|||
FLVOutput="Ficheiro de saída FLV"
|
||||
FLVOutput.FilePath="Caminho do ficheiro"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,3 +3,4 @@ RTMPStream.DropThreshold="Prag de pierderi (milisecunde)"
|
|||
FLVOutput="Ieșire fișier FLV"
|
||||
FLVOutput.FilePath="Calea fișierului"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,4 @@ FLVOutput="Выходной файл FLV"
|
|||
FLVOutput.FilePath="Путь к файлу"
|
||||
Default="По умолчанию"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,3 +3,4 @@ FLVOutput="Výstup do súboru FLV"
|
|||
FLVOutput.FilePath="Cesta k súboru"
|
||||
Default="Základné"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,3 +3,4 @@ RTMPStream.DropThreshold="Raven Padca (milisekunde)"
|
|||
FLVOutput="Izhod datoteke FLV"
|
||||
FLVOutput.FilePath="Pot datoteke"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,4 @@ FLVOutput="Izlaz u FLV datoteku"
|
|||
FLVOutput.FilePath="Putanja datoteke"
|
||||
Default="Podrazumevani"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,4 @@ FLVOutput="Излаз у FLV датотеку"
|
|||
FLVOutput.FilePath="Путања датотеке"
|
||||
Default="Подразумевана"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,10 @@ FLVOutput="FLV-filutmatning"
|
|||
FLVOutput.FilePath="Sökväg"
|
||||
Default="Standard"
|
||||
|
||||
ConnectionTimedOut="Anslutningen förlorades. Se till att du har konfigurerat en giltig strömningstjänst och att inga brandväggar blockerar anslutningen."
|
||||
PermissionDenied="Anslutningen blockerades. Kontrollera inställningarna för din brandvägg/antivirusprogram för att se till att OBS har fullständig åtkomst till Internet."
|
||||
ConnectionAborted="Anslutningen avbröts. Detta kan indikera problem med Internetanslutningen mellan dig och strömningstjänsten."
|
||||
HostNotFound="Värdnamnet hittades inte. Se till att du har angivit en giltigt strömningstjänst och att din Internetanslutning / DNS fungerar på rätt sätt."
|
||||
NoData="Värdnamnet hittades, men ingen data av den begärda typen. Detta kan hända om du ansluter till en IPv6-adress och din strömningstjänst endast har IPv4-adresser (gå till Inställningar / Avancerat)."
|
||||
AddressNotAvailable="Adressen är inte tillgänglig. Du kanske försökte ansluta till en ogiltig IP-adress (gå till Inställningar / Avancerat)."
|
||||
|
||||
|
|
|
|||
|
|
@ -1,2 +1,3 @@
|
|||
FLVOutput.FilePath="ตำแหน่งไฟล์"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="FLV Dosyası Çıkışı"
|
|||
FLVOutput.FilePath="Dosya Yolu"
|
||||
Default="Varsayılan"
|
||||
|
||||
ConnectionTimedOut="Bağlantı zaman aşımına uğradı. Geçerli bir yayın servisi yapılandırdığınızdan ve bağlantıyı engelleyen bir güvenlik duvarı olmadığından emin olun."
|
||||
PermissionDenied="Bağlantı engellendi. Güvenlik duvarı / virüs koruma ayarlarınızı OBS'ye tam internet erişimi verildiğinden emin olmak için kontrol edin."
|
||||
ConnectionAborted="Bağlantı iptal edildi. Bu genellikle sizin ve yayın servisinin arasındaki internet bağlantısı sorununa işaret eder."
|
||||
ConnectionReset="Bağlantı karşı taraftan sıfırlandı. Bu genellikle sizin ve yayın servisinin arasındaki internet bağlantısı sorununa işaret eder."
|
||||
HostNotFound="Ana bilgisayar adı bulunamadı. Geçerli bir yayın sunucusu girdiğinizden ve internet bağlantınızın / DNS'nizin düzgün çalıştığını emin olun."
|
||||
NoData="Ana bilgisayar adı bulundu, ancak istenen türde veri bulunamadı. Bu bir IPv6 adresine bağlamış ve yayın servisinizin sadece IPv4 adresleri varsa oluşabilir (bkz: Ayarlar / Gelişmiş)."
|
||||
AddressNotAvailable="Adres kullanılamaz. Geçersiz bir IP adresi bağlamayı denemiş olabilirsiniz (bakın: Ayarlar / Gelişmiş)."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="Вивід FLV файлу"
|
|||
FLVOutput.FilePath="Шлях до файлу"
|
||||
Default="За замовчанням"
|
||||
|
||||
ConnectionTimedOut="Вичерпано час підключення. Переконайтеся, що ви вказали правильний сервіс трансляцій і брандмауер не блокує з'єднання."
|
||||
PermissionDenied="З'єднання було заблоковано. Перевірте налаштування вашого брандмауеру / антивірусу, щоб переконатися, що OBS має повний доступ до Інтернету."
|
||||
ConnectionAborted="З'єднання було перервано. Зазвичай свідчить про проблеми з Інтернет підключенням між вами і постачальником з сервісу трансляцій."
|
||||
ConnectionReset="З'єднання було скинуте рівноправним вузлом (reset by peer). Зазвичай свідчить про проблеми з Інтернет підключенням між вами і постачальником з сервісу трансляцій."
|
||||
HostNotFound="Ім'я хоста, не знайдено. Переконайтеся, що ви ввели дійсний сервер трансляцій і підключення до Інтернету / DNS працює правильно."
|
||||
NoData="Ім'я хоста знайдено, але нема жодних даних вказаного типу. Це може статися, якщо ви вказали прив'язку до IPv6-адресу, але ваш сервіс трансляцій підтримує лише адреси IPv4 (див. Налаштування / Розширені)."
|
||||
AddressNotAvailable="Адреса недоступна. Напевно ви спробували прив'язатись до адаптера з неіснуючую IP-адресою (див. Налаштування / Розширені)."
|
||||
|
||||
|
|
|
|||
3
plugins/obs-outputs/data/locale/ur-PK.ini
Normal file
3
plugins/obs-outputs/data/locale/ur-PK.ini
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
RTMPStream="رٹمپ اسٹریم"
|
||||
|
||||
|
||||
|
|
@ -1,3 +1,12 @@
|
|||
RTMPStream="RTMP Stream"
|
||||
RTMPStream.DropThreshold="Drop Threshold (mili giây)"
|
||||
FLVOutput="FLV tập tin đầu ra"
|
||||
FLVOutput.FilePath="Đường dẫn tệp"
|
||||
Default="Mặc định"
|
||||
|
||||
PermissionDenied="Kết nối đã bị chặn. Hãy kiểm tra tường lửa / cài đặt chống virus để đảm bảo rằng OBS được cho phép truy cập internet đầy đủ."
|
||||
ConnectionAborted="Kết nối đã bị hủy bỏ. Điều này thường chỉ ra kết nối internet giữa bạn và dịch vụ trực tuyến có vấn đề."
|
||||
HostNotFound="Tên máy chủ không tìm thấy. Đảm bảo rằng bạn đã nhập vào một máy chủ stream hợp lệ và kết nối internet của bạn / DNS đang hoạt động tốt."
|
||||
NoData="Tên máy chủ được tìm thấy nhưng không có dữ liệu được yêu cầu. Điều này có thể xảy ra nếu bạn sử dụng địa chỉ IPv6 và dịch vụ stream của bạn chỉ có địa chỉ IPv4 (xem Cài đặt / Nâng cao)."
|
||||
AddressNotAvailable="Địa chỉ không có sẵn. Bạn có thể đã cố gắng liên kết với một địa chỉ IP không hợp lệ (xem Cài đặt / Nâng cao)."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="FLV 文件输出"
|
|||
FLVOutput.FilePath="文件路径"
|
||||
Default="默认"
|
||||
|
||||
ConnectionTimedOut="连接超时. 请确保您已经配置了一个有效的流媒体服务并且没有防火墙阻止连接."
|
||||
PermissionDenied="连接被阻止. 检查您的防火墙 / 防病毒设置以确保允许 OBS 自由访问互联网."
|
||||
ConnectionAborted="连接被中止. 这通常表明你和流媒体服务之间的互联网连接问题."
|
||||
ConnectionReset="对方重置连接. 这通常表明你和流媒体服务之间的互联网连接问题."
|
||||
HostNotFound="找不到 Hostname. 请确保您输入一个有效的流媒体服务器并且您的互联网连接 / DNS 工作正常."
|
||||
NoData="Hostname 发现, 但没有请求的类型的数据的主机名. 这有可能因为你绑定到 IPv6 地址并且你的流媒体服务仅有 IPv4 地址 (请参阅设置 / 高级)."
|
||||
AddressNotAvailable="没有可用的地址. 你可能在试图绑定到一个无效的 IP 地址 (请参阅设置 / 高级)."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,3 +4,11 @@ FLVOutput="FLV 檔案輸出"
|
|||
FLVOutput.FilePath="檔案路徑"
|
||||
Default="預設"
|
||||
|
||||
ConnectionTimedOut="連線逾時。請確定已經設定了一個有效的串流服務並且沒有防火牆在阻擋連接。"
|
||||
PermissionDenied="連線被阻擋。請檢查防火牆 / 防毒設定以確保 OBS 有完整的網際網路存取權限。"
|
||||
ConnectionAborted="連線被中止。通常這代表您與串流服務之間有網際網路連線問題。"
|
||||
ConnectionReset="連線被對方重置。通常這代表您與串流服務之間有網際網路連線問題。"
|
||||
HostNotFound="找不到主機名稱。請確定輸入了一個有效的串流服務器且網路連線跟 DNS 工作正常。"
|
||||
NoData="找到主機名稱,但沒有要求類型的資料。這可能發生在您綁定於 IPv6 位址但串流服務只有 IPv4 位址 (請看 設定/進階)。"
|
||||
AddressNotAvailable="位址不可用。可能因為嘗試綁定到一個不正確 IP 位址(請確認 設定/進階 的設定)。"
|
||||
|
||||
|
|
|
|||
|
|
@ -208,7 +208,7 @@ static void flv_video(struct serializer *s, struct encoder_packet *packet,
|
|||
s_wb24(s, get_ms_time(packet, offset));
|
||||
s_write(s, packet->data, packet->size);
|
||||
|
||||
/* write tag size (starting byte doesnt count) */
|
||||
/* write tag size (starting byte doesn't count) */
|
||||
s_wb32(s, (uint32_t)serializer_get_pos(s) + 4 - 1);
|
||||
}
|
||||
|
||||
|
|
@ -241,7 +241,7 @@ static void flv_audio(struct serializer *s, struct encoder_packet *packet,
|
|||
s_w8(s, is_header ? 0 : 1);
|
||||
s_write(s, packet->data, packet->size);
|
||||
|
||||
/* write tag size (starting byte doesnt count) */
|
||||
/* write tag size (starting byte doesn't count) */
|
||||
s_wb32(s, (uint32_t)serializer_get_pos(s) + 4 - 1);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ int base64_encode_block(const char* plaintext_in, int length_in, char* code_out,
|
|||
result = (fragment & 0x0fc) >> 2;
|
||||
*codechar++ = base64_encode_value(result);
|
||||
result = (fragment & 0x003) << 4;
|
||||
/* Falls through. */
|
||||
case step_B:
|
||||
if (plainchar == plaintextend)
|
||||
{
|
||||
|
|
@ -59,6 +60,7 @@ int base64_encode_block(const char* plaintext_in, int length_in, char* code_out,
|
|||
result |= (fragment & 0x0f0) >> 4;
|
||||
*codechar++ = base64_encode_value(result);
|
||||
result = (fragment & 0x00f) << 2;
|
||||
/* Falls through. */
|
||||
case step_C:
|
||||
if (plainchar == plaintextend)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -32,6 +32,8 @@
|
|||
#include "rtmp_sys.h"
|
||||
#include "log.h"
|
||||
|
||||
#include <util/platform.h>
|
||||
|
||||
#ifdef CRYPTO
|
||||
|
||||
#ifdef __APPLE__
|
||||
|
|
@ -650,7 +652,7 @@ int RTMP_AddStream(RTMP *r, const char *playpath)
|
|||
}
|
||||
|
||||
static int
|
||||
add_addr_info(struct sockaddr_storage *service, socklen_t *addrlen, AVal *host, int port, socklen_t addrlen_hint)
|
||||
add_addr_info(struct sockaddr_storage *service, socklen_t *addrlen, AVal *host, int port, socklen_t addrlen_hint, int *socket_error)
|
||||
{
|
||||
char *hostname;
|
||||
int ret = TRUE;
|
||||
|
|
@ -691,6 +693,7 @@ add_addr_info(struct sockaddr_storage *service, socklen_t *addrlen, AVal *host,
|
|||
#define gai_strerrorA gai_strerror
|
||||
#endif
|
||||
RTMP_Log(RTMP_LOGERROR, "Could not resolve %s: %s (%d)", hostname, gai_strerrorA(GetSockError()), GetSockError());
|
||||
*socket_error = GetSockError();
|
||||
ret = FALSE;
|
||||
goto finish;
|
||||
}
|
||||
|
|
@ -706,23 +709,32 @@ add_addr_info(struct sockaddr_storage *service, socklen_t *addrlen, AVal *host,
|
|||
}
|
||||
}
|
||||
|
||||
if (!*addrlen)
|
||||
{
|
||||
for (ptr = result; ptr != NULL; ptr = ptr->ai_next)
|
||||
{
|
||||
if (!*addrlen)
|
||||
{
|
||||
for (ptr = result; ptr != NULL; ptr = ptr->ai_next)
|
||||
{
|
||||
if (ptr->ai_family == AF_INET6 && (!addrlen_hint || ptr->ai_addrlen == addrlen_hint))
|
||||
{
|
||||
memcpy(service, ptr->ai_addr, ptr->ai_addrlen);
|
||||
*addrlen = (socklen_t)ptr->ai_addrlen;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
memcpy(service, ptr->ai_addr, ptr->ai_addrlen);
|
||||
*addrlen = (socklen_t)ptr->ai_addrlen;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
freeaddrinfo(result);
|
||||
|
||||
if (service->ss_family == AF_UNSPEC || *addrlen == 0)
|
||||
{
|
||||
// since we're handling multiple addresses internally, fake the correct error response
|
||||
#ifdef _WIN32
|
||||
*socket_error = WSANO_DATA;
|
||||
#elif __FreeBSD__
|
||||
*socket_error = ENOATTR;
|
||||
#else
|
||||
*socket_error = ENODATA;
|
||||
#endif
|
||||
|
||||
RTMP_Log(RTMP_LOGERROR, "Could not resolve server '%s': no valid address found", hostname);
|
||||
ret = FALSE;
|
||||
goto finish;
|
||||
|
|
@ -768,11 +780,14 @@ RTMP_Connect0(RTMP *r, struct sockaddr * service, socklen_t addrlen)
|
|||
int err = GetSockError();
|
||||
RTMP_Log(RTMP_LOGERROR, "%s, failed to bind socket: %s (%d)",
|
||||
__FUNCTION__, socketerror(err), err);
|
||||
r->last_error_code = err;
|
||||
RTMP_Close(r);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t connect_start = os_gettime_ns();
|
||||
|
||||
if (connect(r->m_sb.sb_socket, service, addrlen) < 0)
|
||||
{
|
||||
int err = GetSockError();
|
||||
|
|
@ -785,10 +800,13 @@ RTMP_Connect0(RTMP *r, struct sockaddr * service, socklen_t addrlen)
|
|||
else
|
||||
RTMP_Log(RTMP_LOGERROR, "%s, failed to connect socket: %s (%d)",
|
||||
__FUNCTION__, socketerror(err), err);
|
||||
r->last_error_code = err;
|
||||
RTMP_Close(r);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
r->connect_time_ms = (int)((os_gettime_ns() - connect_start) / 1000000);
|
||||
|
||||
if (r->Link.socksport)
|
||||
{
|
||||
RTMP_Log(RTMP_LOGDEBUG, "%s ... SOCKS negotiation", __FUNCTION__);
|
||||
|
|
@ -906,6 +924,8 @@ RTMP_Connect(RTMP *r, RTMPPacket *cp)
|
|||
struct sockaddr_storage service;
|
||||
socklen_t addrlen = 0;
|
||||
socklen_t addrlen_hint = 0;
|
||||
int socket_error = 0;
|
||||
|
||||
if (!r->Link.hostname.av_len)
|
||||
return FALSE;
|
||||
|
||||
|
|
@ -914,6 +934,7 @@ RTMP_Connect(RTMP *r, RTMPPacket *cp)
|
|||
h = gethostbyname("localhost");
|
||||
if (!h && GetLastError() == WSAHOST_NOT_FOUND)
|
||||
{
|
||||
r->last_error_code = WSAHOST_NOT_FOUND;
|
||||
RTMP_Log(RTMP_LOGERROR, "RTMP_Connect: Connection test failed. This error is likely caused by Comodo Internet Security running OBS in sandbox mode. Please add OBS to the Comodo automatic sandbox exclusion list, restart OBS and try again (11001).");
|
||||
return FALSE;
|
||||
}
|
||||
|
|
@ -927,14 +948,20 @@ RTMP_Connect(RTMP *r, RTMPPacket *cp)
|
|||
if (r->Link.socksport)
|
||||
{
|
||||
/* Connect via SOCKS */
|
||||
if (!add_addr_info(&service, &addrlen, &r->Link.sockshost, r->Link.socksport, addrlen_hint))
|
||||
if (!add_addr_info(&service, &addrlen, &r->Link.sockshost, r->Link.socksport, addrlen_hint, &socket_error))
|
||||
{
|
||||
r->last_error_code = socket_error;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Connect directly */
|
||||
if (!add_addr_info(&service, &addrlen, &r->Link.hostname, r->Link.port, addrlen_hint))
|
||||
if (!add_addr_info(&service, &addrlen, &r->Link.hostname, r->Link.port, addrlen_hint, &socket_error))
|
||||
{
|
||||
r->last_error_code = socket_error;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!RTMP_Connect0(r, (struct sockaddr *)&service, addrlen))
|
||||
|
|
@ -951,9 +978,10 @@ SocksNegotiate(RTMP *r)
|
|||
unsigned long addr;
|
||||
struct sockaddr_storage service;
|
||||
socklen_t addrlen = 0;
|
||||
int socket_error = 0;
|
||||
memset(&service, 0, sizeof(service));
|
||||
|
||||
add_addr_info(&service, &addrlen, &r->Link.hostname, r->Link.port, 0);
|
||||
add_addr_info(&service, &addrlen, &r->Link.hostname, r->Link.port, 0, &socket_error);
|
||||
|
||||
// not doing IPv6 socks
|
||||
if (service.ss_family == AF_INET6)
|
||||
|
|
@ -1436,6 +1464,8 @@ WriteN(RTMP *r, const char *buffer, int n)
|
|||
if (sockerr == EINTR && !RTMP_ctrlC)
|
||||
continue;
|
||||
|
||||
r->last_error_code = sockerr;
|
||||
|
||||
RTMP_Close(r);
|
||||
n = 1;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -324,6 +324,8 @@ extern "C"
|
|||
RTMPPacket m_write;
|
||||
RTMPSockBuf m_sb;
|
||||
RTMP_LNK Link;
|
||||
int connect_time_ms;
|
||||
int last_error_code;
|
||||
} RTMP;
|
||||
|
||||
int RTMP_ParseURL(const char *url, int *protocol, AVal *host,
|
||||
|
|
|
|||
99
plugins/obs-outputs/null-output.c
Normal file
99
plugins/obs-outputs/null-output.c
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
/******************************************************************************
|
||||
Copyright (C) 2017 by Hugh Bailey <obs.jim@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
******************************************************************************/
|
||||
|
||||
#include <util/threading.h>
|
||||
#include <obs-module.h>
|
||||
|
||||
struct null_output {
|
||||
obs_output_t *output;
|
||||
|
||||
pthread_t stop_thread;
|
||||
bool stop_thread_active;
|
||||
};
|
||||
|
||||
static const char *null_output_getname(void *unused)
|
||||
{
|
||||
UNUSED_PARAMETER(unused);
|
||||
return "Null Encoding Output";
|
||||
}
|
||||
|
||||
static void *null_output_create(obs_data_t *settings, obs_output_t *output)
|
||||
{
|
||||
struct null_output *context = bzalloc(sizeof(*context));
|
||||
context->output = output;
|
||||
UNUSED_PARAMETER(settings);
|
||||
return context;
|
||||
}
|
||||
|
||||
static void null_output_destroy(void *data)
|
||||
{
|
||||
struct null_output *context = data;
|
||||
if (context->stop_thread_active)
|
||||
pthread_join(context->stop_thread, NULL);
|
||||
bfree(context);
|
||||
}
|
||||
|
||||
static bool null_output_start(void *data)
|
||||
{
|
||||
struct null_output *context = data;
|
||||
|
||||
if (!obs_output_can_begin_data_capture(context->output, 0))
|
||||
return false;
|
||||
if (!obs_output_initialize_encoders(context->output, 0))
|
||||
return false;
|
||||
|
||||
if (context->stop_thread_active)
|
||||
pthread_join(context->stop_thread, NULL);
|
||||
|
||||
obs_output_begin_data_capture(context->output, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void *stop_thread(void *data)
|
||||
{
|
||||
struct null_output *context = data;
|
||||
obs_output_end_data_capture(context->output);
|
||||
context->stop_thread_active = false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void null_output_stop(void *data, uint64_t ts)
|
||||
{
|
||||
struct null_output *context = data;
|
||||
UNUSED_PARAMETER(ts);
|
||||
|
||||
context->stop_thread_active = pthread_create(&context->stop_thread,
|
||||
NULL, stop_thread, data) == 0;
|
||||
}
|
||||
|
||||
static void null_output_data(void *data, struct encoder_packet *packet)
|
||||
{
|
||||
struct null_output *context = data;
|
||||
UNUSED_PARAMETER(packet);
|
||||
}
|
||||
|
||||
struct obs_output_info null_output_info = {
|
||||
.id = "null_output",
|
||||
.flags = OBS_OUTPUT_AV |
|
||||
OBS_OUTPUT_ENCODED,
|
||||
.get_name = null_output_getname,
|
||||
.create = null_output_create,
|
||||
.destroy = null_output_destroy,
|
||||
.start = null_output_start,
|
||||
.stop = null_output_stop,
|
||||
.encoded_packet = null_output_data
|
||||
};
|
||||
|
|
@ -9,6 +9,7 @@ OBS_DECLARE_MODULE()
|
|||
OBS_MODULE_USE_DEFAULT_LOCALE("obs-outputs", "en-US")
|
||||
|
||||
extern struct obs_output_info rtmp_output_info;
|
||||
extern struct obs_output_info null_output_info;
|
||||
extern struct obs_output_info flv_output_info;
|
||||
|
||||
bool obs_module_load(void)
|
||||
|
|
@ -19,6 +20,7 @@ bool obs_module_load(void)
|
|||
#endif
|
||||
|
||||
obs_register_output(&rtmp_output_info);
|
||||
obs_register_output(&null_output_info);
|
||||
obs_register_output(&flv_output_info);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -378,6 +378,64 @@ static inline bool can_shutdown_stream(struct rtmp_stream *stream,
|
|||
return timeout || packet->sys_dts_usec >= (int64_t)stream->stop_ts;
|
||||
}
|
||||
|
||||
static void set_output_error(struct rtmp_stream *stream)
|
||||
{
|
||||
const char *msg = NULL;
|
||||
#ifdef _WIN32
|
||||
switch (stream->rtmp.last_error_code)
|
||||
{
|
||||
case WSAETIMEDOUT:
|
||||
msg = obs_module_text("ConnectionTimedOut");
|
||||
break;
|
||||
case WSAEACCES:
|
||||
msg = obs_module_text("PermissionDenied");
|
||||
break;
|
||||
case WSAECONNABORTED:
|
||||
msg = obs_module_text("ConnectionAborted");
|
||||
break;
|
||||
case WSAECONNRESET:
|
||||
msg = obs_module_text("ConnectionReset");
|
||||
break;
|
||||
case WSAHOST_NOT_FOUND:
|
||||
msg = obs_module_text("HostNotFound");
|
||||
break;
|
||||
case WSANO_DATA:
|
||||
msg = obs_module_text("NoData");
|
||||
break;
|
||||
case WSAEADDRNOTAVAIL:
|
||||
msg = obs_module_text("AddressNotAvailable");
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (stream->rtmp.last_error_code)
|
||||
{
|
||||
case ETIMEDOUT:
|
||||
msg = obs_module_text("ConnectionTimedOut");
|
||||
break;
|
||||
case EACCES:
|
||||
msg = obs_module_text("PermissionDenied");
|
||||
break;
|
||||
case ECONNABORTED:
|
||||
msg = obs_module_text("ConnectionAborted");
|
||||
break;
|
||||
case ECONNRESET:
|
||||
msg = obs_module_text("ConnectionReset");
|
||||
break;
|
||||
case HOST_NOT_FOUND:
|
||||
msg = obs_module_text("HostNotFound");
|
||||
break;
|
||||
case NO_DATA:
|
||||
msg = obs_module_text("NoData");
|
||||
break;
|
||||
case EADDRNOTAVAIL:
|
||||
msg = obs_module_text("AddressNotAvailable");
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
obs_output_set_last_error(stream->output, msg);
|
||||
}
|
||||
|
||||
static void *send_thread(void *data)
|
||||
{
|
||||
struct rtmp_stream *stream = data;
|
||||
|
|
@ -428,6 +486,7 @@ static void *send_thread(void *data)
|
|||
stream->rtmp.m_bCustomSend = false;
|
||||
}
|
||||
|
||||
set_output_error(stream);
|
||||
RTMP_Close(&stream->rtmp);
|
||||
|
||||
if (!stopping(stream)) {
|
||||
|
|
@ -571,8 +630,10 @@ static int init_send(struct rtmp_stream *stream)
|
|||
int one = 1;
|
||||
#ifdef _WIN32
|
||||
if (ioctlsocket(stream->rtmp.m_sb.sb_socket, FIONBIO, &one)) {
|
||||
stream->rtmp.last_error_code = WSAGetLastError();
|
||||
#else
|
||||
if (ioctl(stream->rtmp.m_sb.sb_socket, FIONBIO, &one)) {
|
||||
stream->rtmp.last_error_code = errno;
|
||||
#endif
|
||||
warn("Failed to set non-blocking socket");
|
||||
return OBS_OUTPUT_ERROR;
|
||||
|
|
@ -644,6 +705,7 @@ static int init_send(struct rtmp_stream *stream)
|
|||
if (!send_meta_data(stream, idx++, &next)) {
|
||||
warn("Disconnected while attempting to connect to "
|
||||
"server.");
|
||||
set_output_error(stream);
|
||||
return OBS_OUTPUT_DISCONNECTED;
|
||||
}
|
||||
}
|
||||
|
|
@ -718,7 +780,7 @@ static int try_connect(struct rtmp_stream *stream)
|
|||
|
||||
info("Connecting to RTMP URL %s...", stream->path.array);
|
||||
|
||||
memset(&stream->rtmp.Link, 0, sizeof(stream->rtmp.Link));
|
||||
RTMP_Init(&stream->rtmp);
|
||||
if (!RTMP_SetupURL(&stream->rtmp, stream->path.array))
|
||||
return OBS_OUTPUT_BAD_PATH;
|
||||
|
||||
|
|
@ -767,8 +829,11 @@ static int try_connect(struct rtmp_stream *stream)
|
|||
win32_log_interface_type(stream);
|
||||
#endif
|
||||
|
||||
if (!RTMP_Connect(&stream->rtmp, NULL))
|
||||
if (!RTMP_Connect(&stream->rtmp, NULL)) {
|
||||
set_output_error(stream);
|
||||
return OBS_OUTPUT_CONNECT_FAILED;
|
||||
}
|
||||
|
||||
if (!RTMP_ConnectStream(&stream->rtmp, 0))
|
||||
return OBS_OUTPUT_INVALID_STREAM;
|
||||
|
||||
|
|
@ -798,7 +863,6 @@ static bool init_connect(struct rtmp_stream *stream)
|
|||
os_atomic_set_bool(&stream->disconnected, false);
|
||||
stream->total_bytes_sent = 0;
|
||||
stream->dropped_frames = 0;
|
||||
stream->min_drop_dts_usec= 0;
|
||||
stream->min_priority = 0;
|
||||
|
||||
settings = obs_output_get_settings(stream->output);
|
||||
|
|
@ -876,7 +940,6 @@ static inline bool add_packet(struct rtmp_stream *stream,
|
|||
{
|
||||
circlebuf_push_back(&stream->packets, packet,
|
||||
sizeof(struct encoder_packet));
|
||||
stream->last_dts_usec = packet->dts_usec;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -886,7 +949,7 @@ static inline size_t num_buffered_packets(struct rtmp_stream *stream)
|
|||
}
|
||||
|
||||
static void drop_frames(struct rtmp_stream *stream, const char *name,
|
||||
int highest_priority, int64_t *p_min_dts_usec)
|
||||
int highest_priority, bool pframes)
|
||||
{
|
||||
struct circlebuf new_buf = {0};
|
||||
uint64_t last_drop_dts_usec = 0;
|
||||
|
|
@ -922,8 +985,8 @@ static void drop_frames(struct rtmp_stream *stream, const char *name,
|
|||
|
||||
if (stream->min_priority < highest_priority)
|
||||
stream->min_priority = highest_priority;
|
||||
|
||||
*p_min_dts_usec = last_drop_dts_usec;
|
||||
if (!num_frames_dropped)
|
||||
return;
|
||||
|
||||
stream->dropped_frames += num_frames_dropped;
|
||||
#ifdef _DEBUG
|
||||
|
|
@ -934,6 +997,23 @@ static void drop_frames(struct rtmp_stream *stream, const char *name,
|
|||
#endif
|
||||
}
|
||||
|
||||
static bool find_first_video_packet(struct rtmp_stream *stream,
|
||||
struct encoder_packet *first)
|
||||
{
|
||||
size_t count = stream->packets.size / sizeof(*first);
|
||||
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
struct encoder_packet *cur = circlebuf_data(&stream->packets,
|
||||
i * sizeof(*first));
|
||||
if (cur->type == OBS_ENCODER_VIDEO && !cur->keyframe) {
|
||||
*first = *cur;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void check_to_drop_frames(struct rtmp_stream *stream, bool pframes)
|
||||
{
|
||||
struct encoder_packet first;
|
||||
|
|
@ -942,9 +1022,6 @@ static void check_to_drop_frames(struct rtmp_stream *stream, bool pframes)
|
|||
const char *name = pframes ? "p-frames" : "b-frames";
|
||||
int priority = pframes ?
|
||||
OBS_NAL_PRIORITY_HIGHEST : OBS_NAL_PRIORITY_HIGH;
|
||||
int64_t *p_min_dts_usec = pframes ?
|
||||
&stream->pframe_min_drop_dts_usec :
|
||||
&stream->min_drop_dts_usec;
|
||||
int64_t drop_threshold = pframes ?
|
||||
stream->pframe_drop_threshold_usec :
|
||||
stream->drop_threshold_usec;
|
||||
|
|
@ -955,10 +1032,7 @@ static void check_to_drop_frames(struct rtmp_stream *stream, bool pframes)
|
|||
return;
|
||||
}
|
||||
|
||||
circlebuf_peek_front(&stream->packets, &first, sizeof(first));
|
||||
|
||||
/* do not drop frames if frames were just dropped within this time */
|
||||
if (first.dts_usec < *p_min_dts_usec)
|
||||
if (!find_first_video_packet(stream, &first))
|
||||
return;
|
||||
|
||||
/* if the amount of time stored in the buffered packets waiting to be
|
||||
|
|
@ -972,7 +1046,7 @@ static void check_to_drop_frames(struct rtmp_stream *stream, bool pframes)
|
|||
|
||||
if (buffer_duration_usec > drop_threshold) {
|
||||
debug("buffer_duration_usec: %" PRId64, buffer_duration_usec);
|
||||
drop_frames(stream, name, priority, p_min_dts_usec);
|
||||
drop_frames(stream, name, priority, pframes);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -991,6 +1065,7 @@ static bool add_video_packet(struct rtmp_stream *stream,
|
|||
stream->min_priority = 0;
|
||||
}
|
||||
|
||||
stream->last_dts_usec = packet->dts_usec;
|
||||
return add_packet(stream, packet);
|
||||
}
|
||||
|
||||
|
|
@ -1090,6 +1165,12 @@ static float rtmp_stream_congestion(void *data)
|
|||
return stream->min_priority > 0 ? 1.0f : stream->congestion;
|
||||
}
|
||||
|
||||
static int rtmp_stream_connect_time(void *data)
|
||||
{
|
||||
struct rtmp_stream *stream = data;
|
||||
return stream->rtmp.connect_time_ms;
|
||||
}
|
||||
|
||||
struct obs_output_info rtmp_output_info = {
|
||||
.id = "rtmp_output",
|
||||
.flags = OBS_OUTPUT_AV |
|
||||
|
|
@ -1106,5 +1187,6 @@ struct obs_output_info rtmp_output_info = {
|
|||
.get_properties = rtmp_stream_properties,
|
||||
.get_total_bytes = rtmp_stream_total_bytes_sent,
|
||||
.get_congestion = rtmp_stream_congestion,
|
||||
.get_connect_time_ms= rtmp_stream_connect_time,
|
||||
.get_dropped_frames = rtmp_stream_dropped_frames
|
||||
};
|
||||
|
|
|
|||
|
|
@ -72,9 +72,7 @@ struct rtmp_stream {
|
|||
|
||||
/* frame drop variables */
|
||||
int64_t drop_threshold_usec;
|
||||
int64_t min_drop_dts_usec;
|
||||
int64_t pframe_drop_threshold_usec;
|
||||
int64_t pframe_min_drop_dts_usec;
|
||||
int min_priority;
|
||||
float congestion;
|
||||
|
||||
|
|
|
|||
|
|
@ -81,6 +81,7 @@ static bool socket_event(struct rtmp_stream *stream, bool *can_write,
|
|||
"Socket error, recv() returned "
|
||||
"%d, GetLastError() %d",
|
||||
ret, err_code);
|
||||
stream->rtmp.last_error_code = err_code;
|
||||
fatal_sock_shutdown(stream);
|
||||
return false;
|
||||
}
|
||||
|
|
@ -215,6 +216,7 @@ static enum data_ret write_data(struct rtmp_stream *stream, bool *can_write,
|
|||
ret, err_code);
|
||||
|
||||
pthread_mutex_unlock(&stream->write_buf_mutex);
|
||||
stream->rtmp.last_error_code = err_code;
|
||||
fatal_sock_shutdown(stream);
|
||||
return RET_FATAL;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue