我只是想知道是否有人知道如何使用mp4parser在Android上使用mp4音频文件并将其叠加到mp4视频文件上.我已经能够将一个视频附加到另一个视频,现在我只需要覆盖我对组合文件的原始mp4.
任何帮助,将不胜感激!
我正在使用mp4parser Library从剪辑视频中剪切多个剪辑.它正常工作如果我从视频中剪切了一部分.但是当我尝试从视频中剪切多个剪辑时,只有第一个剪辑被正确剪切.其他只有0或1秒.以下是我的代码:
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
import com.coremedia.iso.IsoFile;
import com.coremedia.iso.boxes.TimeToSampleBox;
import com.googlecode.mp4parser.authoring.Movie;
import com.googlecode.mp4parser.authoring.Track;
import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder;
import com.googlecode.mp4parser.authoring.container.mp4.MovieCreator;
import com.googlecode.mp4parser.authoring.tracks.CroppedTrack;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import uk.org.humanfocus.hfi.Beans.TrimPoint;
import uk.org.humanfocus.hfi.Utils.Constants;
import uk.org.humanfocus.hfi.Utils.SimpleThreadFactory;
import uk.org.humanfocus.hfi.Utils.Ut;
/**
* Shortens/Crops a track
*/
public class ShortenExample {
private static final String TAG = …Run Code Online (Sandbox Code Playgroud) 我正在编写一个 Android 应用程序,我有一堆 5-15 秒的 .mp4 文件要剪辑。我一直在尝试使用 Sebastian Annies 的 mp4parser来执行此操作,遵循此处给出的示例代码:ShortenExample。
这是我正在使用的代码(与上面的示例代码非常相似):
public static void clip(Sprinkle sprinkle, double start, double end) throws IOException {
Movie movie = MovieCreator.build(sprinkle.getLocalVideoPath());
// Save all tracks then remove them from movie
List<Track> tracks = movie.getTracks();
movie.setTracks(new LinkedList<Track>());
boolean timeCorrected = false;
// Here we try to find a track that has sync samples. Since we can only start decoding
// at such a sample we SHOULD make sure that the start …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序来使用 mp4parser 合并 n 个视频。要合并的视频是在前置摄像头和后置摄像头中拍摄的。如果我将这些视频合并为单个,则可以很好地合并所有视频,但是通过前置摄像头拍摄的替代视频将合并为倒置。我能做什么。请任何人帮助我。
这是我合并视频的代码:
try {
String f1,f2,f3;
f1 = Environment.getExternalStorageDirectory() + "/DCIM/testvideo1.mp4";// video took via back camera
f2 = Environment.getExternalStorageDirectory() + "/DCIM/testvideo2.mp4";// video took via front camera
f3 = Environment.getExternalStorageDirectory() + "/DCIM/testvideo3.mp4";// video took via front camera
Movie[] inMovies = new Movie[] {
MovieCreator.build(f1),
MovieCreator.build(f2),
MovieCreator.build(f3)
};
List<Track> videoTracks = new LinkedList<Track>();
List<Track> audioTracks = new LinkedList<Track>();
for (Movie m : inMovies) {
for (Track t : m.getTracks()) {
if (t.getHandler().equals("soun")) {
audioTracks.add(t);
}
if (t.getHandler().equals("vide")) { …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用mp4parser库(isoparser-1.0-RC-27.jar和aspectjrt-1.8.0.jar)合并mp4剪辑的应用程序.合并两个剪辑时,它们会成为一个剪辑,但随着更多剪辑被添加到其中,输出mp4会在视频后面显示音频.
这是代码:
Movie[] clips = new Movie[2];
//location of the movie clip storage
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "TestMerge");
//Build the two clips into movies
Movie firstClip = MovieCreator.build(first);
Movie secondClip = MovieCreator.build(second);
//Add both movie clips
clips[0] = firstClip;
clips[1] = secondClip;
//List for audio and video tracks
List<Track> videoTracks = new LinkedList<Track>();
List<Track> audioTracks = new LinkedList<Track>();
//Iterate all the movie clips and find the audio and videos
for (Movie movie: clips) {
for (Track track : …Run Code Online (Sandbox Code Playgroud) 感谢伟大的mp4parser库,我几乎没有与音频视频复用相关的查询。
我们在 android 中使用了下面的代码并尝试过,但我们没有得到预期的输出,我们在特定目录中保留了一个有效的 mp4 文件并尝试但没有运气。
在这里我们得到合并的音频和视频,但音频被附加到视频中。并且附加的音频不会播放,而只是增加了视频的宽度。
来自极客的任何帮助。
这是代码,
File sdCard = Environment.getDataDirectory();
String videofilepath = Environment.getExternalStorageDirectory().toString()+"/video.mp4";
String audiofilepath = Environment.getExternalStorageDirectory().toString()+"/audio.aac";
File file=new File(videofilepath);
H264TrackImpl h264Track = new H264TrackImpl(new FileDataSourceImpl(videofilepath));
AACTrackImpl aacTrack = new AACTrackImpl(new FileDataSourceImpl(audiofilepath));
Movie movie = new Movie();
movie.addTrack(h264Track);
movie.addTrack(aacTrack);
Container mp4file = new DefaultMp4Builder().build(movie);
FileChannel fc = new FileOutputStream(new File(Environment.getExternalStorageDirectory().toString() + "/video.mp4")).getChannel();
mp4file.writeContainer(fc);
fc.close();
Run Code Online (Sandbox Code Playgroud) 我借助MediaCodec和编码视频MediaMuxer.结果我有mp4视频文件.如何设置此mp4文件的元数据(创建时间)?MediaMetadataRetriever只能读取元数据,但不能更改.我不想使用ffmpeg.我试过mp4parser库(这个类),但它对我不起作用.
当视频处理过程中用户从任务管理器中关闭应用程序然后停止处理时,就会出现问题。
我正在使用FFMpeg在android中进行视频文件处理,它工作正常,但是当我在从任务管理器处理过程中关闭应用程序时,视频处理已停止工作,即使我在工作管理器中添加了所有工作。
@Override
public Result doWork() {
shellCommand = new ShellCommand();
ffmpegBinary = new String[] {
FileUtils.getFFmpeg(context).getAbsolutePath()
};
command = concatenate(ffmpegBinary, command);
CommandResult commandResult = getCommandResult(command);
if (command`enter code here`Result.success) {
onSuccess(videoPath);
} else {
onFailure(videoPath);
}
}
//getCommandResult
private CommandResult getCommandResult(String[] command) {
try {
process = shellCommand.run(command, null);
if (process == null) {
return CommandResult.getDummyFailureResponse();
}
checkAndUpdateProcess();
return CommandResult.getOutputFromProcess(process);
} catch(Exception e) {} finally {
Util.destroyProcess(process);
}`enter code here`
return CommandResult.getDummyFailureResponse();
}
Run Code Online (Sandbox Code Playgroud)
据我所知,当应用程序从后台关闭时,父进程会销毁它并同时销毁其所有子进程,FFMpeg正在使用android进程执行命令并在视频处理过程中检查视频文件状态。
期待着听到您的意见。谢谢
android ffmpeg background-process mp4parser android-workmanager
我正在用 ffmpeg 创建四个视频,然后我用 MP4parser 附加它们。我使用 ffmpeg 创建的四个视频的详细信息。
[-loop, 1, -i, Count_1627453922.jpg, -s, 720x1280, -vf, format=yuv420p,fps=25,fade=type=in:duration=1,fade=type=out:duration=1:start_time=1, -t, 2, -preset, ultrafast, CountImageVideo_1627453922.mp4]
Run Code Online (Sandbox Code Playgroud)
[-i, footages_5_1624263519549.mp4, -ss, 00:00:00, -to, 00:00:02, -s, 720x1280, -r, 25, -preset, ultrafast, One_1627453926.mp4]
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试使用 MP4Parser 附加所有这些视频并出现以下错误:
java.io.IOException: Cannot merge VisualSampleEntry[com.googlecode.mp4parser.boxes.mp4.ESDescriptorBox@f3f76444] and VisualSampleEntry[com.googlecode.mp4parser.boxes.mp4.ESDescriptorBox@e20a2ed0]
at com.googlecode.mp4parser.authoring.tracks.AppendTrack.mergeStsds(AppendTrack.java:116)
at com.googlecode.mp4parser.authoring.tracks.AppendTrack.<init>(AppendTrack.java:59)
Run Code Online (Sandbox Code Playgroud)
我做了一些调试,发现了一些可以帮助更好地理解错误的东西。 两个视频的示例描述框
两个视频轨道具有不同的格式(MP4v 和 AVC1)。我是 ffmpeg 和 MP4parser 的新手,所以没有明白我做错了什么。谢谢!提前。
所有视频创建 ffmpeg 命令的日志和 mp4parser 的错误
Copyright (c) 2000-2020 the FFmpeg developers
I: built with Android (6454773 based …Run Code Online (Sandbox Code Playgroud) 此用例是一项服务,手动将一系列未压缩的 .wav 媒体片段编码为.m4s片段,以便通过MPEG-DASH广播,使用ffmpeg将 .wav 压缩为 .aac,并使用sannies/mp4parser将 aac 音频组装为 .m4s 片段。 m4s媒体片段。
我创建了这个公共 GitHub 项目来完整重现该问题。
例如,下面是自定义CustomFragmentMp4Builder.java类。
至关重要的是,我们能够使用序列号(索引)来指定这个单个 .m4s 片段,我们将为每个媒体片段手动递增该序列号。
目标是构建一个包含框类型、和 的.m4s片段。作为参考,我使用mp4parser来检查通过 生成的.m4s片段。该规范可在此处以 .yaml 文件形式提供SegmentTypeBoxSegmentIndexBoxMovieFragmentBoxffmpeg -f hls
我的实现创建 MP4 时没有错误。但是,当单元测试尝试读取 ChunkMp4Builder 刚刚写入临时文件夹的文件时:
java.lang.RuntimeException: A cast to int has gone wrong. Please contact the mp4parser discussion group (3724673092)
at org.mp4parser.tools.CastUtils.l2i(CastUtils.java:30)
at org.mp4parser.support.AbstractBox.parse(AbstractBox.java:97)
at org.mp4parser.AbstractBoxParser.parseBox(AbstractBoxParser.java:116)
at org.mp4parser.BasicContainer.initContainer(BasicContainer.java:107)
at …Run Code Online (Sandbox Code Playgroud)