基本上我想旋转视频,取决于使用哪个相机拍摄它.
前置摄像头镜像为90度,后置摄像头显示正常.目前它将根据第一个剪辑设置Matrix.如果第一个剪辑是使用前置摄像头制作的,它会将所有剪辑旋转到270度,反之亦然.
这是一个示例代码(rotations是一个包含剪辑旋转的ArrayList):
for (TrackBox trackBox : trackBoxes) {
Log.d("TRACKBOX", String.valueOf(rotations.get(i)));
//trackBox.getTrackHeaderBox().setMatrix(Matrix.ROTATE_90);
if (rotations.get(i) == 90) { //if clip was made with back camera
trackBox.getTrackHeaderBox().setMatrix(Matrix.ROTATE_90);
Log.d("Rotating to:", "90 degrees");
} else if (rotations.get(i) == 270) { // if clip was made with front camera
trackBox.getTrackHeaderBox().setMatrix(Matrix.ROTATE_270);
Log.d("Rotating to:", "270 degrees");
}
m.addTrack(new Mp4TrackImpl(trackBox));
}
inMovies[i] = m;
Run Code Online (Sandbox Code Playgroud) 我一直在合并两个视频。我正在从手机存储中提取视频,并以字符串形式传递它们。然后这些视频被合并。我已经看到,如果我要合并从摄像机拍摄的视频,那么它工作正常,合并进行得很好。但是,一旦获取并尝试合并其他视频文件,就会引发异常
java.io.IOException: Cannot merge AudioSampleEntry{bytesPerSample=0, bytesPerFrame=0, bytesPerPacket=0, samplesPerPacket=0, packetSize=0, compressionId=0, soundVersion=0, sampleRate=24000, sampleSize=16, channelCount=2, boxes=[com.googlecode.mp4parser.boxes.mp4.ESDescriptorBox@fffffab7]} and AudioSampleEntry{bytesPerSample=0, bytesPerFrame=0, bytesPerPacket=0, samplesPerPacket=0, packetSize=0, compressionId=0, soundVersion=0, sampleRate=22050, sampleSize=16, channelCount=2, boxes=[com.googlecode.mp4parser.boxes.mp4.ESDescriptorBox@fffff9fb]} 08-22 15:59:03.347 27476-27558/in.pinelane.myhovi W/System.err: at com.googlecode.mp4parser.authoring.tracks.AppendTrack.mergeStsds(AppendTrack.java:116) 08-22 15:59:03.347 27476-27558/in.pinelane.myhovi W/System.err: at com.googlecode.mp4parser.authoring.tracks.AppendTrack.<init>(AppendTrack.java:59)
Run Code Online (Sandbox Code Playgroud)
并且不会在存储设备中保存任何文件。另外,如果视频的高度不同,那么它会给我这个例外,并且也不会保存任何文件
E/isoparser: AppendTrack:height differs
Run Code Online (Sandbox Code Playgroud)
这是我的活动,您可以看到以下代码:
//asynch task to merge the videos in background
class MergeVideos extends AsyncTask<ArrayList<File>, Integer, String>{
@Override
protected String doInBackground(ArrayList<File>... params) {
ArrayList<Movie> inMovies = new ArrayList<>();
for(File file : params[0]){
Movie movie = MovieCreator.build(file.getAbsolutePath());
inMovies.add(movie);
}
List<Track> …Run Code Online (Sandbox Code Playgroud) 我有多个文件的录音.我正在使用com.googlecode.mp4parser:isoparser:1.0.2库创建一个连续的音频文件.
以下是我的代码:
String mediaKey = isAudio ? "soun" : "vide";
List<Movie> listMovies = new ArrayList<>();
for (String filename : sourceFiles) {
listMovies.add(MovieCreator.build(filename));
}
List<Track> listTracks = new LinkedList<>();
for (Movie movie : listMovies) {
for (Track track : movie.getTracks()) {
if (track.getHandler().equals(mediaKey)) {
listTracks.add(track);
}
}
}
Movie outputMovie = new Movie();
if (!listTracks.isEmpty()) {
outputMovie.addTrack(new AppendTrack(listTracks.toArray(new Track[listTracks.size()])));
}
Container container = new DefaultMp4Builder().build(outputMovie);
FileChannel fileChannel = new RandomAccessFile(String.format(targetFile), "rw").getChannel();
container.writeContainer(fileChannel);
fileChannel.close();
Run Code Online (Sandbox Code Playgroud)
以上代码在Android手机上运行.由于其移动环境,每个应用程序都有内存限制.
上面代码的问题是当我从文件加载Movie并为小文件创建一个轨道列表时它工作正常.但随着文件大小的增加,操作开始变得无响应.它需要大量的内存.如何才能提高内存效率.他们是否可以像在Java中进行文件复制操作那样在小流中执行此操作?
更新:
为了在文件中录制音频,我使用androidMediaRecorder进行此操作,输出格式为 …
我正在尝试在android中使用mp4parser库,我遇到了一些困难.我猜它是因为mp4parser是一个基于java的项目,还没有适应android.
PS-mp4parser在世界范围内传播,甚至被Instagram使用
我的结论基于以下代码:
public PropertyBoxParserImpl(String... customProperties) {
InputStream is = getClass().getResourceAsStream("/assets/isoparser-default.properties");
mapping = new Properties();
try {
mapping.load(is);
Enumeration<URL> enumeration = Thread.currentThread().getContextClassLoader().getResources("isoparser-custom.properties");
while (enumeration.hasMoreElements()) {
URL url = enumeration.nextElement();
mapping.load(url.openStream());
}
for (String customProperty : customProperties) {
mapping.load(getClass().getResourceAsStream(customProperty));
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
isoparser-default.properties是一个reflaction映射:
hint=com.coremedia.iso.boxes.TrackReferenceTypeBox(type)
cdsc=com.coremedia.iso.boxes.TrackReferenceTypeBox(type)
meta-ilst=com.coremedia.iso.boxes.apple.AppleItemListBox()
-----name=com.coremedia.iso.boxes.apple.AppleNameBox()
-----mean=com.coremedia.iso.boxes.apple.AppleMeanBox()
-----data=com.coremedia.iso.boxes.apple.AppleDataBox()
rmra=com.coremedia.iso.boxes.apple.AppleReferenceMovieBox()
rmda=com.coremedia.iso.boxes.apple.AppleReferenceMovieDescriptorBox()
rmdr=com.coremedia.iso.boxes.apple.AppleDataRateBox()
rdrf=com.coremedia.iso.boxes.apple.AppleDataReferenceBox()
Run Code Online (Sandbox Code Playgroud)
在android中你不能发起一个带有本地类和mehod的链接的url并像上面的PropertyBoxParserImpl()那样加载它.
所以我猜我只需要改变以下功能,有没有人在使用mp4parser时遇到这些问题?
我有一些分析 mp4 流的工具,例如 Mp4 Explorer、MP4 Reader 和 mp4viewer(通过 python)。他们都不能显示 avc3 有什么结构但我可以看到 avc1。所以我一直在寻找来自 ISO-ISE 14496-12、QuickTime 格式(来自苹果的文档)的 avc3 并找到 avc1 和 avcC。在搜索时,使用 demuxer 之类的东西的人留下了一条提交消息,例如“现在支持 avc3 的 mp4 框”。但这就是全部:( 我在哪里可以找到和查看参考文档?
有人知道avc3吗?
我想按顺序合并多个视频并使用mp4parser获取一个视频
,但无法开始使用它...我在文件 gradle 中添加了 -implementation 'org.mp4parser:isoparser:1.9.27'
按照示例,无法找到
电影()
然后我意识到我需要添加插件aspectj-rt.jar,但找不到它的最新信息
请帮我解决这个问题。我在网络中看到许多开发人员成功地使用这个库来处理视频文件。但没有任何地方有关于如何开始使用 mp4parser 的信息。