bei Xuggler this sample code Sehen, sollte folgendes Video H.264 zu kodieren arbeiten und Mux es in einen Behälter MPEG2TS:
IMediaWriter writer = ToolFactory.makeWriter("output.ts");
writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_H264, width, height);
for (...)
{
BufferedImage mjpeg = ...;
writer.encodeVideo(0, mjpeg);
}
Der Behälter ist aus der Dateierweiterung erraten, wird der Codec explizit angegeben.
Audio und Video Mux, Sie so etwas tun würde:
writer.addVideoStream(videoStreamIndex, 0, videoCodec, width, height);
writer.addAudioStream(audioStreamIndex, 0, audioCodec, channelCount, sampleRate);
while (... have more data ...)
{
BufferedImage videoFrame = ...;
long videoFrameTime = ...; // this is the time to display this frame
writer.encodeVideo(videoStreamIndex, videoFrame, videoFrameTime, DEFAULT_TIME_UNIT);
short[] audioSamples = ...; // the size of this array should be number of samples * channelCount
long audioSamplesTime = ...; // this is the time to play back this bit of audio
writer.encodeAudio(audioStreamIndex, audioSamples, audioSamplesTime, DEFAULT_TIME_UNIT);
}
In diesem Fall glaube ich Ihren Code zur Verschachtelung der Audio- und Video verantwortlich ist: Sie können entweder encodeAudio() anrufen möchten oder encodeVideo() bei jedem Durchgang durch die Schleife, basierend auf den verfügbaren Daten (ein Stück Audio-Samples oder ein Video-Frame) hat einen früheren Zeitstempel.
Es gibt eine andere, untergeordnete API, die Sie möglicherweise verwenden, basierend auf IStreamCoder, die mehr Kontrolle über verschiedene Parameter gibt. Ich denke nicht, dass du das benutzen musst.
die spezifischen Fragen zu beantworten, die Sie gestellt:
(1) "ein BufferedImage Encode (M/JPEG) in einen h.264-Stream" - Sie, dass bereits herausgefunden, writer.addVideoStream(..., ICodec.ID.CODEC_ID_H264)
stellt sicher, dass Sie die H. bekommen 264 Codec.Um einen Transportstream (MPEG2 TS) Container zu erhalten, rufen Sie einfach makeWriter()
mit einem Dateinamen mit der Erweiterung .ts.
(2) "herauszufinden, was das" BufferedImage-Äquivalent "für eine rohe Audio-Feed ist" - das ist entweder ein kurzes [] oder IAudioSamples Objekt (beide scheinen zu funktionieren, aber IAudioSamples muss aus einem gebaut werden IBuffer, der viel weniger einfach ist).
(3) "Encode diese Audioklasse in einen AAC-Audio-Stream" - Aufruf writer.addAudioStream(..., ICodec.ID.CODEC_ID_AAC, channelCount, sampleRate)
(4) "multiplex sowohl Strom in die gleichen MPEG-TS Container" - Aufruf makeWriter()
mit einem .ts Dateinamen, die legt den Containertyp fest. Für eine korrekte Audio-/Videosynchronisation müssen Sie wahrscheinlich encodeVideo()/encodeAudio() in der richtigen Reihenfolge aufrufen.
P.S. Übergeben Sie immer zuerst das früheste verfügbare Audio/Video. Wenn Sie beispielsweise Audio - Chunks haben, die 440 Samples lang sind (bei 44000 Hz Sample - Rate, 440/44000 = 0,01 Sekunden) und Video bei genau 25 fps (1/25 = 0,04 Sekunden), würden Sie sie dem Writer in geben diese Reihenfolge:
video0 @ 0.00 sec
audio0 @ 0.00 sec
audio1 @ 0.01 sec
audio2 @ 0.02 sec
audio3 @ 0.03 sec
video1 @ 0.04 sec
audio4 @ 0.04 sec
audio5 @ 0.05 sec
... und so weiter
die meisten Abspielgeräte sind wahrscheinlich mit dem Strom ok, solange die aufeinanderfolgenden Audio/Video-Zeitstempel relativ nahe sind, aber das ist, was Sie tun würden, für einen perfekten Mux.
P.S. Es gibt einige Dokumente, auf die Sie sich beziehen können: Xuggler class diagram, ToolFactory, IMediaWriter, ICodec.
Ich hätte auch im Bounty-Text erwähnen sollen, dass ich nicht mit Xuggler "verheiratet" bin. Wenn jemand herausfinden kann, wie ich alles, was ich brauche (in der Bounty angegeben) mit sagen wir "ffmpeg" oder einem anderen Tool, das unter Linux laufen kann, machen kann, würde mich auch diese Lösung interessieren! – IAmYourFaja
können Sie die Kamera über USB anschließen? Weißt du, ob xuggle die Eingabe von deiner Kamera über SPI – rajneesh
Ja auf USB & SPI lesen kann, aber ich diese Option aus Gründen, die außerhalb des Bereichs dieser Frage liegen, nicht verwenden werde. Das einzige, was wirklich wichtig ist, ist, dass ich rohe Audio- und Video-Bitstreams in Form von byte [] 's bekommen werde. – IAmYourFaja