MENU

Sora Videos API ile Video Üretimi Dijital Pazarlamaya Etkisi

Sora ile Video Üretimi: Dijital Pazarlama Stratejinizi Nasıl Dönüştürebilir? Sora, OpenAI’ın son teknoloji ürünü video modelidir ve ben buna gerçekten hayranım. Doğal dil komutlarıyla veya görsellerle, zengin detaylara sahip,

İçindekiler

Sora ile Video Üretimi: Dijital Pazarlama Stratejinizi Nasıl Dönüştürebilir?

Sora, OpenAI’ın son teknoloji ürünü video modelidir ve ben buna gerçekten hayranım. Doğal dil komutlarıyla veya görsellerle, zengin detaylara sahip, dinamik ve sesli videolar oluşturabiliyor. Yıllarca süren çok modlu difüzyon araştırmalarının üzerine inşa edilmiş ve çeşitli görsel verilerle eğitilmiş Sora, 3D uzay, hareket ve sahne sürekliliği konularında derin bir anlayışla yapay zeka destekli video üretimi dünyasına yepyeni bir soluk getiriyor.

Videos API, bu yetenekleri ilk kez geliştiricilere açıyor; videoların programlı bir şekilde oluşturulmasını, genişletilmesini, düzenlenmesini ve yönetilmesini sağlıyor. Benim için bu, dijital büyüme ve performans pazarlaması alanında çalışan bizler için devrim niteliğinde bir araç demek.

Bu API ile neler yapabiliriz, biliyor musun?

  • Prompt’lardan sıfırdan yeni videolar oluşturabiliriz.
  • Bir görsel referansıyla video üretimini yönlendirebiliriz.
  • Görsel tutarlılığı artırmak için karakterleri birden fazla videoda tekrar kullanabiliriz.
  • Tamamlanmış bir klibi video uzantılarıyla devam ettirebiliriz.
  • Mevcut bir videoyu hedefli değişikliklerle düzenleyebiliriz.
  • Bitmiş videoları ve yardımcı varlıkları kolayca indirebiliriz.
  • Büyük, çevrimdışı render kuyruklarını Batch API aracılığıyla gönderebiliriz.
Space Race Poster
Maui Poster
Upside Down City Poster
Fox Walk Poster
Zebra Chase Poster
Mushroom Network Poster
90s TV Ad Poster
Chameleon Poster
Cozy Coffee Shop Interior Poster
Coloring Poster
Sleeping Otters Poster
Indie Cafe Rainy Window Poster

Genel Bakış: Sora'nın Pazarlamadaki Gücü

Sora, üretken medya alanında benim gördüğüm en yeni ve en heyecan verici gelişme. Doğal dildeki açıklamalardan veya basit bir görselden, sesli ve ayrıntılı, dinamik videolar oluşturabiliyor. Yılların çok modlu difüzyon araştırmasına dayanması ve çok çeşitli görsel verilerle eğitilmesi sayesinde Sora, 3D uzayı, hareketleri ve sahne akışını derinlemesine anlıyor. Bu, yapay zeka ile video üretimi için ciddi bir atılım demek.

Videos API, tüm bu yetenekleri geliştiricilerin kullanımına sunuyor. Böylece videoları programatik olarak oluşturabiliyor, uzatabiliyor, düzenleyebiliyor ve yönetebiliyoruz.

Pazarlama ve dijital büyüme hedefleriniz için bu API'yi kullanabileceğiniz bazı yollar:

  • Metin komutlarından etkileyici yeni videolar oluşturmak.
  • Bir görsel referansı ile video üretimini istediğiniz yöne çekmek.
  • Görsel tutarlılığı sağlamak adına karakter varlıklarını farklı videolarda tekrar tekrar kullanmak.
  • Tamamlanmış bir videoyu, yeni bölümler ekleyerek uzatmak.
  • Mevcut bir videoyu belirli değişikliklerle hızla düzenlemek.
  • Hazır videoları ve gerekli tüm yardımcı dosyaları indirmek.
  • Büyük video render kuyruklarını Toplu API üzerinden yönetmek.

Sora Modelleri: Hız mı, Kalite mi?

İkinci nesil Sora modelleri, farklı kullanım senaryolarına özel olarak iki varyant halinde karşımıza çıkıyor. Hızlı iterasyon mu istersin, yoksa mükemmel üretim kalitesi mi? Seçim senin.

Sora 2: Hızlı İterasyon ve Esneklik İçin

sora-2 modeli, hız ve esneklik odaklı. Özellikle ilk keşif aşamasında, ton, yapı veya görsel tarz üzerinde deneyler yaparken hızlı geri bildirim almak istediğinde ideal. Yani, mükemmel sadakatten ziyade çeviklik senin için öncelikse, bu model harika bir başlangıç noktası.

Hızlı ve kaliteli sonuçlar ürettiği için hızlı iterasyon, konsept geliştirme ve taslak videolar için çok uygun. Sosyal medya içeriği, prototipler ve hızlı dönüş süresinin çok önemli olduğu senaryolarda sora-2 genellikle fazlasıyla yeterli oluyor.

Sora 2 Pro: Üretim Kalitesinde Video İçerikleri

sora-2-pro ise daha yüksek kaliteli sonuçlar vaat ediyor. Eğer üretim kalitesinde bir çıktıya ihtiyacın varsa, tercih etmen gereken model bu.

sora-2-pro render süresi daha uzun ve maliyeti biraz daha yüksek olsa da, daha parlak ve stabil sonuçlar veriyor. Yüksek çözünürlüklü sinematik görüntüler, pazarlama materyalleri ve görsel hassasiyetin kritik olduğu her durum için biçilmiş kaftan.

1080p çözünürlükte, 1920x1080 veya 1080x1920 boyutlarında dışa aktarımlara ihtiyacın varsa, sora-2-pro kullanmalısın.

Hem sora-2 hem de sora-2-pro, 16 ve 20 saniyelik video üretimi destekliyor.

Yapay Zeka Destekli Video Üretimine Başlangıç

Video üretmek, benim de tecrübe ettiğim gibi, eşzamansız bir süreçtir. Yani bir videoyu başlattığında anında hazır olmuyor.

  1. İlk olarak, POST /videos endpoint'ini çağırdığında, API sana bir iş id'si ve başlangıç status'ü ile bir iş nesnesi döndürüyor.
  2. Ardından, durum "tamamlandı" (completed) olana kadar GET /videos/{video_id} endpoint'ini tekrar tekrar sorgulayabilirsin. Daha verimli bir yaklaşım istersen, iş bittiğinde otomatik olarak bildirim almak için web kancalarını (webhooks) kullanabilirsin (aşağıda detayları var).
  3. İş "tamamlandı" durumuna ulaştığında, GET /videos/{video_id}/content ile nihai MP4 dosyasını indirebilirsin.

