Imported Upstream version 0.14.2+dfsg1

This commit is contained in:
Sebastian Ramacher 2016-05-24 21:53:01 +02:00
parent fb3990e9e5
commit 41a01dbf05
529 changed files with 25112 additions and 2336 deletions

View file

@ -16,6 +16,7 @@ set(obs-ffmpeg_HEADERS
set(obs-ffmpeg_SOURCES
obs-ffmpeg.c
obs-ffmpeg-aac.c
obs-ffmpeg-nvenc.c
obs-ffmpeg-output.c
obs-ffmpeg-mux.c
obs-ffmpeg-source.c)

View file

@ -1,6 +1,27 @@
FFmpegOutput="مخرج FFmpeg"
FFmpegAAC="ترميز AAC الافتراضي لـFFmpeg"
Bitrate="معدل النقل"
Preset="الإعداد المسبق"
NVENC.Preset.default="الإفتراضي"
NVENC.Preset.hq="جودة عالية"
NVENC.Preset.hp="أداء عالي"
NVENC.Preset.bd="بلوراي Bluray"
NVENC.Level="المستوى"
FFmpegSource="مصدر وسائط"
LocalFile="ملف محلي"
Looping="تكرار حلقي"
Advanced="متقدم"
DiscardNone="لا شيء"
ColorRange="نطاق ألوان YUV"
ColorRange.Auto="تلقائي"
ColorRange.Partial="جزئي"
ColorRange.Full="كامل"
MediaFileFilter.AllMediaFiles="كافة ملفات الوسائط"
MediaFileFilter.VideoFiles="ملفات الفيديو"
MediaFileFilter.AudioFiles="ملفات الصوت"
MediaFileFilter.AllFiles="‮كل الملفات"

View file

@ -3,3 +3,5 @@ Bitrate="Битрейт"

View file

@ -1,6 +1,20 @@
FFmpegOutput="Sortida FFmpeg"
FFmpegAAC="Codificador FFmpeg AAC predeterminat"
Bitrate="Taxa de bits"
Preset="Valors predefinits"
RateControl="Control de freqüència"
KeyframeIntervalSec="Interval de fotograma clau (en segons, 0 = automàtic)"
Lossless="Sense pèrdues"
NVENC.Use2Pass="Utilitza codificació en dues passades"
NVENC.Preset.default="Per defecte"
NVENC.Preset.hq="Alta Qualitat"
NVENC.Preset.hp="Alt rendiment"
NVENC.Preset.bd="BluRay"
NVENC.Preset.ll="Latencia baixa"
NVENC.Preset.llhq="Latència baixa Alta Qualitat"
NVENC.Preset.llhp="Latència baixa alt rendiment"
NVENC.Level="Nivell"
FFmpegSource="Font multimèdia"
LocalFile="Fitxer local"
@ -21,5 +35,15 @@ DiscardBiDir="Quadres bidireccionals"
DiscardNonIntra="Quadres no-interiors"
DiscardNonKey="Quadres no-clau"
DiscardAll="Tots els marcs (aneu amb compte!)"
RestartWhenActivated="Reinicia la reproducció quan la font estigui activa"
ColorRange="Gamma de color YUV"
ColorRange.Auto="Automàtic"
ColorRange.Partial="Parcial"
ColorRange.Full="Màxim"
MediaFileFilter.AllMediaFiles="Tots els arxius multimèdia"
MediaFileFilter.VideoFiles="Arxius de vídeo"
MediaFileFilter.AudioFiles="Arxius d'àudio"
MediaFileFilter.AllFiles="Tots els fitxers"

View file

@ -1,6 +1,20 @@
FFmpegOutput="Výstup FFmpegu"
FFmpegAAC="Výchozí FFmpeg AAC enkodér"
Bitrate="Bitrate"
Preset="Předvolba"
RateControl="Řízení toku"
KeyframeIntervalSec="Interval klíč. snímků (vteřiny, 0=auto)"
Lossless="Lossless"
NVENC.Use2Pass="Použít dvoustupňové enkódování"
NVENC.Preset.default="Výchozí"
NVENC.Preset.hq="Vysoká kvalita"
NVENC.Preset.hp="Vysoký výkon"
NVENC.Preset.bd="Bluray"
NVENC.Preset.ll="Nízká odezva"
NVENC.Preset.llhq="Nízká odezva, vysoká kvalita"
NVENC.Preset.llhp="Nízká odezva, vysoký výkon"
NVENC.Level="Úrověň"
FFmpegSource="Médium"
LocalFile="Místní soubor"
@ -22,6 +36,11 @@ DiscardNonIntra="Snímky mimo rámec"
DiscardNonKey="Ne-klíčové snímky"
DiscardAll="Všechny snímky (Pozor!)"
RestartWhenActivated="Restartovat přehrávání poté, co je zdroj aktivován"
ColorRange="Rozsah barev YUV"
ColorRange.Auto="Automatický"
ColorRange.Partial="Částečný"
ColorRange.Full="Celkový"
MediaFileFilter.AllMediaFiles="Všechny mediální soubory"
MediaFileFilter.VideoFiles="Video soubory"

View file

@ -2,6 +2,7 @@ FFmpegOutput="FFmpeg Output"
FFmpegAAC="FFmpeg Standard AAC Encoder"
Bitrate="Bitrate"
FFmpegSource="Mediekilde"
LocalFile="Lokal fil"
Looping="Gentagelse"
@ -19,3 +20,4 @@ DiscardNonKey="Non-Key Frames"
DiscardAll="Alle frames (pas på!)"

View file

@ -1,6 +1,20 @@
FFmpegOutput="FFmpeg Ausgabe"
FFmpegAAC="FFmpeg Standard AAC Encoder"
Bitrate="Bitrate"
Preset="Voreinstellung"
RateControl="Qualitäts Regulierungsmethode"
KeyframeIntervalSec="Keyframeintervall (Sekunden, 0=auto)"
Lossless="Verlustfrei"
NVENC.Use2Pass="Benutze Two-Pass Encoding"
NVENC.Preset.default="Standard"
NVENC.Preset.hq="Hohe Qualität"
NVENC.Preset.hp="Hohe Leistung"
NVENC.Preset.bd="Bluray"
NVENC.Preset.ll="Niedrige Latenz"
NVENC.Preset.llhq="Niedrige Latenz, Hohe Qualität"
NVENC.Preset.llhp="Niedrige Latenz, Hohe Leistung"
NVENC.Level="Level"
FFmpegSource="Medienquelle"
LocalFile="Lokale Datei"
@ -22,6 +36,11 @@ DiscardNonIntra="Non-Intra Frames"
DiscardNonKey="Non-Key Frames"
DiscardAll="Alle Frames (Vorsicht!)"
RestartWhenActivated="Wiedergabe erneut starten, wenn Quelle aktiviert wird"
ColorRange="YUV-Farbmatrix"
ColorRange.Auto="Automatisch"
ColorRange.Partial="Teilweise"
ColorRange.Full="Voll"
MediaFileFilter.AllMediaFiles="Alle Mediendateien"
MediaFileFilter.VideoFiles="Video-Dateien"

View file

@ -2,6 +2,7 @@ FFmpegOutput="Έξοδος FFmpeg"
FFmpegAAC="FFmpeg προεπιλεγμένος κωδικοποιητής AAC"
Bitrate="Ρυθμός μετάδοσης bit"
LocalFile="Τοπικό αρχείο"
Looping="Επανάληψη"
Input="Είσοδος"
@ -16,3 +17,4 @@ DiscardDefault="Προεπιλογή (άκυρα πακέτα)"
DiscardAll="Όλα τα καρέ (Προσοχή!)"

View file

@ -1,6 +1,20 @@
FFmpegOutput="FFmpeg Output"
FFmpegAAC="FFmpeg Default AAC Encoder"
Bitrate="Bitrate"
Preset="Preset"
RateControl="Rate Control"
KeyframeIntervalSec="Keyframe Interval (seconds, 0=auto)"
Lossless="Lossless"
NVENC.Use2Pass="Use Two-Pass Encoding"
NVENC.Preset.default="Default"
NVENC.Preset.hq="High Quality"
NVENC.Preset.hp="High Performance"
NVENC.Preset.bd="Bluray"
NVENC.Preset.ll="Low-Latency"
NVENC.Preset.llhq="Low-Latency High Quality"
NVENC.Preset.llhp="Low-Latency High Performance"
NVENC.Level="Level"
FFmpegSource="Media Source"
LocalFile="Local File"
@ -22,6 +36,11 @@ DiscardNonIntra="Non-Intra Frames"
DiscardNonKey="Non-Key Frames"
DiscardAll="All Frames (Careful!)"
RestartWhenActivated="Restart playback when source becomes active"
ColorRange="YUV Color Range"
ColorRange.Auto="Auto"
ColorRange.Partial="Partial"
ColorRange.Full="Full"
MediaFileFilter.AllMediaFiles="All Media Files"
MediaFileFilter.VideoFiles="Video Files"

View file

@ -1,6 +1,20 @@
FFmpegOutput="Salida de FFmpeg"
FFmpegAAC="Codificador AAC FFmpeg predeterminado"
Bitrate="Tasa de bits"
Preset="Preajuste"
RateControl="Control de la frecuencia"
KeyframeIntervalSec="Intervalo de keyframes (segundos, 0=auto)"
Lossless="Sin pérdidas"
NVENC.Use2Pass="Usar codificación en dos pasadas"
NVENC.Preset.default="Por defecto"
NVENC.Preset.hq="Alta Calidad"
NVENC.Preset.hp="Alto rendimiento"
NVENC.Preset.bd="BluRay"
NVENC.Preset.ll="Baja latencia"
NVENC.Preset.llhq="Baja latencia alta calidad"
NVENC.Preset.llhp="Baja latencia alto rendimiento"
NVENC.Level="Nivel"
FFmpegSource="Fuente multimedia"
LocalFile="Archivo local"
@ -22,6 +36,11 @@ DiscardNonIntra="Fotogramas no intra-frame"
DiscardNonKey="Fotogramas no claves"
DiscardAll="Todos los fotogramas (¡Cuidado!)"
RestartWhenActivated="Reiniciar la reproducción cuando la fuente esté activa"
ColorRange="Gama de Color YUV"
ColorRange.Auto="Automatico"
ColorRange.Partial="Parcial"
ColorRange.Full="Completo"
MediaFileFilter.AllMediaFiles="Todos los archivos multimedia"
MediaFileFilter.VideoFiles="Archivos de vídeo"

View file

@ -1,30 +1,49 @@
FFmpegOutput="FFmpeg Irteera"
FFmpegAAC="FFmpeg Berezko AAC Kodeatzailea"
Bitrate="Bitneurria"
FFmpegOutput="FFmpeg irteera"
FFmpegAAC="FFmpeg lehenetsitako AAC Kodetzailea"
Bitrate="Bit-tasa"
Preset="Aurrezarpena"
RateControl="Tasaren kontrola"
KeyframeIntervalSec="Gako-fotogramen tartea (segundoak, 0=auto)"
Lossless="Galerarik gabe"
FFmpegSource="Multimedia Iturburua"
LocalFile="Tokiko Agiria"
Looping="Onartu begizta"
NVENC.Use2Pass="Erabili bi urratseko kodeketa"
NVENC.Preset.default="Lehenetsia"
NVENC.Preset.hq="Kalitate handia"
NVENC.Preset.hp="Eraginkortasun handia"
NVENC.Preset.bd="Bluray"
NVENC.Preset.ll="Latentzia txikia"
NVENC.Preset.llhq="Latentzia txikia kalitate handia"
NVENC.Preset.llhp="Latentzia txikia eraginkortasun handia"
NVENC.Level="Maila"
FFmpegSource="Multimedia iturburua"
LocalFile="Tokiko fitxategia"
Looping="Begizta"
Input="Sarrera"
InputFormat="Sarrera Heuskarria"
ForceFormat="Behartu heuskarri bihurketa"
HardwareDecode="Erabili hardware dekodeaketa eskuragarri dagoenean"
ClearOnMediaEnd="Ezkutatu iturburua irakurketa amaitutakoan"
InputFormat="Sarrera formatua"
ForceFormat="Behartu formatu-bihurketa"
HardwareDecode="Erabili hardware deskodeketa eskuragarri dagoenean"
ClearOnMediaEnd="Ezkutatu iturburua erreprodukzioa amaitzean"
Advanced="Aurreratua"
AudioBufferSize="Audio Buffer Neurria (frameak)"
VideoBufferSize="Bideo Buffer Neurria (frameak)"
FrameDropping="Frame Erortze Maila"
AudioBufferSize="Audio-bufferraren tamaina (fotogramak)"
VideoBufferSize="Bideo-bufferraren tamaina (fotogramak)"
FrameDropping="Fotogramen erorketa maila"
DiscardNone="Ezer ez"
DiscardDefault="Berezkoa (Pakete Baliogabeak)"
DiscardNonRef="Ez-Xehetasun Frameak"
DiscardBiDir="Bi-Norabideko Frameak"
DiscardNonIntra="Ez-Intra Frameak"
DiscardNonKey="Ez-Giltza Frameak"
DiscardAll="Frame Guztiak (Kontuz!)"
RestartWhenActivated="Berrabiarazi irakurketa iturburua gaitua bihurtzerakoan"
DiscardDefault="Lehenetsia (pakete baliogabeak)"
DiscardNonRef="Erreferentziarik gabeko fotogramak"
DiscardBiDir="Norabide biko fotogramak"
DiscardNonIntra="Non-Intra fotogramak"
DiscardNonKey="Gakoa ez diren fotogramak"
DiscardAll="Fotograma guztiak (kontuz!)"
RestartWhenActivated="Berrabiarazi erreprodukzioa iturburua aktiboa dagoenean"
ColorRange="YUV kolore-barrutia"
ColorRange.Auto="Auto"
ColorRange.Partial="Partziala"
ColorRange.Full="Osoa"
MediaFileFilter.AllMediaFiles="Multimedia Agiri Guztiak"
MediaFileFilter.VideoFiles="Bideo Agiriak"
MediaFileFilter.AudioFiles="Audio Agiriak"
MediaFileFilter.AllFiles="Agiri Guztiak"
MediaFileFilter.AllMediaFiles="Multimedia-fitxategi guztiak"
MediaFileFilter.VideoFiles="Bideo-fitxategiak"
MediaFileFilter.AudioFiles="Audio-fitxategiak"
MediaFileFilter.AllFiles="Fitxategi guztiak"

View file

@ -1,6 +1,20 @@
FFmpegOutput="FFmpeg ulostulo"
FFmpegAAC="FFmpeg oletus AAC-enkooderi"
Bitrate="Bitrate"
Preset="Esiasetus"
RateControl="Nopeudensäädin"
KeyframeIntervalSec="Keyframe-väli (sec, 0=auto)"
Lossless="Häviötön"
NVENC.Use2Pass="Käytä kaksivaiheista enkoodausta"
NVENC.Preset.default="Oletusarvo"
NVENC.Preset.hq="Korkea laatu"
NVENC.Preset.hp="Korkea suorituskyky"
NVENC.Preset.bd="Bluray"
NVENC.Preset.ll="Alhainen latenssi"
NVENC.Preset.llhq="Alhainen latenssi, korkea laatu"
NVENC.Preset.llhp="Alhainen latenssi, korkea suorituskyky"
NVENC.Level="Taso"
FFmpegSource="Lisää media"
LocalFile="Paikallinen tiedosto"
@ -22,6 +36,11 @@ DiscardNonIntra="Non-Intra Frames"
DiscardNonKey="Non-Key Frames"
DiscardAll="All Frames (Varoitus!)"
RestartWhenActivated="Aloita toisto uudelleen kun lähde aktivoituu"
ColorRange="YUV värialue"
ColorRange.Auto="Automaattinen"
ColorRange.Partial="Osittainen"
ColorRange.Full="Täysi"
MediaFileFilter.AllMediaFiles="Kaikki mediatiedostot"
MediaFileFilter.VideoFiles="Videotiedostot"

View file

@ -1,6 +1,20 @@
FFmpegOutput="Sortie FFmpeg"
FFmpegAAC="Encodeur AAC FFmpeg par défaut"
Bitrate="Débit"
Preset="Préréglage"
RateControl="Contrôle du débit"
KeyframeIntervalSec="Intervalle d'image-clé (en secondes, 0 = auto)"
Lossless="Sans perte"
NVENC.Use2Pass="Utiliser l'encodage double passe"
NVENC.Preset.default="Défaut"
NVENC.Preset.hq="Haute qualité"
NVENC.Preset.hp="Haute performance"
NVENC.Preset.bd="Blu-ray"
NVENC.Preset.ll="Faible latence"
NVENC.Preset.llhq="Faible latence haute qualité"
NVENC.Preset.llhp="Faible latence haute performance"
NVENC.Level="Niveau"
FFmpegSource="Source média"
LocalFile="Fichier local"
@ -22,6 +36,11 @@ DiscardNonIntra="Images non-intra"
DiscardNonKey="Images non-clés"
DiscardAll="Toutes les images (Attention !)"
RestartWhenActivated="Reprendre la lecture quand la source est active"
ColorRange="Gamme de couleurs YUV"
ColorRange.Auto="Auto"
ColorRange.Partial="Partielle"
ColorRange.Full="Complète"
MediaFileFilter.AllMediaFiles="Tous les fichiers multimédias"
MediaFileFilter.VideoFiles="Fichiers vidéo"

View file

@ -2,6 +2,8 @@ FFmpegOutput="Saída de FFmpeg"
FFmpegAAC="Codificador AAC FFmpeg predefinido"
Bitrate="Velocidade de bits"
NVENC.Level="Nivel"
FFmpegSource="Fonte multimedia"
LocalFile="Ficheiro local"
Looping="Bucle"
@ -21,3 +23,4 @@ DiscardBiDir="Marcos bidireccionais"
DiscardAll="Todos os marcos (con tino!)"

View file

@ -0,0 +1,32 @@
FFmpegOutput="פלט FFmpeg"
FFmpegAAC="FFmpeg מקודד AAC ברירת מחדל"
Bitrate="קצב ביטים"
FFmpegSource="מקור מדיה"
LocalFile="קובץ מקומי"
Looping="לולאה"
Input="קלט"
InputFormat="תבנית קלט"
ForceFormat="כפה המרת תבנית"
HardwareDecode="השתמש בפענוח חומרה כאשר היא זמין"
ClearOnMediaEnd="הסתר את מקור כאשר ההשמעה מסתיימת"
Advanced="מתקדם"
AudioBufferSize="גודל מאגר שמע (פריימים)"
VideoBufferSize="גודל מאגר הווידאו (פריימים)"
FrameDropping="רמת נשירת פריימים"
DiscardNone="ללא"
DiscardDefault="ברירת מחדל (מנות לא חוקיות)"
DiscardNonRef="פריימים לא יחס"
DiscardBiDir="פריימים דו-כיוונים"
DiscardNonIntra="פריימים לא ביינים"
DiscardNonKey="מסגרות שאינן מפתח"
DiscardAll="כל הפריימים (זהירות!)"
RestartWhenActivated="הפעל מחדש השמעה כאשר מקור הופך לפעיל"
MediaFileFilter.AllMediaFiles="כל קבצי המדיה"
MediaFileFilter.VideoFiles="קבצי וידאו"
MediaFileFilter.AudioFiles="קבצי אודיו"
MediaFileFilter.AllFiles="כל הקבצים"

View file

@ -1,6 +1,18 @@
FFmpegOutput="FFmpeg izlaz"
FFmpegAAC="FFmpeg podrazumevani AAC enkoder"
Bitrate="Protok"
Preset="Šablon"
KeyframeIntervalSec="Interval ključnih frejmova (sekunde, 0=automatski)"
NVENC.Use2Pass="Koristi enkoding duplog prolaza"
NVENC.Preset.default="Podrazumevani"
NVENC.Preset.hq="Visoki kvalitet"
NVENC.Preset.hp="Visoke performanse"
NVENC.Preset.bd="Bluray"
NVENC.Preset.ll="Nisko kašnjenje"
NVENC.Preset.llhq="Visoki kvalitet niskog kašnjenja"
NVENC.Preset.llhp="Visoke performanse niskog kašnjenja"
NVENC.Level="Nivo"
FFmpegSource="Medija izvor"
LocalFile="Lokalna datoteka"
@ -22,6 +34,11 @@ DiscardNonIntra="Ne-intra frejmovi"
DiscardNonKey="Frejmovi koji nisu ključni"
DiscardAll="Svi frejmovi (oprezno!)"
RestartWhenActivated="Ponovi reprodukciju kada izvor postane aktivan"
ColorRange="YUV opseg boja"
ColorRange.Auto="Automatski"
ColorRange.Partial="Delimični"
ColorRange.Full="Potpuni"
MediaFileFilter.AllMediaFiles="Sve medija datoteke"
MediaFileFilter.VideoFiles="Video datoteke"

View file

@ -1,30 +1,49 @@
FFmpegOutput="FFmpeg Kimenet"
FFmpegOutput="FFmpeg kimenet"
FFmpegAAC="FFmpeg alapértelmezett AAC kódoló"
Bitrate="Bitráta"
Preset="Készlet"
RateControl="Sebesség Vezérlés"
KeyframeIntervalSec="Kulcsképkocka időköze (másodperc, 0=auto)"
Lossless="Veszteségmentes"
FFmpegSource="Média Forrás"
LocalFile="Helyi Fájl"
NVENC.Use2Pass="Kétmenetes kódolás"
NVENC.Preset.default="Alapértelmezett"
NVENC.Preset.hq="Kiváló minőség"
NVENC.Preset.hp="Nagy teljesítmény"
NVENC.Preset.bd="BluRay"
NVENC.Preset.ll="Alacsony-késleltetés"
NVENC.Preset.llhq="Alacsony-késleltetés kiváló minőséggel"
NVENC.Preset.llhp="Alacsony-késleltetés nagy teljesítménnyel"
NVENC.Level="Szint"
FFmpegSource="Médiaforrás"
LocalFile="Helyi fájl"
Looping="Ismétlés"
Input="Bemenet"
InputFormat="Bemeneti Formátum"
InputFormat="Bemeneti formátum"
ForceFormat="Formátum átváltás kényszerítése"
HardwareDecode="Hardveres dekódolás használata, ha rendelkezésre áll"
ClearOnMediaEnd="Forrás elrejtése a lejátszás végeztével"
Advanced="Haladó"
AudioBufferSize="Audio Puffer Méret (képkockák)"
VideoBufferSize="Video Puffer Méret (képkockák)"
FrameDropping="Képkocka Ejtésszint"
AudioBufferSize="Audio pufferméret (képkockák)"
VideoBufferSize="Video pufferméret (képkockák)"
FrameDropping="Képkocka ejtésszint"
DiscardNone="Semmi"
DiscardDefault="Alapértelmezett (Érvénytelen Csomagok)"
DiscardNonRef="Nem Referencia Kockák"
DiscardBiDir="Kétirányú Kockák"
DiscardNonIntra="Nem Belső Kockák"
DiscardNonKey="Nem Kulcskockák"
DiscardAll="Összes Kocka (Óvatosan!)"
DiscardDefault="Alapértelmezett (érvénytelen csomagok)"
DiscardNonRef="Nem referencia kockák"
DiscardBiDir="Kétirányú kockák"
DiscardNonIntra="Nem belső kockák"
DiscardNonKey="Nem kulcskockák"
DiscardAll="Összes kocka (óvatosan!)"
RestartWhenActivated="Lejátszás újraindítása, ha a forrás aktivizálódik"
ColorRange="YUV színtartomány"
ColorRange.Auto="Auto"
ColorRange.Partial="Részleges"
ColorRange.Full="Teljes"
MediaFileFilter.AllMediaFiles="Minden Média Fájl"
MediaFileFilter.VideoFiles="Video Fájlok"
MediaFileFilter.AudioFiles="Hang Fájlok"
MediaFileFilter.AllFiles="Minden Fájl"
MediaFileFilter.AllMediaFiles="Minden médiafájl"
MediaFileFilter.VideoFiles="Videofájlok"
MediaFileFilter.AudioFiles="Hangfájlok"
MediaFileFilter.AllFiles="Minden fájl"

View file

@ -2,6 +2,7 @@ FFmpegOutput="Uscita FFmpeg"
FFmpegAAC="Codificatore FFmpeg predefinito AAC"
Bitrate="Bitrate"
FFmpegSource="Origine multimediale"
LocalFile="File locale"
Looping="Ripeti"
@ -21,5 +22,7 @@ DiscardBiDir="Frame bi-direzionali"
DiscardNonIntra="Frame non interposti"
DiscardNonKey="Frame non di chiave"
DiscardAll="Tutti i Frame (opzione per utenti più esperti)"
RestartWhenActivated="Riattiva playback quando la fonte torna attiva"

View file

@ -1,6 +1,20 @@
FFmpegOutput="FFmpeg の出力"
FFmpegAAC="FFmpeg 既定のAAC エンコーダ"
FFmpegAAC="FFmpeg 既定のAAC エンコーダ"
Bitrate="ビットレート"
Preset="プリセット"
RateControl="レート制御"
KeyframeIntervalSec="キーフレーム間隔 (秒, 0=自動)"
Lossless="無損失"
NVENC.Use2Pass="2パスエンコードを使用"
NVENC.Preset.default="既定"
NVENC.Preset.hq="高品質"
NVENC.Preset.hp="高性能"
NVENC.Preset.bd="ブルーレイ"
NVENC.Preset.ll="低遅延"
NVENC.Preset.llhq="低遅延高品質"
NVENC.Preset.llhp="低遅延高性能"
NVENC.Level="レベル"
FFmpegSource="メディアソース"
LocalFile="ローカルファイル"
@ -11,17 +25,22 @@ ForceFormat="強制的にフォーマットを変換"
HardwareDecode="可能な場合ハードウェアデコードを使用"
ClearOnMediaEnd="再生終了時にソースを非表示にする"
Advanced="高度な設定"
AudioBufferSize="音声バッファーサイズ(フレーム)"
VideoBufferSize="映像バッファーサイズ(フレーム)"
AudioBufferSize="音声バッファーサイズ (フレーム)"
VideoBufferSize="映像バッファーサイズ (フレーム)"
FrameDropping="フレームドロップレベル"
DiscardNone="なし"
DiscardDefault="既定(無効なパケット)"
DiscardDefault="既定 (無効なパケット)"
DiscardNonRef="非参照フレーム"
DiscardBiDir="双方向フレーム"
DiscardNonIntra="非イントラフレーム"
DiscardNonKey="非キーフレーム"
DiscardAll="すべてのフレーム(注意!)"
DiscardAll="すべてのフレーム (注意!)"
RestartWhenActivated="ソースがアクティブになったときに再生を再開する"
ColorRange="YUV 色範囲"
ColorRange.Auto="自動"
ColorRange.Partial="一部"
ColorRange.Full="全部"
MediaFileFilter.AllMediaFiles="すべてのメディアファイル"
MediaFileFilter.VideoFiles="ビデオファイル"

View file

@ -1,6 +1,20 @@
FFmpegOutput="FFmpeg 출력"
FFmpegAAC="FFmpeg 기본 AAC 인코더"
Bitrate="비트레이트"
Preset="사전 설정"
RateControl="데이터율 제어"
KeyframeIntervalSec="키프레임 간격 (초 단위, 0=자동)"
Lossless="무손실"
NVENC.Use2Pass="2 패스 인코딩 사용"
NVENC.Preset.default="기본"
NVENC.Preset.hq="우수한 품질"
NVENC.Preset.hp="우수한 성능"
NVENC.Preset.bd="블루레이"
NVENC.Preset.ll="낮은 지연 시간"
NVENC.Preset.llhq="낮은 지연 시간 우수한 품질"
NVENC.Preset.llhp="낮은 지연 시간 우수한 성능"
NVENC.Level="수준"
FFmpegSource="미디어 소스"
LocalFile="로컬 파일"
@ -22,6 +36,11 @@ DiscardNonIntra="비 내부 프레임"
DiscardNonKey="비 키 프레임"
DiscardAll="모든 프레임 (주의!)"
RestartWhenActivated="소스가 활성화될 때 재생을 다시 시작"
ColorRange="YUV 색상 범위"
ColorRange.Auto="자동"
ColorRange.Partial="부분"
ColorRange.Full="전체"
MediaFileFilter.AllMediaFiles="모든 미디어 파일"
MediaFileFilter.VideoFiles="비디오 파일"

View file

@ -2,6 +2,7 @@ FFmpegOutput="FFmpeg utdata"
FFmpegAAC="Standard FFmpeg AAC-koder"
Bitrate="Bitrate"
FFmpegSource="Mediekilde"
LocalFile="Lokal fil"
Looping="Repeter"
@ -23,3 +24,4 @@ DiscardNonKey="Ikkenøkkelbilder"
DiscardAll="Alle bilder (forsiktig!)"

View file

@ -1,6 +1,20 @@
FFmpegOutput="FFmpeg-uitvoer"
FFmpegAAC="FFmpeg Standaard AAC Encoder"
Bitrate="Bitrate"
Preset="Preset"
RateControl="Rate Control"
KeyframeIntervalSec="Tijd tussen keyframes (seconden, 0=auto)"
Lossless="Lossless"
NVENC.Use2Pass="Gebruik two-pass encoding"
NVENC.Preset.default="Standaard"
NVENC.Preset.hq="Hoge kwaliteit"
NVENC.Preset.hp="Hoge prestaties"
NVENC.Preset.bd="Blu-ray"
NVENC.Preset.ll="Lage Latency"
NVENC.Preset.llhq="Lage latency, hoge kwaliteit"
NVENC.Preset.llhp="Lage latency, hoge prestaties"
NVENC.Level="Niveau"
FFmpegSource="Mediabron"
LocalFile="Lokaal bestand"
@ -22,6 +36,11 @@ DiscardNonIntra="Niet-Intra Frames"
DiscardNonKey="Niet-Key Frames"
DiscardAll="Alle Frames (Voorzichtig!)"
RestartWhenActivated="Opnieuw starten met afspelen zodra de bron actief wordt"
ColorRange="YUV Kleurbereik"
ColorRange.Auto="Automatisch"
ColorRange.Partial="Gedeeltelijk"
ColorRange.Full="Volledig"
MediaFileFilter.AllMediaFiles="Alle mediabestanden"
MediaFileFilter.VideoFiles="Videobestanden"

View file

@ -1,6 +1,18 @@
FFmpegOutput="Wyjście FFmpeg"
FFmpegAAC="Domyślny enkoder AAC w FFmpeg"
Bitrate="Przepływność bitowa"
Preset="Profil ustawień"
KeyframeIntervalSec="Odstęp między klatkami kluczowymi (sekundy, 0=automatyczny)"
NVENC.Use2Pass="Użyj enkodowania dwuprzebiegowego"
NVENC.Preset.default="Domyślny"
NVENC.Preset.hq="Wysoka jakość"
NVENC.Preset.hp="Wysoka wydajność"
NVENC.Preset.bd="Blu-ray"
NVENC.Preset.ll="Niskie opóźnienie"
NVENC.Preset.llhq="Niskie opóźnienie - wysoka jakość"
NVENC.Preset.llhp="Niskie opóźnienie - wysoka wydajność"
NVENC.Level="Poziom"
FFmpegSource="Źródło danych"
LocalFile="Plik lokalny"
@ -22,6 +34,11 @@ DiscardNonIntra="Klatki niewewnętrzne (non-intra)"
DiscardNonKey="Klatki niekluczowe (non-key)"
DiscardAll="Wszystkie klatki (Ostrożnie!)"
RestartWhenActivated="Zrestartuj odtwarzanie, gdy źródła będą aktywne"
ColorRange="Zakres kolorów YUV"
ColorRange.Auto="Automatycznie"
ColorRange.Partial="Częściowy"
ColorRange.Full="Pełny"
MediaFileFilter.AllMediaFiles="Wszystkie pliki multimedialne"
MediaFileFilter.VideoFiles="Pliki video"

View file

@ -2,6 +2,7 @@ FFmpegOutput="Saída do FFmpeg"
FFmpegAAC="Codificador AAC Padrão do FFmpeg"
Bitrate="Taxa de Bits"
FFmpegSource="Fonte de mídia"
LocalFile="Arquivo Local"
Looping="Loop"
@ -21,5 +22,15 @@ DiscardBiDir="Frames Bi-direcionais"
DiscardNonIntra="Sem intra-frames"
DiscardNonKey="Sem keyframes"
DiscardAll="Todos os frames(cuidado!)"
RestartWhenActivated="Reiniciar reprodução quando a fonte se tornar ativa"
ColorRange="Intervalo de Cores YUV"
ColorRange.Auto="Auto"
ColorRange.Partial="Parcial"
ColorRange.Full="Completo"
MediaFileFilter.AllMediaFiles="Todos Arquivos de Mídia"
MediaFileFilter.VideoFiles="Arquivos de Vídeo"
MediaFileFilter.AudioFiles="Arquivos de Áudio"
MediaFileFilter.AllFiles="Todos os Arquivos"

View file

@ -1,6 +1,7 @@
FFmpegOutput="Saída de FFmpeg"
FFmpegAAC="FFmpeg Codificador AAC padrão"
Bitrate="Taxa de Bits (Bitrate)"
FFmpegAAC="Codificador AAC padrão do FFmpeg"
Bitrate="Bitrate"
FFmpegSource="Fonte de multimédia"
LocalFile="Ficheiro local"
@ -23,3 +24,4 @@ DiscardNonKey="Fotogramas não registados"
DiscardAll="Todos os fotogramas (cuidado!)"

View file

@ -1,30 +1,40 @@
FFmpegOutput="Ieşire FFmpeg"
FFmpegAAC="Codare AAC implicită pentru FFmpeg"
Bitrate="Bitrate"
FFmpegOutput="Ieșire FFmpeg"
FFmpegAAC="Codificator AAC implicit FFmpeg"
Bitrate="Rată de biți"
Preset="Presetare"
FFmpegSource="Sursa Media"
LocalFile="Fişier Local"
Looping="Loop/Buclă"
NVENC.Preset.default="Implicită"
NVENC.Preset.bd="Bluray"
NVENC.Level="Nivel"
FFmpegSource="Sursă media"
LocalFile="Fișier local"
Looping="Buclă"
Input="Intrare"
InputFormat="Format de intrare"
ForceFormat="Obliga conversia formatului"
HardwareDecode="Foloseste decodarea hardware cand e disponibila"
ClearOnMediaEnd="Ascunde sursă atunci când se termină redarea"
ForceFormat="Forțează conversia formatului"
HardwareDecode="Folosește decodarea hardware când este disponibilă"
ClearOnMediaEnd="Ascunde sursa atunci când se termină redarea"
Advanced="Avansat"
AudioBufferSize="Dimensiune tampon/buffer audio (cadre)"
VideoBufferSize="Dimensiune tampon/buffer video (cadre)"
FrameDropping="Nivelul de pierdere a frame-urilor"
DiscardNone="Nici unul"
DiscardDefault="Implicit (pachetele invalide)"
DiscardNonRef="Frame-urile fara referinte"
DiscardBiDir="Frame-urile Bi-directionale"
DiscardNonIntra="Frame-urile Non-Intra"
DiscardNonKey="Frame-urile Non-Key"
DiscardAll="Toate frame-urile (Atentie!)"
RestartWhenActivated="Reporniţi redarea când sursa devine activă"
AudioBufferSize="Dimensiune pentru bufferul audio (cadre)"
VideoBufferSize="Dimensiune pentru bufferul video (cadre)"
FrameDropping="Nivel de pierdere al cadrelor"
DiscardNone="Niciunul"
DiscardDefault="Implicit (Pachete invalide)"
DiscardNonRef="Cadre fără referință"
DiscardBiDir="Cadre bidirecționale"
DiscardNonIntra="Cadre non-intra"
DiscardNonKey="Cadre non-cheie"
DiscardAll="Toate cadrele (Atenție!)"
RestartWhenActivated="Repornește redarea când sursa devine activă"
ColorRange="Gamă de culori YUV"
ColorRange.Auto="Auto"
ColorRange.Partial="Parțială"
ColorRange.Full="Completă"
MediaFileFilter.AllMediaFiles="Toate fişierele Media"
MediaFileFilter.VideoFiles="Fişiere video"
MediaFileFilter.AudioFiles="Fişiere audio"
MediaFileFilter.AllFiles="Toate fişierele"
MediaFileFilter.AllMediaFiles="Toate fișierele media"
MediaFileFilter.VideoFiles="Fișiere video"
MediaFileFilter.AudioFiles="Fișiere audio"
MediaFileFilter.AllFiles="Toate fișierele"

View file

@ -1,6 +1,18 @@
FFmpegOutput="Вывод FFmpeg"
FFmpegAAC="Стандартный AAC-кодер FFmpeg"
Bitrate="Битрейт"
Preset="Пресет"
KeyframeIntervalSec="Интервал ключевых кадров (сек, 0=авто)"
NVENC.Use2Pass="Использовать двухпроходное кодирование"
NVENC.Preset.default="По умолчанию"
NVENC.Preset.hq="Высокое качество"
NVENC.Preset.hp="Высокая производительность"
NVENC.Preset.bd="Blu-ray"
NVENC.Preset.ll="Малая задержка"
NVENC.Preset.llhq="Малая задержка, высокое качество"
NVENC.Preset.llhp="Малая задержка, высокая производительность"
NVENC.Level="Уровень"
FFmpegSource="Источник медиа"
LocalFile="Локальный файл"
@ -21,6 +33,12 @@ DiscardBiDir="Двунаправленные кадры"
DiscardNonIntra="Невнутренние кадры"
DiscardNonKey="Неключевые кадры"
DiscardAll="Все кадры (осторожно!)"
RestartWhenActivated="Перезапустить воспроизведение, когда источник становится активным"
ColorRange="Цветовой диапазон YUV"
ColorRange.Auto="Автоматически"
ColorRange.Partial="Частичный"
ColorRange.Full="Полный"
MediaFileFilter.AllMediaFiles="Все медиа-файлы"
MediaFileFilter.VideoFiles="Видеофайлы"

View file

@ -2,8 +2,10 @@ FFmpegOutput="Výstup FFmpeg"
FFmpegAAC="Predvolený FFmpeg AAC enkodér"
Bitrate="Bitrate"
Looping="Slučka"
Advanced="Rozšírené"
DiscardNone="Žiadny"

View file

@ -2,6 +2,7 @@ FFmpegOutput="FFmpeg izhod"
FFmpegAAC="FFmpeg Prevzeti AAC Encoder"
Bitrate="Bitrate"
FFmpegSource="Medijski Vir"
LocalFile="Lokalna Datoteka"
Looping="Ponavljaj"
@ -23,3 +24,4 @@ DiscardNonKey="Non-Key Frames"
DiscardAll="Vse Frame (Pazite!)"

View file

@ -1,6 +1,18 @@
FFmpegOutput="FFmpeg izlaz"
FFmpegAAC="FFmpeg podrazumevani AAC enkoder"
Bitrate="Protok"
Preset="Šablon"
KeyframeIntervalSec="Interval ključnih frejmova (sekunde, 0=automatski)"
NVENC.Use2Pass="Koristi enkoding duplog prolaza"
NVENC.Preset.default="Podrazumevani"
NVENC.Preset.hq="Visoki kvalitet"
NVENC.Preset.hp="Visoke performanse"
NVENC.Preset.bd="Bluray"
NVENC.Preset.ll="Nisko kašnjenje"
NVENC.Preset.llhq="Visoki kvalitet niskog kašnjenja"
NVENC.Preset.llhp="Visoke performanse niskog kašnjenja"
NVENC.Level="Nivo"
FFmpegSource="Medija izvor"
LocalFile="Lokalna datoteka"
@ -22,6 +34,11 @@ DiscardNonIntra="Ne-intra frejmovi"
DiscardNonKey="Frejmovi koji nisu ključni"
DiscardAll="Svi frejmovi (oprezno!)"
RestartWhenActivated="Ponovi reprodukciju kada izvor postane aktivan"
ColorRange="YUV opseg boja"
ColorRange.Auto="Automatski"
ColorRange.Partial="Delimični"
ColorRange.Full="Potpuni"
MediaFileFilter.AllMediaFiles="Sve medija datoteke"
MediaFileFilter.VideoFiles="Video datoteke"

View file

@ -1,6 +1,18 @@
FFmpegOutput="FFmpeg излаз"
FFmpegAAC="FFmpeg подразумевани AAC енкодер"
Bitrate="Проток"
Preset="Шаблон"
KeyframeIntervalSec="Интервал кључних фрејмова (секунде, 0=аутоматски)"
NVENC.Use2Pass="Користи енкодинг дуплог пролаза"
NVENC.Preset.default="Подразумевани"
NVENC.Preset.hq="Високи квалитет"
NVENC.Preset.hp="Високе перформансе"
NVENC.Preset.bd="Bluray"
NVENC.Preset.ll="Ниско кашњење"
NVENC.Preset.llhq="Високи квалитет ниског кашњења"
NVENC.Preset.llhp="Високе перформансе ниског кашњења"
NVENC.Level="Ниво"
FFmpegSource="Медија извор"
LocalFile="Локална датотека"
@ -22,6 +34,11 @@ DiscardNonIntra="Не-интра фрејмови"
DiscardNonKey="Фрејмови који нису кључни"
DiscardAll="Сви фрејмови (опрезно!)"
RestartWhenActivated="Понови репродукцију када извор постане активан"
ColorRange="YUV опсег боја"
ColorRange.Auto="Аутоматски"
ColorRange.Partial="Делимични"
ColorRange.Full="Потпуни"
MediaFileFilter.AllMediaFiles="Све медија датотеке"
MediaFileFilter.VideoFiles="Видео датотеке"

View file

@ -1,6 +1,17 @@
FFmpegOutput="FFmpeg-utmatning"
FFmpegAAC="AAC-kodare (FFmpeg standard)"
Bitrate="Bithastighet"
Preset="Förinställning"
NVENC.Use2Pass="Använd tvåpassavkodning"
NVENC.Preset.default="Standard"
NVENC.Preset.hq="Hög kvalitet"
NVENC.Preset.hp="Hög prestanda"
NVENC.Preset.bd="Bluray"
NVENC.Preset.ll="Låg latens"
NVENC.Preset.llhq="Låg latens, hög kvalitet"
NVENC.Preset.llhp="Låg latens, hög prestanda"
NVENC.Level="Nivå"
FFmpegSource="Mediakälla"
LocalFile="Lokal fil"
@ -21,5 +32,15 @@ DiscardBiDir="Dubbelriktade bilder"
DiscardNonIntra="Icke-Intra bilder"
DiscardNonKey="Icke-nyckel bild"
DiscardAll="Alla bilder (Varsam!)"
RestartWhenActivated="Starta om uppspelning när källa blir aktiv"
ColorRange="YUV-färgområde"
ColorRange.Auto="Automatisk"
ColorRange.Partial="Delvis"
ColorRange.Full="Full"
MediaFileFilter.AllMediaFiles="Alla mediafiler"
MediaFileFilter.VideoFiles="Videofiler"
MediaFileFilter.AudioFiles="Ljudfiler"
MediaFileFilter.AllFiles="Alla filer"

View file

@ -2,3 +2,5 @@ Bitrate="บิตเรท"

View file

@ -1,6 +1,12 @@
FFmpegOutput="FFmpeg Çıkışı"
FFmpegAAC="FFmpeg Varsayılan AAC Kodlayıcı"
Bitrate="Bit hızı"
Preset="Ön Tanımlı"
KeyframeIntervalSec="Anahtarkare Aralığı (saniye, 0=otomatik)"
NVENC.Preset.default="Varsayılan"
NVENC.Preset.hq="Yüksek Kalite"
NVENC.Preset.hp="Yüksek Performans"
FFmpegSource="Ortam Kaynağı"
LocalFile="Yerel Dosya"
@ -23,3 +29,8 @@ DiscardNonKey="Anahtar Olmayan Kareler"
DiscardAll="Tüm Kareler (Dikkatli Olun!)"
MediaFileFilter.AllMediaFiles="Tüm Medya Dosyaları"
MediaFileFilter.VideoFiles="Video Dosyaları"
MediaFileFilter.AudioFiles="Ses Dosyaları"
MediaFileFilter.AllFiles="Tüm Dosyalar"

View file

@ -1,6 +1,20 @@
FFmpegOutput="FFmpeg 输出"
FFmpegAAC="FFmpeg 默认 AAC 编码器"
Bitrate="比特率"
Preset="预设"
RateControl="速率控制"
KeyframeIntervalSec="关键帧间隔(秒, 0=自动)"
Lossless="无损"
NVENC.Use2Pass="使用 Two-Pass 编码"
NVENC.Preset.default="默认"
NVENC.Preset.hq="高质量"
NVENC.Preset.hp="高性能"
NVENC.Preset.bd="蓝光"
NVENC.Preset.ll="低延迟"
NVENC.Preset.llhq="低延迟高质量"
NVENC.Preset.llhp="低延迟高性能"
NVENC.Level="等级"
FFmpegSource="媒体源"
LocalFile="本地文件"
@ -22,6 +36,11 @@ DiscardNonIntra="非intra帧"
DiscardNonKey="非关键帧"
DiscardAll="所有的帧(小心!)"
RestartWhenActivated="当源变为活动状态时重新启动播放"
ColorRange="YUV 颜色范围"
ColorRange.Auto="自动"
ColorRange.Partial="局部"
ColorRange.Full="全部"
MediaFileFilter.AllMediaFiles="所有媒体文件"
MediaFileFilter.VideoFiles="视频文件"

View file

@ -1,9 +1,11 @@
FFmpegOutput="FFmpeg 輸出"
FFmpegAAC="FFmpeg 預設 AAC 編碼器"
Bitrate="位元率"
Bitrate="流量"
FFmpegSource="媒體來源"
LocalFile="本機檔案"
Looping="循環"
Input="輸入"
InputFormat="輸入格式"
ForceFormat="強制格式轉換"
@ -15,5 +17,14 @@ VideoBufferSize="影像緩衝區大小 (幀)"
FrameDropping="掉幀程度"
DiscardNone="無"
DiscardDefault="預設 (無效封包)"
DiscardNonRef="非參考幀"
DiscardNonIntra="非內部框架"
DiscardNonKey="非關鍵幀"
DiscardAll="所有幀(小心!)"
MediaFileFilter.AllMediaFiles="所有媒體檔案"
MediaFileFilter.VideoFiles="影像檔"
MediaFileFilter.AudioFiles="音效檔"
MediaFileFilter.AllFiles="所有檔案"

View file

@ -17,6 +17,7 @@
#ifdef _WIN32
#include <io.h>
#include <fcntl.h>
#include <windows.h>
#define inline __inline
#endif
@ -629,7 +630,11 @@ static inline bool ffmpeg_mux_packet(struct ffmpeg_mux *ffm, uint8_t *buf,
/* ------------------------------------------------------------------------- */
#ifdef _WIN32
int wmain(int argc, wchar_t *argv_w[])
#else
int main(int argc, char *argv[])
#endif
{
struct ffm_packet_info info = {0};
struct ffmpeg_mux ffm = {0};
@ -638,6 +643,21 @@ int main(int argc, char *argv[])
int ret;
#ifdef _WIN32
char **argv;
argv = malloc(argc * sizeof(char*));
for (int i = 0; i < argc; i++) {
size_t len = wcslen(argv_w[i]);
int size;
size = WideCharToMultiByte(CP_UTF8, 0, argv_w[i], (int)len,
NULL, 0, NULL, NULL);
argv[i] = malloc(size + 1);
WideCharToMultiByte(CP_UTF8, 0, argv_w[i], (int)len, argv[i],
size + 1, NULL, NULL);
argv[i][size] = 0;
}
_setmode(_fileno(stdin), O_BINARY);
#endif
setvbuf(stderr, NULL, _IONBF, 0);
@ -660,5 +680,11 @@ int main(int argc, char *argv[])
ffmpeg_mux_free(&ffm);
resize_buf_free(&rb);
#ifdef _WIN32
for (int i = 0; i < argc; i++)
free(argv[i]);
free(argv);
#endif
return 0;
}

View file

@ -20,3 +20,6 @@
# define av_frame_free avcodec_free_frame
#endif
#if LIBAVCODEC_VERSION_MAJOR >= 57
#define av_free_packet av_packet_unref
#endif

View file

@ -21,6 +21,7 @@ static inline enum AVPixelFormat obs_to_ffmpeg_video_format(
case VIDEO_FORMAT_RGBA: return AV_PIX_FMT_RGBA;
case VIDEO_FORMAT_BGRA: return AV_PIX_FMT_BGRA;
case VIDEO_FORMAT_BGRX: return AV_PIX_FMT_BGRA;
case VIDEO_FORMAT_Y800: return AV_PIX_FMT_GRAY8;
}
return AV_PIX_FMT_NONE;
@ -37,6 +38,7 @@ static inline enum video_format ffmpeg_to_obs_video_format(
case AV_PIX_FMT_UYVY422: return VIDEO_FORMAT_UYVY;
case AV_PIX_FMT_RGBA: return VIDEO_FORMAT_RGBA;
case AV_PIX_FMT_BGRA: return VIDEO_FORMAT_BGRA;
case AV_PIX_FMT_GRAY8: return VIDEO_FORMAT_Y800;
case AV_PIX_FMT_NONE:
default: return VIDEO_FORMAT_NONE;
}

View file

@ -0,0 +1,508 @@
/******************************************************************************
Copyright (C) 2016 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/darray.h>
#include <util/dstr.h>
#include <util/base.h>
#include <media-io/video-io.h>
#include <obs-module.h>
#include <obs-avc.h>
#include <libavutil/opt.h>
#include <libavformat/avformat.h>
#include "obs-ffmpeg-formats.h"
#define do_log(level, format, ...) \
blog(level, "[NVENC encoder: '%s'] " format, \
obs_encoder_get_name(enc->encoder), ##__VA_ARGS__)
#define warn(format, ...) do_log(LOG_WARNING, format, ##__VA_ARGS__)
#define info(format, ...) do_log(LOG_INFO, format, ##__VA_ARGS__)
#define debug(format, ...) do_log(LOG_DEBUG, format, ##__VA_ARGS__)
struct nvenc_encoder {
obs_encoder_t *encoder;
AVCodec *nvenc;
AVCodecContext *context;
AVPicture dst_picture;
AVFrame *vframe;
DARRAY(uint8_t) buffer;
uint8_t *header;
size_t header_size;
uint8_t *sei;
size_t sei_size;
int height;
bool first_packet;
};
static const char *nvenc_getname(void *unused)
{
UNUSED_PARAMETER(unused);
return "NVENC H.264";
}
static inline bool valid_format(enum video_format format)
{
return format == VIDEO_FORMAT_I420 ||
format == VIDEO_FORMAT_NV12 ||
format == VIDEO_FORMAT_I444;
}
static void nvenc_video_info(void *data, struct video_scale_info *info)
{
struct nvenc_encoder *enc = data;
enum video_format pref_format;
pref_format = obs_encoder_get_preferred_video_format(enc->encoder);
if (!valid_format(pref_format)) {
pref_format = valid_format(info->format) ?
info->format : VIDEO_FORMAT_NV12;
}
info->format = pref_format;
}
static bool nvenc_init_codec(struct nvenc_encoder *enc)
{
int ret;
ret = avcodec_open2(enc->context, enc->nvenc, NULL);
if (ret < 0) {
warn("Failed to open NVENC codec: %s", av_err2str(ret));
return false;
}
enc->vframe = av_frame_alloc();
if (!enc->vframe) {
warn("Failed to allocate video frame");
return false;
}
enc->vframe->format = enc->context->pix_fmt;
enc->vframe->width = enc->context->width;
enc->vframe->height = enc->context->height;
enc->vframe->colorspace = enc->context->colorspace;
enc->vframe->color_range = enc->context->color_range;
ret = avpicture_alloc(&enc->dst_picture, enc->context->pix_fmt,
enc->context->width, enc->context->height);
if (ret < 0) {
warn("Failed to allocate dst_picture: %s", av_err2str(ret));
return false;
}
*((AVPicture*)enc->vframe) = enc->dst_picture;
return true;
}
enum RC_MODE {
RC_MODE_CBR,
RC_MODE_VBR,
RC_MODE_CQP,
RC_MODE_LOSSLESS
};
static bool nvenc_update(void *data, obs_data_t *settings)
{
struct nvenc_encoder *enc = data;
const char *rc = obs_data_get_string(settings, "rate_control");
int bitrate = (int)obs_data_get_int(settings, "bitrate");
int cqp = (int)obs_data_get_int(settings, "cqp");
int keyint_sec = (int)obs_data_get_int(settings, "keyint_sec");
const char *preset = obs_data_get_string(settings, "preset");
const char *profile = obs_data_get_string(settings, "profile");
const char *level = obs_data_get_string(settings, "level");
bool twopass = obs_data_get_bool(settings, "2pass");
int gpu = (int)obs_data_get_int(settings, "gpu");
bool cbr_override = obs_data_get_bool(settings, "cbr");
video_t *video = obs_encoder_video(enc->encoder);
const struct video_output_info *voi = video_output_get_info(video);
struct video_scale_info info;
/* XXX: "cbr" setting has been deprecated */
if (cbr_override) {
warn("\"cbr\" setting has been deprecated for all encoders! "
"Please set \"rate_control\" to \"CBR\" instead. "
"Forcing CBR mode. "
"(Note to all: this is why you shouldn't use strings for "
"common settings)");
rc = "CBR";
}
info.format = voi->format;
info.colorspace = voi->colorspace;
info.range = voi->range;
nvenc_video_info(enc, &info);
av_opt_set_int(enc->context->priv_data, "cbr", false, 0);
if (astrcmpi(rc, "cqp") == 0) {
bitrate = 0;
enc->context->global_quality = cqp;
} else if (astrcmpi(rc, "lossless") == 0) {
bitrate = 0;
cqp = 0;
bool hp = (astrcmpi(preset, "hp") == 0 ||
astrcmpi(preset, "llhp") == 0);
av_opt_set(enc->context->priv_data, "profile",
hp ? "losslesshp" : "lossless", 0);
} else if (astrcmpi(rc, "vbr") != 0) { /* CBR by default */
av_opt_set_int(enc->context->priv_data, "cbr", true, 0);
enc->context->rc_max_rate = bitrate * 1000;
enc->context->rc_min_rate = bitrate * 1000;
cqp = 0;
}
av_opt_set(enc->context->priv_data, "preset", preset, 0);
av_opt_set(enc->context->priv_data, "level", level, 0);
av_opt_set_int(enc->context->priv_data, "2pass", twopass, 0);
av_opt_set_int(enc->context->priv_data, "gpu", gpu, 0);
enc->context->bit_rate = bitrate * 1000;
enc->context->rc_buffer_size = bitrate * 1000;
enc->context->width = obs_encoder_get_width(enc->encoder);
enc->context->height = obs_encoder_get_height(enc->encoder);
enc->context->time_base = (AVRational){voi->fps_den, voi->fps_num};
enc->context->pix_fmt = obs_to_ffmpeg_video_format(info.format);
enc->context->colorspace = info.colorspace == VIDEO_CS_709 ?
AVCOL_SPC_BT709 : AVCOL_SPC_BT470BG;
enc->context->color_range = info.range == VIDEO_RANGE_FULL ?
AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
if (keyint_sec)
enc->context->gop_size = keyint_sec * voi->fps_num /
voi->fps_den;
else
enc->context->gop_size = 250;
enc->height = enc->context->height;
info("settings:\n"
"\trate_control: %s\n"
"\tbitrate: %d\n"
"\tcqp: %d\n"
"\tkeyint: %d\n"
"\tpreset: %s\n"
"\tprofile: %s\n"
"\tlevel: %s\n"
"\twidth: %d\n"
"\theight: %d\n"
"\t2-pass: %s\n"
"\tGPU: %d\n",
rc, bitrate, cqp, enc->context->gop_size,
preset, profile, level,
enc->context->width, enc->context->height,
twopass ? "true" : "false",
gpu);
return nvenc_init_codec(enc);
}
static void nvenc_destroy(void *data)
{
struct nvenc_encoder *enc = data;
avcodec_close(enc->context);
av_frame_free(&enc->vframe);
avpicture_free(&enc->dst_picture);
da_free(enc->buffer);
bfree(enc->header);
bfree(enc->sei);
bfree(enc);
}
static void *nvenc_create(obs_data_t *settings, obs_encoder_t *encoder)
{
struct nvenc_encoder *enc;
avcodec_register_all();
enc = bzalloc(sizeof(*enc));
enc->encoder = encoder;
enc->nvenc = avcodec_find_encoder_by_name("nvenc_h264");
enc->first_packet = true;
blog(LOG_INFO, "---------------------------------");
if (!enc->nvenc) {
warn("Couldn't find encoder");
goto fail;
}
enc->context = avcodec_alloc_context3(enc->nvenc);
if (!enc->context) {
warn("Failed to create codec context");
goto fail;
}
if (!nvenc_update(enc, settings))
goto fail;
return enc;
fail:
nvenc_destroy(enc);
return NULL;
}
static inline void copy_data(AVPicture *pic, const struct encoder_frame *frame,
int height)
{
for (int plane = 0; plane < MAX_AV_PLANES; plane++) {
if (!frame->data[plane])
continue;
int frame_rowsize = (int)frame->linesize[plane];
int pic_rowsize = pic->linesize[plane];
int bytes = frame_rowsize < pic_rowsize ?
frame_rowsize : pic_rowsize;
int plane_height = plane == 0 ? height : height/2;
for (int y = 0; y < plane_height; y++) {
int pos_frame = y * frame_rowsize;
int pos_pic = y * pic_rowsize;
memcpy(pic->data[plane] + pos_pic,
frame->data[plane] + pos_frame,
bytes);
}
}
}
static bool nvenc_encode(void *data, struct encoder_frame *frame,
struct encoder_packet *packet, bool *received_packet)
{
struct nvenc_encoder *enc = data;
AVPacket av_pkt = {0};
int got_packet;
int ret;
av_init_packet(&av_pkt);
copy_data(&enc->dst_picture, frame, enc->height);
enc->vframe->pts = frame->pts;
ret = avcodec_encode_video2(enc->context, &av_pkt, enc->vframe,
&got_packet);
if (ret < 0) {
warn("nvenc_encode: Error encoding: %s", av_err2str(ret));
return false;
}
if (got_packet && av_pkt.size) {
if (enc->first_packet) {
uint8_t *new_packet;
size_t size;
enc->first_packet = false;
obs_extract_avc_headers(av_pkt.data, av_pkt.size,
&new_packet, &size,
&enc->header, &enc->header_size,
&enc->sei, &enc->sei_size);
da_copy_array(enc->buffer, new_packet, size);
bfree(new_packet);
} else {
da_copy_array(enc->buffer, av_pkt.data, av_pkt.size);
}
packet->pts = av_pkt.pts;
packet->dts = av_pkt.dts;
packet->data = enc->buffer.array;
packet->size = enc->buffer.num;
packet->type = OBS_ENCODER_VIDEO;
packet->keyframe = obs_avc_keyframe(packet->data, packet->size);
*received_packet = true;
} else {
*received_packet = false;
}
av_free_packet(&av_pkt);
return true;
}
static void nvenc_defaults(obs_data_t *settings)
{
obs_data_set_default_int(settings, "bitrate", 2500);
obs_data_set_default_int(settings, "keyint_sec", 0);
obs_data_set_default_int(settings, "cqp", 23);
obs_data_set_default_string(settings, "rate_control", "CBR");
obs_data_set_default_string(settings, "preset", "default");
obs_data_set_default_string(settings, "profile", "main");
obs_data_set_default_string(settings, "level", "auto");
obs_data_set_default_bool(settings, "2pass", true);
obs_data_set_default_int(settings, "gpu", 0);
}
static bool rate_control_modified(obs_properties_t *ppts, obs_property_t *p,
obs_data_t *settings)
{
const char *rc = obs_data_get_string(settings, "rate_control");
bool cqp = astrcmpi(rc, "CQP") == 0;
bool lossless = astrcmpi(rc, "lossless") == 0;
size_t count;
p = obs_properties_get(ppts, "bitrate");
obs_property_set_visible(p, !cqp && !lossless);
p = obs_properties_get(ppts, "cqp");
obs_property_set_visible(p, cqp);
p = obs_properties_get(ppts, "preset");
count = obs_property_list_item_count(p);
for (size_t i = 0; i < count; i++) {
bool compatible = (i == 0 || i == 2);
obs_property_list_item_disable(p, i, lossless && !compatible);
}
return true;
}
static obs_properties_t *nvenc_properties(void *unused)
{
UNUSED_PARAMETER(unused);
obs_properties_t *props = obs_properties_create();
obs_property_t *p;
p = obs_properties_add_list(props, "rate_control",
obs_module_text("RateControl"),
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
obs_property_list_add_string(p, "CBR", "CBR");
obs_property_list_add_string(p, "VBR", "VBR");
obs_property_list_add_string(p, "CQP", "CQP");
obs_property_list_add_string(p, obs_module_text("Lossless"),
"lossless");
obs_property_set_modified_callback(p, rate_control_modified);
obs_properties_add_int(props, "bitrate",
obs_module_text("Bitrate"), 50, 300000, 50);
obs_properties_add_int(props, "cqp", "CQP", 0, 50, 1);
obs_properties_add_int(props, "keyint_sec",
obs_module_text("KeyframeIntervalSec"), 0, 10, 1);
p = obs_properties_add_list(props, "preset", obs_module_text("Preset"),
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
#define add_preset(val) \
obs_property_list_add_string(p, obs_module_text("NVENC.Preset." val), \
val)
add_preset("default");
add_preset("hq");
add_preset("hp");
add_preset("bd");
add_preset("ll");
add_preset("llhq");
add_preset("llhp");
#undef add_preset
p = obs_properties_add_list(props, "profile", obs_module_text("Profile"),
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
#define add_profile(val) \
obs_property_list_add_string(p, val, val)
add_profile("high");
add_profile("main");
add_profile("baseline");
add_profile("high444p");
p = obs_properties_add_list(props, "level",
obs_module_text("NVENC.Level"), OBS_COMBO_TYPE_LIST,
OBS_COMBO_FORMAT_STRING);
add_profile("auto");
add_profile("1" );
add_profile("1.0" );
add_profile("1b" );
add_profile("1.0b");
add_profile("1.1" );
add_profile("1.2" );
add_profile("1.3" );
add_profile("2" );
add_profile("2.0" );
add_profile("2.1" );
add_profile("2.2" );
add_profile("3" );
add_profile("3.0" );
add_profile("3.1" );
add_profile("3.2" );
add_profile("4" );
add_profile("4.0" );
add_profile("4.1" );
add_profile("4.2" );
add_profile("5" );
add_profile("5.0" );
add_profile("5.1" );
#undef add_profile
obs_properties_add_bool(props, "2pass",
obs_module_text("NVENC.Use2Pass"));
obs_properties_add_int(props, "gpu", obs_module_text("GPU"), 0, 8, 1);
return props;
}
static bool nvenc_extra_data(void *data, uint8_t **extra_data, size_t *size)
{
struct nvenc_encoder *enc = data;
*extra_data = enc->header;
*size = enc->header_size;
return true;
}
static bool nvenc_sei_data(void *data, uint8_t **extra_data, size_t *size)
{
struct nvenc_encoder *enc = data;
*extra_data = enc->sei;
*size = enc->sei_size;
return true;
}
struct obs_encoder_info nvenc_encoder_info = {
.id = "ffmpeg_nvenc",
.type = OBS_ENCODER_VIDEO,
.codec = "h264",
.get_name = nvenc_getname,
.create = nvenc_create,
.destroy = nvenc_destroy,
.encode = nvenc_encode,
.get_defaults = nvenc_defaults,
.get_properties = nvenc_properties,
.get_extra_data = nvenc_extra_data,
.get_sei_data = nvenc_sei_data,
.get_video_info = nvenc_video_info
};

View file

@ -49,6 +49,7 @@ struct ffmpeg_source {
char *input;
char *input_format;
enum AVDiscard frame_drop;
enum video_range_type range;
int audio_buffer_size;
int video_buffer_size;
bool is_advanced;
@ -81,6 +82,9 @@ static bool set_obs_frame_colorprops(struct ff_frame *frame,
obs_frame->full_range =
frame->frame->color_range == AVCOL_RANGE_JPEG;
if (s->range != VIDEO_RANGE_DEFAULT)
obs_frame->full_range = s->range == VIDEO_RANGE_FULL;
range = obs_frame->full_range ? VIDEO_RANGE_FULL : VIDEO_RANGE_PARTIAL;
if (!video_format_get_parameters(obs_cs,
@ -265,7 +269,7 @@ static bool audio_frame(struct ff_frame *frame, void *opaque)
uint64_t pts;
// Media ended
if (frame == NULL)
if (frame == NULL || frame->frame == NULL)
return true;
pts = (uint64_t)(frame->pts * 1000000000.0L);
@ -316,10 +320,12 @@ static bool is_advanced_modified(obs_properties_t *props,
obs_property_t *abuf = obs_properties_get(props, "audio_buffer_size");
obs_property_t *vbuf = obs_properties_get(props, "video_buffer_size");
obs_property_t *frame_drop = obs_properties_get(props, "frame_drop");
obs_property_t *color_range = obs_properties_get(props, "color_range");
obs_property_set_visible(fscale, enabled);
obs_property_set_visible(abuf, enabled);
obs_property_set_visible(vbuf, enabled);
obs_property_set_visible(frame_drop, enabled);
obs_property_set_visible(color_range, enabled);
return true;
}
@ -345,7 +351,9 @@ static const char *audio_filter =
static obs_properties_t *ffmpeg_source_getproperties(void *data)
{
struct ffmpeg_source *s = data;
struct dstr filter = {0};
struct dstr path = {0};
UNUSED_PARAMETER(data);
obs_properties_t *props = obs_properties_create();
@ -368,10 +376,21 @@ static obs_properties_t *ffmpeg_source_getproperties(void *data)
dstr_cat(&filter, obs_module_text("MediaFileFilter.AllFiles"));
dstr_cat(&filter, " (*.*)");
if (s && s->input && *s->input) {
const char *slash;
dstr_copy(&path, s->input);
dstr_replace(&path, "\\", "/");
slash = strrchr(path.array, '/');
if (slash)
dstr_resize(&path, slash - path.array + 1);
}
obs_properties_add_path(props, "local_file",
obs_module_text("LocalFile"), OBS_PATH_FILE,
filter.array, NULL);
filter.array, path.array);
dstr_free(&filter);
dstr_free(&path);
obs_properties_add_bool(props, "looping", obs_module_text("Looping"));
@ -431,6 +450,18 @@ static obs_properties_t *ffmpeg_source_getproperties(void *data)
obs_property_set_visible(prop, false);
prop = obs_properties_add_list(props, "color_range",
obs_module_text("ColorRange"), OBS_COMBO_TYPE_LIST,
OBS_COMBO_FORMAT_INT);
obs_property_list_add_int(prop, obs_module_text("ColorRange.Auto"),
VIDEO_RANGE_DEFAULT);
obs_property_list_add_int(prop, obs_module_text("ColorRange.Partial"),
VIDEO_RANGE_PARTIAL);
obs_property_list_add_int(prop, obs_module_text("ColorRange.Full"),
VIDEO_RANGE_FULL);
obs_property_set_visible(prop, false);
return props;
}
@ -547,6 +578,7 @@ static void ffmpeg_source_update(void *data, obs_data_t *settings)
s->restart_on_activate = obs_data_get_bool(settings,
"restart_on_activate");
s->is_forcing_scale = true;
s->range = VIDEO_RANGE_DEFAULT;
if (is_advanced) {
s->audio_buffer_size = (int)obs_data_get_int(settings,
@ -557,6 +589,8 @@ static void ffmpeg_source_update(void *data, obs_data_t *settings)
"frame_drop");
s->is_forcing_scale = obs_data_get_bool(settings,
"force_scale");
s->range = (enum video_range_type)obs_data_get_int(settings,
"color_range");
if (s->audio_buffer_size < 1) {
s->audio_buffer_size = 1;

View file

@ -1,6 +1,8 @@
#include <obs-module.h>
#include <util/darray.h>
#include <util/platform.h>
#include <libavutil/log.h>
#include <libavcodec/avcodec.h>
#include <pthread.h>
OBS_DECLARE_MODULE()
@ -10,6 +12,7 @@ extern struct obs_source_info ffmpeg_source;
extern struct obs_output_info ffmpeg_output;
extern struct obs_output_info ffmpeg_muxer;
extern struct obs_encoder_info aac_encoder_info;
extern struct obs_encoder_info nvenc_encoder_info;
static DARRAY(struct log_context {
void *context;
@ -111,6 +114,27 @@ cleanup:
destroy_log_context(log_context);
}
static bool nvenc_supported(void)
{
AVCodec *nvenc = avcodec_find_encoder_by_name("nvenc_h264");
void *lib = NULL;
if (!nvenc)
return false;
#if defined(_WIN32)
if (sizeof(void*) == 8) {
lib = os_dlopen("nvEncodeAPI64.dll");
} else {
lib = os_dlopen("nvEncodeAPI.dll");
}
#else
lib = os_dlopen("libnvidia-encode.so.1");
#endif
os_dlclose(lib);
return !!lib;
}
bool obs_module_load(void)
{
da_init(active_log_contexts);
@ -122,6 +146,10 @@ bool obs_module_load(void)
obs_register_output(&ffmpeg_output);
obs_register_output(&ffmpeg_muxer);
obs_register_encoder(&aac_encoder_info);
if (nvenc_supported()) {
blog(LOG_INFO, "NVENC supported");
obs_register_encoder(&nvenc_encoder_info);
}
return true;
}