gpt4 book ai didi

android - 在Android上合并单个视频轨道和多个音频轨道

转载 作者:行者123 更新时间:2023-12-03 01:59:17 26 4
gpt4 key购买 nike

这个主意

我正在为电影编辑应用程序创建“保存到设备”功能,该功能将一个视频轨道与一个(或两个)音频轨道合并。

首先,我使用MP4Parser(link)将多个视频片段合并到单个视频轨道中。

然后,有多个音频片段,我想合并为一个音频轨。这些片段不应附加,而应在特定时间合并到单个音轨中。例如。我们有两个音频剪辑(A1,A2)和一个60秒的视频轨道(V1)。这些音频片段可能重叠,或者在它们之间有白噪声。整个音频轨道的长度必须与视频轨道相匹配,最长可以为60秒。 最多可以将100个音频片段添加到音轨1

  • V1-60.0 s
  • A1-0.3 s
  • A2-1.1 s

  • 最后,可能还有一个可选的第二条音频轨,其中也包含一个配乐,适合V1视频轨。

    概要

    它是这样的:

    视频轨1:[--------------------------------------------- -----------------------------------] 60秒

    音轨1:[-A1--A2 ---------------------------------------- ----------------------------] 60秒

    音轨2:[--------------------------------------------- ----------------------------------] 60秒

    问题

    我尝试通过在音频轨道上附加x秒的白噪声(空的wav文件)来解决该问题,以获得如上所述的全长轨道,但是如果声音重叠,那显然是行不通的。我还有什么其他方法可以解决这个问题?
    private static final String OUTPUT = "output.mp4";
    private static final String STORED_LOCATION = "/storage/emulated/0/"

    /**
    * Merges two videos that are located in /storage/emulated/0/ and saves it to the same place with the given parameters. Uses the ffmpeg/javacv library. All this is done in an Async task, not blocking the UI thread but showing a progress bar and a toast at the end.
    *
    */
    private void mergeVideosAsync()
    {
    new AsyncTask<Void, Void, String>()
    {
    @Override
    protected String doInBackground(Void... arg0)
    {
    try
    {
    List<Movie> movieList = new ArrayList<>();
    for (int i = 0; i < mVideoPathList.size(); ++i)
    {
    movieList.add(MovieCreator.build(new File(mVideoPathList.get(i)).getAbsolutePath()));
    }

    List<Track> videoTracks = new LinkedList<>();
    List<Track> audioTracks = new LinkedList<>();

    for (Movie m : movieList)
    {
    for (Track t : m.getTracks())
    {
    if (t.getHandler().equals("soun"))
    {
    //TODO: Add audio tracks here to the merging process
    // audioTracks.add(t);
    }
    if (t.getHandler().equals("vide"))
    {
    videoTracks.add(t);
    }
    }
    }
    Movie result = new Movie();
    if (audioTracks.size() > 0)
    {
    result.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
    }
    if (videoTracks.size() > 0)
    {
    result.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()])));
    }
    BasicContainer out = (BasicContainer) new DefaultMp4Builder().build(result);
    mOutputPath = String.format(STORED_LOCATION + File.separator + OUTPUT_FILENAME);
    WritableByteChannel fc = new RandomAccessFile(mOutputPath, "rw").getChannel();
    out.writeContainer(fc);
    fc.close();
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    return mOutputPath;
    }
    }.execute();
    }

    最佳答案

    如果音轨重叠,则可能会出现问题,因为您需要重新编码音频。
    如果音轨不重叠,则可以使用SilenceTrackImpl:

     Track nuAudio = new AppendTrack(
    audioTrackA1, new SilenceTrackImpl(100),
    audioTrackA2, new SilenceTrackImpl(500),
    audioTrackA3, new SilenceTrackImpl(1000),
    audioTrackA4, new SilenceTrackImpl(50),
    )

    等等。

    关于android - 在Android上合并单个视频轨道和多个音频轨道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32945346/

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