Dijital pazarlama ve SEO stratejilerinizi bir sonraki seviyeye taşımak için yapay zeka destekli video üretiminin potansiyelini keşfetmeye hazır mısın? SEO ve Büyüme Hizmetleri sayfamızı ziyaret ederek neler yapabileceğimizi öğren. Belki de sana özel video içerik stratejileri geliştirebiliriz.

Video Oluşturma Sürecini Başlatmak

Prompt ve gerekli parametrelerle POST /videos çağrısını yaparak sürece başlayabilirsin. Prompt, videonun yaratıcı görünümünü ve hissini belirliyor: konular, kamera hareketleri, ışıklandırma ve aksiyon gibi detayları. size ve seconds gibi parametreler ise videonun çözünürlüğünü ve süresini kontrol etmeni sağlıyor.

<code class="language-javascript"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span><span class="react-syntax-highlighter-line-number">9
</span><span class="react-syntax-highlighter-line-number">10
</span></code><span><span class="hljs-keyword">import</span><span> OpenAI </span><span class="hljs-keyword">from</span><span> </span><span class="hljs-string">'openai'</span><span>;
</span></span><span>
</span><span><span></span><span class="hljs-keyword">const</span><span> openai = </span><span class="hljs-keyword">new</span><span> OpenAI();
</span></span><span>
</span><span><span></span><span class="hljs-keyword">let</span><span> video = </span><span class="hljs-keyword">await</span><span> openai.videos.create({
</span></span><span><span>    </span><span class="hljs-attr">model</span><span>: </span><span class="hljs-string">'sora-2'</span><span>,
</span></span><span><span>    </span><span class="hljs-attr">prompt</span><span>: </span><span class="hljs-string">"A video of the words 'Thank you' in sparkling letters"</span><span>,
</span></span><span>});
</span><span>
</span><span><span></span><span class="hljs-built_in">console</span><span>.log(</span><span class="hljs-string">'Video generation started: '</span><span>, video);</span></span></code>
<code class="language-python"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span><span class="react-syntax-highlighter-line-number">9
</span><span class="react-syntax-highlighter-line-number">10
</span></code><span><span class="hljs-keyword">from</span><span> openai </span><span class="hljs-keyword">import</span><span> OpenAI
</span></span><span>
</span><span>openai = OpenAI()
</span><span>
</span><span>video = openai.videos.create(
</span></span><span><span>    model=</span><span class="hljs-string">"sora-2"</span><span>,
</span></span><span><span>    prompt=</span><span class="hljs-string">"A video of a cool cat on a motorcycle in the night"</span><span>,
</span></span><span>)
</span><span>
</span><span><span></span><span class="hljs-built_in">print</span><span>(</span><span class="hljs-string">"Video generation started:"</span><span>, video)</span></span></code>
<code class="language-bash"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span></code><span><span>curl -X POST </span><span class="hljs-string">"https://api.openai.com/v1/videos"</span><span> \
</span></span><span><span>  -H </span><span class="hljs-string">"Authorization: Bearer $OPENAI_API_KEY"</span><span> \
</span></span><span><span>  -H </span><span class="hljs-string">"Content-Type: multipart/form-data"</span><span> \
</span></span><span><span>  -F prompt=</span><span class="hljs-string">"Wide tracking shot of a teal coupe driving through a desert highway, heat ripples visible, hard sun overhead."</span><span> \
</span></span><span><span>  -F model=</span><span class="hljs-string">"sora-2-pro"</span><span> \
</span></span><span><span>  -F size=</span><span class="hljs-string">"1280x720"</span><span> \
</span></span><span><span>  -F seconds=</span><span class="hljs-string">"8"</span><span> \</span></span></code>

Dönen yanıt, benzersiz bir id ve queued (sıraya alındı) veya in_progress (devam ediyor) gibi bir başlangıç durumu içeren bir JSON nesnesi olacaktır. Bu, render işinin başladığı anlamına geliyor.

<code class="language-shell"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span><span class="react-syntax-highlighter-line-number">9
</span><span class="react-syntax-highlighter-line-number">10
</span></code><span><span>{
</span></span><span>  "id": "video_68d7512d07848190b3e45da0ecbebcde004da08e1e0678d5",
</span><span>  "object": "video",
</span><span>  "created_at": 1758941485,
</span><span>  "status": "queued",
</span><span>  "model": "sora-2-pro",
</span><span>  "progress": 0,
</span><span>  "seconds": "8",
</span><span>  "size": "1280x720"
</span><span>}
</span></code>

Boyut ve Süre Seçimi: Pazarlama Hedeflerinize Göre

Üretim ihtiyaçlarına en uygun en küçük formatı seçmek her zaman en iyisi. Benim deneyimlerime göre, bu hem maliyet hem de zaman açısından verimlilik sağlıyor:

  • Prompt, hareket veya kompozisyon üzerinde iterasyon yaparken daha kısa klipler kullan.
  • Daha uzun sahneler veya kampanyalar için 20 saniyeye kadar videolar üretebilirsin.
  • Daha yüksek çözünürlüklü dışa aktarımlar (1920x1080 veya 1080x1920) için sora-2-pro modelini kullan.

Daha uzun süreler ve 1080p işler, kısa 720p veya 480p render'lara göre oldukça uzun sürebilir. Bu yüzden, kullanıcıya dönük akışlarda daha yüksek gecikmeler için plan yapmanı öneririm.

Kısıtlamalar ve Güvenlik Önlemleri

API, bazı içerik kısıtlamaları uyguluyor. Dijital pazarlama yaparken marka güvenliğimiz ve yasalara uygunluğumuz için bunları bilmek önemli:

  • Şimdilik yalnızca 18 yaş altı izleyiciler için uygun içerikler üretilebiliyor. (İleride bu kısıtlamayı aşmak için bir ayar gelecekmiş.)
  • Telif hakkıyla korunan karakterler ve müzikler reddediliyor. Bu, içerik stratejisi oluştururken yaratıcı özgürlükle yasal sınırları dengelemek demek.
  • Gerçek insanlar —kamuya mal olmuş figürler dahil— üretilemiyor.
  • İnsan benzerliği gösteren karakter yüklemeleri varsayılan olarak engelleniyor.
  • İnsan yüzleri içeren girdi görselleri şu anda reddediliyor.

Bu kurallara uyduğun sürece, başarısız üretimlerle karşılaşmazsın. Prompt'larının, referans görsellerinin ve metinlerinin bu kurallara uygun olduğundan emin olmalısın.

Etkili Prompt Yazımı: İstediğiniz Videoyu Elde Etmek İçin

