Audio 将png与mp4 ffmpeg合并缺少音频

Audio 将png与mp4 ffmpeg合并缺少音频,audio,ffmpeg,overlay,mp4,Audio,Ffmpeg,Overlay,Mp4,我使用ffmpeg合并mp4和png,我使用两种方式: 使用命令 String cmd=“-y-i”+in.mp4+“-i”+in.png+”-filter_complex[0:v][1:v]overlay=0:0[out]-预设veryfast-map[out]-map 1:0-map 0:0-编解码器:一个副本“+out.mp4 输出文件缺少音频: 使用命令: String cmd = "-y -i " + in.mp4 + " -i " + in.png + " \

我使用ffmpeg合并mp4和png,我使用两种方式:

  • 使用命令

    String cmd=“-y-i”+in.mp4+“-i”+in.png+”-filter_complex[0:v][1:v]overlay=0:0[out]-预设veryfast-map[out]-map 1:0-map 0:0-编解码器:一个副本“+out.mp4

  • 输出文件缺少音频:

  • 使用命令:

    String cmd = "-y -i " + in.mp4 + " -i " + in.png + " \
                  -filter_complex [0:v][1:v]overlay=0:0[out] -preset veryfast \
                  -map [out] -map 0:a? -codec:a copy " + out.mp4;
    
    String cmd=“-y-i”+in.mp4+“-i”+in.png+”-filter_complex[0:v][1:v]overlay=0:0[out]-预设veryfast-map[out]-映射0:a-编解码器:a副本“+out.mp4

  • =>有音频,但某些mp4文件无法与png文件合并 日志:流映射“0:a”不匹配任何流


    我的命令缺少什么

    首先,您需要使用ffmpeg检查
    mp4
    信息。然后,您将选择是否使用0:a命令

                ffmpeg.execute(("-i " + filepath).split(" "), new ExecuteBinaryResponseHandler() {
                        boolean hasAudio = false;
    
                        @Override
                        public void onProgress(String s) {
    
                           if (s.matches("^\\s+Stream.+Audio.+")) {
                                hasAudio = true;
                            }
                        }
    
                        @Override
                        public void onFinish() {
    
                        }
                    });
    

    首先,您需要使用ffmpeg来检查
    mp4
    info。然后,您将选择是否使用0:a命令

                ffmpeg.execute(("-i " + filepath).split(" "), new ExecuteBinaryResponseHandler() {
                        boolean hasAudio = false;
    
                        @Override
                        public void onProgress(String s) {
    
                           if (s.matches("^\\s+Stream.+Audio.+")) {
                                hasAudio = true;
                            }
                        }
    
                        @Override
                        public void onFinish() {
    
                        }
                    });
    

    您可以通过一个命令执行此操作:

    String cmd = "-y -i " + in.mp4 + " -i " + in.png + " \
                  -filter_complex [0:v][1:v]overlay=0:0[out] -preset veryfast \
                  -map [out] -map 0:a? -codec:a copy " + out.mp4;
    

    将ffmpeg转换为仅映射存在的流。

    您可以通过一个命令执行此操作:

    String cmd = "-y -i " + in.mp4 + " -i " + in.png + " \
                  -filter_complex [0:v][1:v]overlay=0:0[out] -preset veryfast \
                  -map [out] -map 0:a? -codec:a copy " + out.mp4;
    

    将ffmpeg转换为仅映射存在的流。

    您能给出ffprobe的完整结果吗?您应该显示每个命令的完整控制台输出/日志。否则就不可能提供答案。我在这里发现了问题。如果视频没有声音,我们无法为其放置映射0:a(日志:流映射“0:a”不匹配流)。现在我检查这个视频是否有音频,以使过滤器正确。但是它会占用更多的时间。您能给出ffprobe的完整结果吗?您应该显示每个命令的完整控制台输出/日志。否则就不可能提供答案。我在这里发现了问题。如果视频没有声音,我们无法为其放置映射0:a(日志:流映射“0:a”不匹配流)。现在我检查这个视频是否有音频,以使过滤器正确。但这会占用更多的时间。感谢您的回答,此解决方案将起作用,但我们必须使用ffmpeg运行两个命令。感谢您的回答,此解决方案将起作用,但我们必须使用ffmpeg运行两个命令。