我正在使用FFMPEG将视频拼接到另一个视频。但是,我观察到很少有这些视频没有在WhatsApp上与消息分享#34; 无法发送此视频。选择其他视频,然后重试"。
我正在使用以下命令进行拼接:
ffmpeg -y -i <input1> -i
<input2> -filter_complex "color=black:input1Width x input1Height:d=(input1time + input2time -1)[base]
;[0:v]setpts=PTS-STARTPTS[v0];[1:v] scale = iw * min(input1Width / iw\\, input1Height / ih):ih * min(input1Width/iw\\,input1Height/ih),
pad=input1Width:input1Height:(input1Width-iw*min(input1Width/iw\\,input1Height/ih))/2:(input1Height -
ih*min(input1Width/iw\\,input1Height/ih))/2,setsar=1:1,format=yuva420p,fade=in:st=0:d=1.0:alpha=1,
setpts=PTS-STARTPTS+((input1Time - 1)/TB)[v1];[base][v0]overlay[tmp]; [tmp][v1]overlay,format=yuv420p[fv];
[0:a][1:a]acrossfade=d=1[fa]" -map [fv] -map [fa] -crf 23 -c:v libx264 -b:v 300K
-preset slow outputvideo.mp4
此处:input1Width - 输入1视频的宽度,input1Height - 输入2视频的高度。
有趣的是,直接在终端上运行此命令可生成一个可在媒体播放器上正常播放的文件,并且我可以在包括WhatsApp在内的各个平台上共享它。
但是,从java代码触发时,相同的命令会在大小,比特率方面产生类似的文件(与直接执行时产生的大致相同)。我使用ProcessBuilder从java运行相同的命令,如:
ProcessBulider stitchVideoCommandArray = new ProcessBuilder(
"ffmpeg", "-y",
"-i", <input1>,
"-i", <input2>,
"-filter_complex", "color=black:" + String.valueOf(width) + "x" + String.valueOf(height) + ":d=" +
String.valueOf(originalVideoTime + ASSET_VIDEOSTREAM_DURATION - CROSS_FADE_TIME_DURATION) + "[base];" +
"[0:v]setpts=PTS-STARTPTS[v0];[1:v]scale=iw*" + String.valueOf(minMultiplicable) + ":ih*" + String.valueOf(minMultiplicable) +
",pad=" + String.valueOf(width) + ":" + String.valueOf(height) + ":(" + String.valueOf(width) + "-iw*" + String.valueOf(minMultiplicable) + "/2" +
"):(" + String.valueOf(height) + "-ih*" + String.valueOf(minMultiplicable) + "/2)" + ",fade=in" +
":st=0:d=" + String.valueOf(CROSS_FADE_TIME_DURATION) + ":alpha=1,setpts=PTS-STARTPTS+((" + String.valueOf(originalVideoTime - CROSS_FADE_TIME_DURATION) +
")/TB)[v1];[base][v0]overlay[tmp];[tmp][v1]overlay,format=yuv420p[fv];[0:a][1:a]acrossfade=d=1[fa]",
"-map", "[fv]",
"-map", "[fa]",
"-c:v", MP4Transcode.MP4VideoStreamEncoder.H264.videoEncoders,
"-b:v", "300K",
"-c:a", MP4Transcode.MP4AudioStreamEncoders.AAC.audioEncoders,
"-b:a", "128K",
"-crf", String.valueOf(constantRateFactor),
"-preset", presetRequired,
outputVideoPath
);
然后我使用此对象使用
执行命令command.start()
并使用
等待退出值command.waitFor()
这也会产生一个文件,我可以在媒体播放器上正确播放,但在WhatsApp上分享视频并不成功。
此外,通过从java执行FFmpeg命令生成的文件生成的媒体文件的响度略有增加。
我无法弄清楚它是否是视频特定问题或其他问题。它只发生在几个随机视频中。
以下是有问题的视频的链接: 输入1 - input1Link 输入2 - inpt2Link
编辑1:
要添加,在java命令中添加-loglevel debug
需要永远,我还没有看到它甚至响应5-6分钟。但是,直接从终端使用它会在处理后快速返回。
答案 0 :(得分:0)
似乎,如果使用EBU R.128过滤器对视频的音频流进行了标准化,则WhatsApp无法处理此类视频。仅在这种情况下,发送失败。就我而言,输入视频之一具有EBU R.128规范化。