En iyi sonuçları almak için çekim tipi, konu, aksiyon, mekan ve ışıklandırmayı detaylıca anlatmalısın. Örneğin:

  • "Çimenli bir parkta kırmızı uçurtma uçuran bir çocuğun geniş çekimi, altın saat gün batımı ışığı, kamera yavaşça yukarı doğru kayıyor."
  • "Ahşap bir masa üzerinde buharlı bir kahve fincanının yakın çekimi, panjurlardan süzülen sabah ışığı, yumuşak alan derinliği."

Bu düzeyde bir açıklık, modelin istenmeyen detaylar uydurmadan tutarlı sonuçlar üretmesine yardımcı oluyor. Daha gelişmiş prompt teknikleri için, OpenAI'ın Sora 2'ye özel prompt rehberine göz atabilirsin. Benim blogumda da içerik stratejisi ve prompt mühendisliği üzerine yazılar bulabilirsin.

İlerleme Takibi: Videolarınızı Verimli Yönetin

Video üretimi zaman alıyor, bunu hepimiz biliyoruz. Model, API yükü ve çözünürlüğe bağlı olarak, tek bir render işlemi birkaç dakika sürebilir.

Bu süreci verimli yönetmek için, API'yi sorgulayarak durum güncellemeleri alabilir veya bir web kancası (webhook) aracılığıyla otomatik olarak bildirim alabilirsin.

Durum Güncellemeleri İçin API Sorgulama

Oluşturma çağrısından dönen id ile GET /videos/{video_id} adresini çağır. Yanıt, işin mevcut durumunu, ilerleme yüzdesini (varsa) ve olası hataları gösteriyor.

Tipik durumlar queued, in_progress, completed ve failed şeklinde oluyor. Makul aralıklarla (örneğin, her 10-20 saniyede bir) sorgulama yapmanı, gerekirse üstel geri çekilme (exponential backoff) kullanmanı ve kullanıcılara işin hala devam ettiğini bildirmeni tavsiye ederim.

<code class="language-javascript"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span><span class="react-syntax-highlighter-line-number">9
</span><span class="react-syntax-highlighter-line-number">10
</span><span class="react-syntax-highlighter-line-number">11
</span><span class="react-syntax-highlighter-line-number">12
</span><span class="react-syntax-highlighter-line-number">13
</span><span class="react-syntax-highlighter-line-number">14
</span><span class="react-syntax-highlighter-line-number">15
</span><span class="react-syntax-highlighter-line-number">16
</span><span class="react-syntax-highlighter-line-number">17
</span><span class="react-syntax-highlighter-line-number">18
</span></code><span><span class="hljs-keyword">import</span><span> OpenAI </span><span class="hljs-keyword">from</span><span> </span><span class="hljs-string">'openai'</span><span>;
</span></span><span>
</span><span><span></span><span class="hljs-keyword">const</span><span> openai = </span><span class="hljs-keyword">new</span><span> OpenAI();
</span></span><span>
</span><span><span></span><span class="hljs-keyword">async</span><span> </span><span class="hljs-function hljs-keyword">function</span><span class="hljs-function"> </span><span class="hljs-function hljs-title">main</span><span class="hljs-function">() </span><span>{
</span></span><span><span>  </span><span class="hljs-keyword">const</span><span> video = </span><span class="hljs-keyword">await</span><span> openai.videos.createAndPoll({
</span></span><span><span>    </span><span class="hljs-attr">model</span><span>: </span><span class="hljs-string">'sora-2'</span><span>,
</span></span><span><span>    </span><span class="hljs-attr">prompt</span><span>: </span><span class="hljs-string">"A video of the words 'Thank you' in sparkling letters"</span><span>,
</span></span><span>  });
</span><span>
</span><span><span>  </span><span class="hljs-keyword">if</span><span> (video.status === </span><span class="hljs-string">'completed'</span><span>) {
</span></span><span><span>    </span><span class="hljs-built_in">console</span><span>.log(</span><span class="hljs-string">'Video successfully completed: '</span><span>, video);
</span></span><span><span>  } </span><span class="hljs-keyword">else</span><span> {
</span></span><span><span>    </span><span class="hljs-built_in">console</span><span>.log(</span><span class="hljs-string">'Video creation failed. Status: '</span><span>, video.status);
</span></span><span>  }
</span></span><span><span>}</span></span><span>
</span><span>
</span><span>main();</span></code>
<code class="language-python"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span><span class="react-syntax-highlighter-line-number">9
</span><span class="react-syntax-highlighter-line-number">10
</span><span class="react-syntax-highlighter-line-number">11
</span><span class="react-syntax-highlighter-line-number">12
</span><span class="react-syntax-highlighter-line-number">13
</span><span class="react-syntax-highlighter-line-number">14
</span><span class="react-syntax-highlighter-line-number">15
</span><span class="react-syntax-highlighter-line-number">16
</span><span class="react-syntax-highlighter-line-number">17
</span><span class="react-syntax-highlighter-line-number">18
</span><span class="react-syntax-highlighter-line-number">19
</span><span class="react-syntax-highlighter-line-number">20
</span></code><span><span class="hljs-keyword">import</span><span> asyncio
</span></span><span>
</span><span><span class="hljs-keyword">from</span><span> openai </span><span class="hljs-keyword">import</span><span> AsyncOpenAI
</span></span><span>
</span><span>client = AsyncOpenAI()
</span><span>
</span><span>
</span><span><span class="hljs-keyword">async</span><span> </span><span class="hljs-function hljs-keyword">def</span><span class="hljs-function"> </span><span class="hljs-function hljs-title">main</span><span class="hljs-function">() -> </span><span class="hljs-function hljs-literal">None</span><span class="hljs-function">:</span><span>
</span></span><span><span>    video = </span><span class="hljs-keyword">await</span><span> client.videos.create_and_poll(
</span></span><span><span>        model=</span><span class="hljs-string">"sora-2"</span><span>,
</span></span><span><span>        prompt=</span><span class="hljs-string">"A video of a cool cat on a motorcycle in the night"</span><span>,
</span></span><span>    )
</span><span>
</span><span><span>    </span><span class="hljs-keyword">if</span><span> video.status == </span><span class="hljs-string">"completed"</span><span>:
</span></span><span><span>        </span><span class="hljs-built_in">print</span><span>(</span><span class="hljs-string">"Video successfully completed: "</span><span>, video)
</span></span><span><span>    </span><span class="hljs-keyword">else</span><span>:
</span></span><span><span>        </span><span class="hljs-built_in">print</span><span>(</span><span class="hljs-string">"Video creation failed. Status: "</span><span>, video.status)
</span></span><span>
</span><span>
</span><span>asyncio.run(main())</span></code>

Yanıt örneği:

