gpt4 book ai didi

java - 如何合并一个音频和视频文件 -- Xuggler

转载 作者:行者123 更新时间:2023-12-01 19:09:05 24 4
gpt4 key购买 nike

我想使用 Xuggler 将没有音频的视频文件 (flv) 与音频文件 (mp3) 合并。目前,我已经拍摄了两个流,并将这些流的视频和音频部分分别组合起来,就像画中画一样。现在我想将音频和视频文件相互组合。任何建议或提示将不胜感激。我使用的是red5服务器。谢谢。

最佳答案

我开发了一个类,它将接受两个输入,一个音频文件和第二个视频文件,并将它们合并到一个音频视频文件中。

 public static void main(String[] args)
{

String filenamevideo = "f:/testvidfol/video.mp4"; //video file on your disk
String filenameaudio = "f:/testvidfol/audio.wav"; //audio file on your disk


IMediaWriter mWriter = ToolFactory.makeWriter("f:/testvidfol/videowriter.flv"); //output file

IContainer containerVideo = IContainer.make();
IContainer containerAudio = IContainer.make();

if (containerVideo.open(filenamevideo, IContainer.Type.READ, null) < 0)
throw new IllegalArgumentException("Cant find " + filenamevideo);

if (containerAudio.open(filenameaudio, IContainer.Type.READ, null) < 0)
throw new IllegalArgumentException("Cant find " + filenameaudio);

int numStreamVideo = containerVideo.getNumStreams();
int numStreamAudio = containerAudio.getNumStreams();

System.out.println("Number of video streams: "+numStreamVideo + "\n" + "Number of audio streams: "+numStreamAudio );

int videostreamt = -1; //this is the video stream id
int audiostreamt = -1;

IStreamCoder videocoder = null;

for(int i=0; i<numStreamVideo; i++){
IStream stream = containerVideo.getStream(i);
IStreamCoder code = stream.getStreamCoder();

if(code.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO)
{
videostreamt = i;
videocoder = code;
break;
}

}

for(int i=0; i<numStreamAudio; i++){
IStream stream = containerAudio.getStream(i);
IStreamCoder code = stream.getStreamCoder();

if(code.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO)
{
audiostreamt = i;
break;
}

}

if (videostreamt == -1) throw new RuntimeException("No video steam found");
if (audiostreamt == -1) throw new RuntimeException("No audio steam found");

if(videocoder.open()<0 ) throw new RuntimeException("Cant open video coder");
IPacket packetvideo = IPacket.make();

IStreamCoder audioCoder = containerAudio.getStream(audiostreamt).getStreamCoder();

if(audioCoder.open()<0 ) throw new RuntimeException("Cant open audio coder");
mWriter.addAudioStream(0, 0, audioCoder.getChannels(), audioCoder.getSampleRate());

mWriter.addVideoStream(1, 1, videocoder.getWidth(), videocoder.getHeight());

IPacket packetaudio = IPacket.make();

while(containerVideo.readNextPacket(packetvideo) >= 0 ||
containerAudio.readNextPacket(packetaudio) >= 0){

if(packetvideo.getStreamIndex() == videostreamt){

//video packet
IVideoPicture picture = IVideoPicture.make(videocoder.getPixelType(),
videocoder.getWidth(),
videocoder.getHeight());
int offset = 0;
while (offset < packetvideo.getSize()){
int bytesDecoded = videocoder.decodeVideo(picture,
packetvideo,
offset);
if(bytesDecoded < 0) throw new RuntimeException("bytesDecoded not working");
offset += bytesDecoded;

if(picture.isComplete()){
System.out.println(picture.getPixelType());
mWriter.encodeVideo(1, picture);

}
}
}

if(packetaudio.getStreamIndex() == audiostreamt){
//audio packet

IAudioSamples samples = IAudioSamples.make(512,
audioCoder.getChannels(),
IAudioSamples.Format.FMT_S32);
int offset = 0;
while(offset<packetaudio.getSize())
{
int bytesDecodedaudio = audioCoder.decodeAudio(samples,
packetaudio,
offset);
if (bytesDecodedaudio < 0)
throw new RuntimeException("could not detect audio");
offset += bytesDecodedaudio;

if (samples.isComplete()){
mWriter.encodeAudio(0, samples);

}
}

}

}
}

希望对你有帮助。

关于java - 如何合并一个音频和视频文件 -- Xuggler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8890666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com