2011-06-15 15 views
5

Bir video dosyam var ve bunu H264/AVC olarak kodlamam ve HTTP üzerinden istemciye vermem gerekiyor. İhtiyacım olan şey, istemci tarafındaki oyuncunun videoyu kodlanmış olarak oynatıp oynatabileceğidir.Kodlanmış olarak bir video kodlayıcıdan bir çıkış video dosyası oynatmak mümkün mü?

AFAIK, Oynatıcının video indirilirken oynamasını sağlamak için "moov atomu" video dosyasının yerine konulmalıdır. Bununla birlikte, kodlayıcılar (ex: ffmpeg), kodlamayı tamamladıktan sonra dosya sonunda her zaman "moov atomu" yazar.

Kodlayıcının çıkışının başlangıcında kodlayıcıya "moov atomu" yerleştirme yolu var mı? Veya atom atomu varlığı olmadan video oynatmak mı? ilerlemelere içinde

Teşekkür

LR

cevap

13

Evet, bu ancak sadece bazı konteyner biçimlerde mümkündür. QuickTime/MP4 kabıyla mümkün DEĞİLDİR. Bu formatlarda, moov atomu örnek ofsetleri içerir (mdat atomundaki numunelerin yerleri). Bunlar, video kodlandıktan sonraya kadar bilinmemektedir. VOD ile (isteğe bağlı video), bitmiş dosyayı alabilir ve akış atomunu daha iyi hale getirmek için moov atomunu öne taşıyabilirsiniz. Ancak, anında kodlama yapıyorsanız bunu yapmanın bir yolu yoktur. Bu işi yapmak için, akışa yönelik bir taşıma biçimi kullanmanız gerekir. FLV veya MPEG-TS gibi bir şey işe yarayacaktı. Videoyu ffmpeg'ye geçirir ve bir FLV kapsayıcısında H.264 video üretmesini söylerseniz, bu verileri kodlanmış olarak bir oynatıcıya sunabilirsiniz ve işe yarayacaktır. Tabii ki, HTTP üzerinden hizmet vermek istiyorsanız, muhtemelen kendi sunucunuzu (veya mevcut bir sunucu için bir modül) yazmanız gerekecektir. Yazılı olarak bir dosyaya hizmet veren destekleri bildiğim bir şey yok (sorun, içerik uzunluğu üstbilgisi gönderildiğinde dosya boyutunun bilinmemesidir). Ancak, videoyu RTMP veya RTSP üzerinden sunuyorsanız, bunu mevcut yazılımla çalışabilirsiniz.

+0

Çok teşekkürler! bu çok yararlı. Bir video dosyasını çıkış seçeneği olarak mpegts ile H264 & AAC kodlamaya çalıştım. Tamamlanmamış çıktı dosyası, kodlama sırasında vlc ile çalınabilir. aslında istediğim android üzerinde oynamak, ancak android'in oyuncusu eksik çıktıyı oynayamaz. Sanırım kendi oyuncumu android için uygulamak zorundayım. – jAckOdE

+0

Android'in MPEG-TS akışları için desteği garanti ettiğine inanmıyorum. (Apple-style chunked http MPEG-TS streaming için destek ekliyor olabilirler). Videoyu telefona almak için hangi protokolü kullanıyorsunuz? Android UDP üzerinden RTSP'yi destekliyor (muhtemelen VLC de yapıyor) – wombat57

+0

video dosyası HTTP üzerinden Android telefona aktarılıyor ve android telefona çok küçük yığın olarak kaydediliyor, Apple'ın HTTP akışını seviyor. Diğer protokolü değil HTTP'leri kullanamayız. Android sitesini kontrol ettim ve Android 3.0'dan android destek mpeg-ts diyor: http://developer.android.com/guide/appendix/media-formats.html – jAckOdE

1

Aynı şeyi daha önce ffmpeg ile denedim, ancak başarılı olamadım. Ama vlc ile rtsp ile olsa da, aynı anda Android'de kodlama, dönüştürme ve akışını yapabiliyordum. Ben ilerici yöntemle denemedim. Vlc'de mpeg4 video codec'i, mpega audio codec'i kullandım.

+0

Android'in işleyebileceği bir rtsp akışı oluşturmak için vlc'yi nasıl aldınız? "Desteklenmeyen format"/hata -1010'u almaya devam ediyorum. Sanırım sorun şu ki, mdat atomlarından önce hiçbir atom atomu yok, ama emin değilim! –

2

MOOV Atom'u, dosyanın qt-faststart adlı ffmpeg'de bir aracı kullanarak yeniden yazarak bir dosyanın başına taşıyabilirsiniz. Kendinizi kaynak koddan derlemeniz gerekecektir (ancak en azından Linux/Mac OS'de oldukça kolaydır). Sadece örneğin libavcodec kaynağını indirmek: Tar dosyasını http://libav.org/releases/libav-0.8.tar.xz

ve araçlar dizini gidin qt-faststart.c adlı bir dosya sadece birlikte inşa vardır:

qt-faststart yapmak

şimdi MOOV Atomunu şu şekilde yeniden arayabilirsin: qt-faststart input.mp4 output.mp4

İlgili konular