<code class="language-shell"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span><span class="react-syntax-highlighter-line-number">9
</span><span class="react-syntax-highlighter-line-number">10
</span></code><span><span>{
</span></span><span>  "id": "video_68d7512d07848190b3e45da0ecbebcde004da08e1e0678d5",
</span><span>  "object": "video",
</span><span>  "created_at": 1758941485,
</span><span>  "status": "in_progress",
</span><span>  "model": "sora-2-pro",
</span><span>  "progress": 33,
</span><span>  "seconds": "8",
</span><span>  "size": "1280x720"
</span><span>}
</span></code>
Anında Bildirimler İçin Webhook Kullanımı

GET ile sürekli durum sorgulamak yerine, bir video üretimi tamamlandığında veya başarısız olduğunda otomatik bildirim almak için bir webhook kaydettirmeni öneririm. Bu, gerçekten iş akışını hızlandıran ve seni gereksiz sorgu yükünden kurtaran bir yöntem.

Web kancalarını kendi webhook ayarları sayfanızdan yapılandırabilirsin. Bir iş tamamlandığında, API iki olay türünden birini tetikler: video.completed veya video.failed. Her olay, tetikleyen işin kimliğini içerir.

Webhook yükü örneği:

<code class="language-plaintext"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span><span class="react-syntax-highlighter-line-number">9
</span></code><span><span>{
</span></span><span>  "id": "evt_abc123",
</span><span>  "object": "event",
</span><span>  "created_at": 1758941485,
</span><span>  "type": "video.completed", // or "video.failed"
</span><span>  "data": {
</span></span><span>    "id": "video_abc123"
</span></span><span>  }
</span><span>}
</span></code>

Sonuçları Alma: Hazır Videoları İndirme

MP4 Dosyasını İndirme: Videolarınızı Teslim Alma

İş completed (tamamlandı) durumuna ulaştığında, MP4 dosyasını GET /videos/{video_id}/content ile çekebilirsin. Bu endpoint, ikili video verilerini akışla gönderir ve standart içerik başlıklarını döndürür, böylece dosyayı doğrudan diske kaydedebilir veya bulut depolama alanına aktarabilirsin.

<code class="language-javascript"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span><span class="react-syntax-highlighter-line-number">9
</span><span class="react-syntax-highlighter-line-number">10
</span><span class="react-syntax-highlighter-line-number">11
</span><span class="react-syntax-highlighter-line-number">12
</span><span class="react-syntax-highlighter-line-number">13
</span><span class="react-syntax-highlighter-line-number">14
</span><span class="react-syntax-highlighter-line-number">15
</span><span class="react-syntax-highlighter-line-number">16
</span><span class="react-syntax-highlighter-line-number">17
</span><span class="react-syntax-highlighter-line-number">18
</span><span class="react-syntax-highlighter-line-number">19
</span><span class="react-syntax-highlighter-line-number">20
</span><span class="react-syntax-highlighter-line-number">21
</span><span class="react-syntax-highlighter-line-number">22
</span><span class="react-syntax-highlighter-line-number">23
</span><span class="react-syntax-highlighter-line-number">24
</span><span class="react-syntax-highlighter-line-number">25
</span><span class="react-syntax-highlighter-line-number">26
</span><span class="react-syntax-highlighter-line-number">27
</span><span class="react-syntax-highlighter-line-number">28
</span><span class="react-syntax-highlighter-line-number">29
</span><span class="react-syntax-highlighter-line-number">30
</span><span class="react-syntax-highlighter-line-number">31
</span><span class="react-syntax-highlighter-line-number">32
</span><span class="react-syntax-highlighter-line-number">33
</span><span class="react-syntax-highlighter-line-number">34
</span><span class="react-syntax-highlighter-line-number">35
</span><span class="react-syntax-highlighter-line-number">36
</span><span class="react-syntax-highlighter-line-number">37
</span><span class="react-syntax-highlighter-line-number">38
</span><span class="react-syntax-highlighter-line-number">39
</span><span class="react-syntax-highlighter-line-number">40
</span><span class="react-syntax-highlighter-line-number">41
</span><span class="react-syntax-highlighter-line-number">42
</span><span class="react-syntax-highlighter-line-number">43
</span><span class="react-syntax-highlighter-line-number">44
</span><span class="react-syntax-highlighter-line-number">45
</span><span class="react-syntax-highlighter-line-number">46
</span><span class="react-syntax-highlighter-line-number">47
</span><span class="react-syntax-highlighter-line-number">48
</span></code><span><span class="hljs-keyword">import</span><span> OpenAI </span><span class="hljs-keyword">from</span><span> </span><span class="hljs-string">'openai'</span><span>;
</span></span><span>
</span><span><span></span><span class="hljs-keyword">const</span><span> openai = </span><span class="hljs-keyword">new</span><span> OpenAI();
</span></span><span>
</span><span><span></span><span class="hljs-keyword">let</span><span> video = </span><span class="hljs-keyword">await</span><span> openai.videos.create({
</span></span><span><span>    </span><span class="hljs-attr">model</span><span>: </span><span class="hljs-string">'sora-2'</span><span>,
</span></span><span><span>    </span><span class="hljs-attr">prompt</span><span>: </span><span class="hljs-string">"A video of the words 'Thank you' in sparkling letters"</span><span>,
</span></span><span>});
</span><span>
</span><span><span></span><span class="hljs-built_in">console</span><span>.log(</span><span class="hljs-string">'Video generation started: '</span><span>, video);
</span></span><span><span></span><span class="hljs-keyword">let</span><span> progress = video.progress ?? </span><span class="hljs-number">0</span><span>;
</span></span><span>
</span><span><span></span><span class="hljs-keyword">while</span><span> (video.status === </span><span class="hljs-string">'in_progress'</span><span> || video.status === </span><span class="hljs-string">'queued'</span><span>) {
</span></span><span><span>    video = </span><span class="hljs-keyword">await</span><span> openai.videos.retrieve(video.id);
</span></span><span><span>    progress = video.progress ?? </span><span class="hljs-number">0</span><span>;
</span></span><span>
</span><span><span>    </span><span class="hljs-comment">// Display progress bar</span><span>
</span></span><span><span>    </span><span class="hljs-keyword">const</span><span> barLength = </span><span class="hljs-number">30</span><span>;
</span></span><span><span>    </span><span class="hljs-keyword">const</span><span> filledLength = </span><span class="hljs-built_in">Math</span><span>.floor((progress / </span><span class="hljs-number">100</span><span>) * barLength);
</span></span><span><span>    </span><span class="hljs-comment">// Simple ASCII progress visualization for terminal output</span><span>
</span></span><span><span>    </span><span class="hljs-keyword">const</span><span> bar = </span><span class="hljs-string">'='</span><span>.repeat(filledLength) + </span><span class="hljs-string">'-'</span><span>.repeat(barLength - filledLength);
</span></span><span><span>    </span><span class="hljs-keyword">const</span><span> statusText = video.status === </span><span class="hljs-string">'queued'</span><span> ? </span><span class="hljs-string">'Queued'</span><span> : </span><span class="hljs-string">'Processing'</span><span>;
</span></span><span>
</span><span><span>    process.stdout.write(</span><span class="hljs-string">`</span><span class="hljs-string hljs-subst">${statusText}</span><span class="hljs-string">: [</span><span class="hljs-string hljs-subst">${bar}</span><span class="hljs-string">] </span><span class="hljs-string hljs-subst">${progress.toFixed(</span><span class="hljs-string hljs-subst hljs-number">1</span><span class="hljs-string hljs-subst">)}</span><span class="hljs-string">%`</span><span>);
</span></span><span>
</span><span><span>    </span><span class="hljs-keyword">await</span><span> </span><span class="hljs-keyword">new</span><span> </span><span class="hljs-built_in">Promise</span><span>(</span><span class="hljs-function">(</span><span class="hljs-function hljs-params">resolve</span><span class="hljs-function">) =></span><span> </span><span class="hljs-built_in">setTimeout</span><span>(resolve, </span><span class="hljs-number">2000</span><span>));
</span></span><span>}
</span><span>
</span><span><span> </span><span class="hljs-comment">// Clear the progress line and show completion</span><span>
</span></span><span>process.stdout.write(</span><span class="hljs-string">'\n'</span><span>);
</span></span><span>
</span><span><span></span><span class="hljs-keyword">if</span><span> (video.status === </span><span class="hljs-string">'failed'</span><span>) {
</span></span><span><span>    </span><span class="hljs-built_in">console</span><span>.error(</span><span class="hljs-string">'Video generation failed'</span><span>);
</span></span><span><span>    </span><span class="hljs-keyword">return</span><span>;
</span></span><span>}</span><span>
</span><span>
</span><span><span></span><span class="hljs-built_in">console</span><span>.log(</span><span class="hljs-string">'Video generation completed: '</span><span>, video);
</span></span><span>
</span><span><span></span><span class="hljs-built_in">console</span><span>.log(</span><span class="hljs-string">'Downloading video content...'</span><span>);
</span></span><span>
</span><span><span></span><span class="hljs-keyword">const</span><span> content = </span><span class="hljs-keyword">await</span><span> openai.videos.downloadContent(video.id);
</span></span><span>
</span><span><span></span><span class="hljs-keyword">const</span><span> body = content.arrayBuffer();
</span></span><span><span></span><span class="hljs-keyword">const</span><span> buffer = Buffer.from(</span><span class="hljs-keyword">await</span><span> body);
</span></span><span>
</span><span><span> </span><span class="hljs-built_in">require</span><span>(</span><span class="hljs-string">'fs'</span><span>).writeFileSync(</span><span class="hljs-string">'video.mp4'</span><span>, buffer);
</span></span><span>
</span><span><span></span><span class="hljs-built_in">console</span><span>.log(</span><span class="hljs-string">'Wrote video.mp4'</span><span>);</span></span></code>
<code class="language-bash"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span></code><span><span>curl -L </span><span class="hljs-string">"https://api.openai.com/v1/videos/video_abc123/content"</span><span> \
</span></span><span><span>  -H </span><span class="hljs-string">"Authorization: Bearer $OPENAI_API_KEY"</span><span> \
</span></span><span>  --output video.mp4</span></code>
<code class="language-python"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span><span class="react-syntax-highlighter-line-number">9
</span><span class="react-syntax-highlighter-line-number">10
</span><span class="react-syntax-highlighter-line-number">11
</span><span class="react-syntax-highlighter-line-number">12
</span><span class="react-syntax-highlighter-line-number">13
</span><span class="react-syntax-highlighter-line-number">14
</span><span class="react-syntax-highlighter-line-number">15
</span><span class="react-syntax-highlighter-line-number">16
</span><span class="react-syntax-highlighter-line-number">17
</span><span class="react-syntax-highlighter-line-number">18
</span><span class="react-syntax-highlighter-line-number">19
</span><span class="react-syntax-highlighter-line-number">20
</span><span class="react-syntax-highlighter-line-number">21
</span><span class="react-syntax-highlighter-line-number">22
</span><span class="react-syntax-highlighter-line-number">23
</span><span class="react-syntax-highlighter-line-number">24
</span><span class="react-syntax-highlighter-line-number">25
</span><span class="react-syntax-highlighter-line-number">26
</span><span class="react-syntax-highlighter-line-number">27
</span><span class="react-syntax-highlighter-line-number">28
</span><span class="react-syntax-highlighter-line-number">29
</span><span class="react-syntax-highlighter-line-number">30
</span><span class="react-syntax-highlighter-line-number">31
</span><span class="react-syntax-highlighter-line-number">32
</span><span class="react-syntax-highlighter-line-number">33
</span><span class="react-syntax-highlighter-line-number">34
</span><span class="react-syntax-highlighter-line-number">35
</span><span class="react-syntax-highlighter-line-number">36
</span><span class="react-syntax-highlighter-line-number">37
</span><span class="react-syntax-highlighter-line-number">38
</span><span class="react-syntax-highlighter-line-number">39
</span><span class="react-syntax-highlighter-line-number">40
</span><span class="react-syntax-highlighter-line-number">41
</span><span class="react-syntax-highlighter-line-number">42
</span><span class="react-syntax-highlighter-line-number">43
</span><span class="react-syntax-highlighter-line-number">44
</span><span class="react-syntax-highlighter-line-number">45
</span><span class="react-syntax-highlighter-line-number">46
</span><span class="react-syntax-highlighter-line-number">47
</span><span class="react-syntax-highlighter-line-number">48
</span></code><span><span class="hljs-keyword">from</span><span> openai </span><span class="hljs-keyword">import</span><span> OpenAI
</span></span><span><span class="hljs-keyword">import</span><span> sys
</span></span><span><span class="hljs-keyword">import</span><span> time
</span></span><span>
</span><span>
</span><span>openai = OpenAI()
</span><span>
</span><span>video = openai.videos.create(
</span></span><span><span>    model=</span><span class="hljs-string">"sora-2"</span><span>,
</span></span><span><span>    prompt=</span><span class="hljs-string">"A video of a cool cat on a motorcycle in the night"</span><span>,
</span></span><span>)
</span><span>
</span><span><span class="hljs-built_in">print</span><span>(</span><span class="hljs-string">"Video generation started:"</span><span>, video)
</span></span><span>
</span><span>progress = <span class="hljs-built_in">getattr</span>(video, <span class="hljs-string">"progress"</span>, <span class="hljs-number">0</span>)
</span><span>bar_length = <span class="hljs-number">30</span>
</span><span>
</span><span><span class="hljs-keyword">while</span><span> video.status </span><span class="hljs-keyword">in</span><span> (</span><span class="hljs-string">"in_progress"</span><span>, </span><span class="hljs-string">"queued"</span><span>):
</span></span><span>    <span class="hljs-comment"># Refresh status</span><span>
</span></span><span>    video = openai.videos.retrieve(video.<span class="hljs-built_in">id</span>)
</span><span>    progress = <span class="hljs-built_in">getattr</span>(video, <span class="hljs-string">"progress"</span>, <span class="hljs-number">0</span>)
</span><span>
</span><span>    filled_length = <span class="hljs-built_in">int</span>((progress / <span class="hljs-number">100</span>) * bar_length)
</span><span>    bar = <span class="hljs-string">"="</span> * filled_length + <span class="hljs-string">"-"</span> * (bar_length - filled_length)
</span><span>    status_text = <span class="hljs-string">"Queued"</span> <span class="hljs-keyword">if</span> video.status == <span class="hljs-string">"queued"</span> <span class="hljs-keyword">else</span> <span class="hljs-string">"Processing"</span>
</span><span>
</span><span>    sys.stdout.write(<span class="hljs-string">f"
</span><span class="hljs-string hljs-subst">{status_text}</span><span class="hljs-string">: [</span><span class="hljs-string hljs-subst">{bar}</span><span class="hljs-string">] </span><span class="hljs-string hljs-subst">{progress:</span><span class="hljs-string hljs-subst hljs-number">.1</span><span class="hljs-string hljs-subst">f}</span><span class="hljs-string">%"</span>)
</span><span>    sys.stdout.flush()
</span><span>    time.sleep(<span class="hljs-number">2</span>)
</span><span>
</span><span><span class="hljs-comment"># Move to next line after progress loop</span><span>
</span></span><span>sys.stdout.write(<span class="hljs-string">"
</span><span class="hljs-string">"</span>)
</span><span>
</span><span><span class="hljs-keyword">if</span><span> video.status == <span class="hljs-string">"failed"</span>:
</span></span><span>    message = <span class="hljs-built_in">getattr</span>(
</span><span>        <span class="hljs-built_in">getattr</span>(video, <span class="hljs-string">"error"</span>, <span class="hljs-literal">None</span>), <span class="hljs-string">"message"</span>, <span class="hljs-string">"Video generation failed"</span>
</span><span>    )
</span><span>    <span class="hljs-built_in">print</span>(message)
</span><span>    <span class="hljs-keyword">return</span>
</span><span>
</span><span><span class="hljs-built_in">print</span>(<span class="hljs-string">"Video generation completed:"</span>, video)
</span><span><span class="hljs-built_in">print</span>(<span class="hljs-string">"Downloading video content..."</span>)
</span><span>
</span><span>content = openai.videos.download_content(video.<span class="hljs-built_in">id</span>, variant=<span class="hljs-string">"video"</span>)
</span><span>content.write_to_file(<span class="hljs-string">"video.mp4"</span>)
</span><span>
</span><span><span class="hljs-built_in">print</span>(<span class="hljs-string">"Wrote video.mp4"</span>)</span></code>

Artık son video dosyası oynatma, düzenleme veya dağıtım için hazır. İndirme URL'leri üretimden sonra en fazla 1 saat geçerli oluyor. Uzun süreli depolamaya ihtiyacın varsa, dosyayı kendi depolama sistemine zamanında kopyalaman önemli.

Yardımcı Materyalleri İndirme: Thumbnail ve Spritesheetler

Her tamamlanmış video için bir thumbnail (küçük resim) ve bir spritesheet (birleşik görseller) de indirebilirsin. Bunlar, önizlemeler, video scrubber'ları veya katalog gösterimleri için kullanışlı, hafif varlıklar. Ne indirmek istediğini belirtmek için variant sorgu parametresini kullanabilirsin. Varsayılan değer, MP4 için variant=video'dur.

<code class="language-shell"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span></code><span><span class="hljs-meta">#</span><span class="bash"> Download a thumbnail</span><span>
</span></span><span>curl -L "<span class="hljs-https">https://api.openai.com/v1/videos/video_abc123/content?variant=thumbnail</span>" \
</span><span>  -H "<span class="hljs-attribute">Authorization</span>: Bearer $OPENAI_API_KEY" \
</span><span>  --output thumbnail.webp
</span><span><span class="hljs-meta">
</span></span><span><span class="hljs-meta">#</span><span class="bash"> Download a spritesheet</span><span>
</span></span><span>curl -L "<span class="hljs-https">https://api.openai.com/v1/videos/video_abc123/content?variant=spritesheet</span>" \
</span><span>  -H "<span class="hljs-attribute">Authorization</span>: Bearer $OPENAI_API_KEY" \
</span><span>  --output spritesheet.jpg</span></code>

Görsel Referanslarla Video Üretimi: Marka Kimliğinizi Koruyun

Üretim sürecini bir girdi görseliyle yönlendirebilirsin. Bu görsel, videonun ilk karesi işlevi görüyor. Benim bakış açımdan, bu özellik özellikle bir markanın görsel varlığını, bir karakteri veya belirli bir ortamı video çıktısında korumak istediğinde paha biçilmez.

input_reference formatını istek türüne göre seçmelisin:

  • multipart/form-data isteklerinde, yüklenen bir görselle input_reference kullan.
  • Toplu işlem (Batch) dahil olmak üzere application/json isteklerinde, bir JSON nesnesiyle input_reference kullan. JSON formu hem file_id hem de image_url kabul eder.

Görselin, hedef videonun çözünürlüğüne (size) uygun olması gerektiğini unutma.

Desteklenen dosya formatları image/jpeg, image/png ve image/webp.

<code class="language-shell"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span></code><span><span>curl -X POST "<span class="hljs-https">https://api.openai.com/v1/videos</span>" \
</span><span>  -H "<span class="hljs-attribute">Authorization</span>: Bearer $OPENAI_API_KEY" \
</span><span>  -H "<span class="hljs-attribute">Content-Type</span>: multipart/form-data" \
</span><span>  -F prompt="She turns around and smiles, then slowly walks out of the frame." \
</span><span>  -F model="sora-2-pro" \
</span><span>  -F size="1280x720" \
</span><span>  -F seconds="8" \
</span><span>  -F input_reference="@sample_720p.jpeg;type=image/jpeg"</span></code>
OpenAI GPT Image ile üretilen girdi görseli Sora 2 ile üretilen video (GIF'e dönüştürüldü)
Bu görseli indir Prompt: "Arkasına döner, gülümser ve yavaşça kadrajdan çıkar."
Bu görseli indir Prompt: "Buzdolabı kapısı açılır. Sevimli, tombul mor bir canavar içinden çıkar."

Karakterlerle Tutarlı Video Serileri Oluşturma

Karakterler, yeniden kullanılabilir insan dışı bir özneyi yüklemene ve birden fazla üretimde buna referans vermeni sağlar. Bu, benim gibi bir içerik stratejisti için bir hayvanın, maskotun veya nesnenin birden fazla çekimde aynı temel görünüm, stil ve ekran varlığını korumasını istediğinde çok kullanışlı. Bu, marka kimliğini korumak için kritik bir özellik.

Karakter yüklemeleri şu anda en iyi 16:9 veya 9:16 en boy oranında, 720p ila 1080p çözünürlükte, kısa 2 ila 4 saniyelik kliplerle çalışıyor. Karakter kaynak videoları, istenen çıktı ile aynı en boy oranına sahip olduğunda en iyi sonuçları veriyor. En boy oranları farklı olursa, karakter gerilmiş veya bozulmuş görünebilir. Tek bir video en fazla iki karakter içerebilir.

Karakterler, input_reference'tan farklıdır. Bir görsel referansı, tek bir üretimin açılış karesini koşullandırırken, bir karakter varlığı gelecekteki video isteklerinde tekrar kullanılabilir.

Karakteri, POST /v1/videos/characters adresine kısa bir MP4 klibi yükleyerek oluştur. Ardından, bir video oluştururken dönen karakter ID'sini characters dizisine ekle.

İnsan benzerliği gösteren karakter yüklemeleri varsayılan olarak engelleniyor. İnsan benzerliği erişimi için uygunluk hakkında daha fazla bilgi edinmek istersen, hesap yöneticinle veya satış ekibiyle iletişime geçebilirsin.

<code class="language-shell"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span></code><span><span>curl -X POST "<span class="hljs-https">https://api.openai.com/v1/videos/characters</span>" \
</span><span>  -H "<span class="hljs-attribute">Authorization</span>: Bearer $OPENAI_API_KEY" \
</span><span>  -H "<span class="hljs-attribute">Content-Type</span>: multipart/form-data" \
</span><span>  -F "[email protected];type=video/mp4" \
</span><span>  -F "name=Mossy"</span></code>

Prompt'unda karakter adını harfiyen belirt. Yalnızca karakter ID'sini geçmek, karakteri çekimde güvenilir bir şekilde korumak için yeterli değil, benim tecrübeme göre.

Karakterler, input_reference ile birleştirilebilir. Ancak uzantılar (extensions) karakterleri desteklemez.

<code class="language-shell"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span><span class="react-syntax-highlighter-line-number">9
</span><span class="react-syntax-highlighter-line-number">10
</span><span class="react-syntax-highlighter-line-number">11
</span><span class="react-syntax-highlighter-line-number">12
</span></code><span><span>curl -X POST "<span class="hljs-https">https://api.openai.com/v1/videos</span>" \
</span><span>  -H "<span class="hljs-attribute">Authorization</span>: Bearer $OPENAI_API_KEY" \
</span><span>  -H "<span class="hljs-attribute">Content-Type</span>: application/json" \
</span><span>  -d '{
</span></span><span>    "model": "sora-2",
</span></span><span>    "prompt": "A cinematic tracking shot of Mossy, a moss-covered teapot mascot, weaving through a lantern-lit market at dusk.",
</span></span><span>    "size": "1280x720",
</span></span><span>    "seconds": "8",
</span></span><span>    "characters": [
</span></span><span>      { "id": "char_123" }
</span></span><span>    ]
</span></span><span>  }'</span></code>

Tamamlanmış Videoları Uzatma: Hikaye Anlatımınızı Geliştirin

Video uzantıları, mevcut tamamlanmış bir videoyu devam ettirmene ve yeni, birleştirilmiş bir sonuç oluşturmana olanak tanır. Kaynak videoyu POST /v1/videos/extensions çağrısında video alanında belirt, sahnenin nasıl devam etmesi gerektiğini açıklayan bir prompt ekle, ve API tüm kaynak klibi bağlam olarak kullanarak bir sonraki segmenti oluşturur.

Hareket, kamera yönü ve sahne sürekliliğini korumak istediğinde uzantıları kullan. Eğer sadece yeni bir üretimin açılış karesini kontrol etmen gerekiyorsa, bunun yerine input_reference kullan.

Her uzantı 20 saniyeye kadar ekleyebilir. Tek bir video, en fazla altı kez uzatılabilir, bu da toplam 120 saniyelik maksimum bir uzunluk demek. Uzantılar şu anda yalnızca bir kaynak video ve prompt kabul ediyor. Karakterleri veya görsel referansları desteklemiyorlar.

<code class="language-shell"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span><span class="react-syntax-highlighter-line-number">9
</span><span class="react-syntax-highlighter-line-number">10
</span></code><span><span>curl -X POST "<span class="hljs-https">https://api.openai.com/v1/videos/extensions</span>" \
</span><span>  -H "<span class="hljs-attribute">Authorization</span>: Bearer $OPENAI_API_KEY" \
</span><span>  -H "<span class="hljs-attribute">Content-Type</span>: application/json" \
</span><span>  -d '{
</span></span><span>    "video": {
</span></span><span>      "id": "video_abc123"
</span></span><span>    },
</span></span><span>    "prompt": "Continue the scene as the camera rises over the rooftops and reveals the sunrise.",
</span></span><span>    "seconds": "8"
</span></span><span>  }'</span></code>

Mevcut Videoları Düzenleme: Hızlı İterasyon ve Optimizasyon

Düzenleme, mevcut bir videoyu alıp her şeyi sıfırdan yeniden üretmeden hedefli ayarlamalar yapmana olanak tanır. Bir prompt ve bir video referansıyla POST /v1/videos/edits çağrısını yaptığında, sistem orijinal yapıyı, sürekliliği ve kompozisyonu yeniden kullanırken değişikliği uygular. Bu, tek ve iyi tanımlanmış bir değişiklik yaptığında en iyi sonucu verir, çünkü daha küçük, odaklanmış düzenlemeler orijinal sadakati daha iyi korur ve istenmeyen artefakt riskini azaltır.

Video üretimleri daha önce remix endpoint'i kullanılarak düzenlenebiliyordu, ancak bu endpoint artık kullanımdan kaldırılıyor. Yeni entegrasyonlar için lütfen "edits" endpoint'ini kullan.

video alanı, bir video ID'si veya yüklenmiş bir video kabul eder. Bir video ID'si geçersen, API modeli kaynak videodan çıkarır.

Yüklenen videoları düzenleme özelliği yalnızca uygun müşteriler için mevcut. Bu iş akışına ihtiyacın varsa, hesap yöneticinle veya satış ekibimizle iletişime geçmelisin.

<code class="language-shell"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span><span class="react-syntax-highlighter-line-number">7
</span><span class="react-syntax-highlighter-line-number">8
</span><span class="react-syntax-highlighter-line-number">9
</span></code><span><span>curl -X POST "<span class="hljs-https">https://api.openai.com/v1/videos/edits</span>" \
</span><span>  -H "<span class="hljs-attribute">Authorization</span>: Bearer $OPENAI_API_KEY" \
</span><span>  -H "<span class="hljs-attribute">Content-Type</span>: application/json" \
</span><span>  -d '{
</span></span><span>    "video": {
</span></span><span>      "id": "video_abc123"
</span></span><span>    },
</span></span><span>    "prompt": "Shift the color palette to teal, sand, and rust, with a warm backlight."
</span></span><span>  }'</span></code>

Eğer mevcut bir üretimi düzenlemek yerine yeni bir video yüklüyorsan, istekte model parametresini açıkça belirt.

<code class="language-shell"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span><span class="react-syntax-highlighter-line-number">4
</span><span class="react-syntax-highlighter-line-number">5
</span><span class="react-syntax-highlighter-line-number">6
</span></code><span><span>curl -X POST "<span class="hljs-https">https://api.openai.com/v1/videos/edits</span>" \
</span><span>  -H "<span class="hljs-attribute">Authorization</span>: Bearer $OPENAI_API_KEY" \
</span><span>  -H "<span class="hljs-attribute">Content-Type</span>: multipart/form-data" \
</span><span>  -F "[email protected];type=video/mp4" \
</span><span>  -F "model=sora-2-pro" \
</span><span>  -F "prompt=Shift the color palette to teal, sand, and rust, with a warm backlight."</span></code>

Düzenleme, iterasyon için özellikle değerli, çünkü zaten işe yarayanı atmadan iyileştirme yapmanı sağlıyor. Her düzenlemeyi tek ve net bir ayarla sınırlayarak, görsel stili, konu tutarlılığını ve kamera kadrajını sabit tutarken, ruh hali, renk paleti veya sahneleme gibi varyasyonları keşfetmeye devam edebilirsin. Bu, küçük, güvenilir adımlarla cilalı sekanslar oluşturmayı çok daha kolay hale getirir.

Orijinal video Düzenlenmiş video
Prompt: "Canavarın rengini turuncuya çevir."
Prompt: "İkinci bir canavar hemen ardından çıkar."

Toplu API ile Video İşlerini Yönetme: Ölçeklenebilir İçerik Üretimi

Batch API'yi, birçok video render'ını çevrimdışı işleme, inceleme süreçleri veya stüdyo iş akışları için sıraya almak istediğinde kullanmalısın. Toplu girdi dosyasındaki her satır, POST /v1/videos'a göndereceğin JSON istek gövdesiyle aynıdır. Bu da onu çekim listeleri ve planlanmış render kuyrukları için uygun hale getiriyor. Pazarlama ekipleri için içerik üretimini ölçeklendirmenin en verimli yolu bence bu.

Toplu işlemde video üretimi için dikkat etmen gerekenler:

  • Batch şu anda yalnızca POST /v1/videos'u destekler.
  • Batch istekleri, multipart yerine JSON kullanmalıdır.
  • Varlıkları önceden yükle ve JSON istek gövdesinden bunlara referans ver.
  • Multipart input_reference yüklemeleri, video referans girişleri dahil, Batch'te desteklenmez.
  • Toplu olarak üretilen videolar, toplu işlem tamamlandıktan sonra en fazla 24 saat içinde indirilebilir.
<code class="language-jsonl"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span></code><span><span class="hljs-string">{"custom_id":"shot-001","method":"POST","url":"/v1/videos","body":{"model":"sora-2-pro","prompt":"Slow dolly shot through a miniature paper city at blue hour, soft fog, practical window lights flickering on.","size":"1920x1080","seconds":"20"}}
</span></span><span><span class="hljs-string">{"custom_id":"shot-002","method":"POST","url":"/v1/videos","body":{"model":"sora-2-pro","prompt":"Portrait close-up of a red panda chef plating noodles in a stainless-steel kitchen, shallow depth of field.","size":"1080x1920","seconds":"16"}}</span></span></code>

Bir toplu işlem completed (tamamlandı) durumuna ulaştığında, çıktıdaki video işleri zaten completed, failed veya expired gibi bir nihai duruma ulaşmış demektir. İstikrarlı custom_id değerleri kullanarak toplu sonuçları kendi dahili çekim kimliklerin, editoryal kuyruğun veya varlık hattınla eşleştirebilirsin. Ardından, dönen video kimlikleriyle nihai varlıkları indirebilirsin.

Video Kütüphanenizi Yönetme: Düzen ve Erişim Kolaylığı

Videolarını listelemek için GET /videos'u kullanabilirsin. Bu endpoint, benim gibi içerik yöneticileri için, sayfalama ve sıralama için isteğe bağlı sorgu parametrelerini destekler. Böylece aradığın videoyu kolayca bulabilirsin.

<code class="language-shell"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span></code><span><span>curl "<span class="hljs-https">https://api.openai.com/v1/videos?limit=20&amp;after=video_123&amp;order=asc</span>" \
</span><span>  -H "<span class="hljs-attribute">Authorization</span>: Bearer $OPENAI_API_KEY" | jq .</span></code>

Artık ihtiyacın olmayan videoları OpenAI depolama alanından kaldırmak için DELETE /videos/{video_id} kullanabilirsin. Kütüphaneni düzenli tutmak, içerik stratejinin bir parçası olmalı.

<code class="language-shell"><code style="float:left;padding-right:10px"><span class="react-syntax-highlighter-line-number">1
</span><span class="react-syntax-highlighter-line-number">2
</span><span class="react-syntax-highlighter-line-number">3
</span></code><span><span>curl -X DELETE "<span class="hljs-https">https://api.openai.com/v1/videos/REPLACE_WITH_YOUR_VIDEO_ID</span>" \
</span><span>  -H "<span class="hljs-attribute">Authorization</span>: Bearer $OPENAI_API_KEY" | jq .</span></code>

Sora gibi araçlarla yapay zeka destekli video üretimi, dijital pazarlama ve SEO dünyasında gerçekten oyunun kurallarını değiştiriyor. Bu teknolojiyi doğru kullanarak içerik stratejinizi güçlendirebilir, hedef kitlenize daha etkili ulaşabilir ve markanızın dijital büyümesini hızlandırabilirsiniz. Unutma, önemli olan sadece teknolojiye sahip olmak değil, onu nasıl verimli ve stratejik bir şekilde kullanabildiğin. Benimle birlikte bu yolculukta büyümek istersen, doğru yerdesin.

Kendi dijital büyüme ve performans pazarlaması stratejinizi güçlendirmeye hazır mısın? Hemen iletişime geç, birlikte büyüme yol haritası çıkaralım.

Yorumlar yalnızca üyelere açık. Saygılı ve yapıcı bir dil bekliyoruz.

Spam yok Tek tıkla çıkış Haftalık