Skip to content

Commit f1b3a5e

Browse files
Update Combine Video Query to support different size and fps videos.
1 parent 3490a0b commit f1b3a5e

File tree

3 files changed

+52
-14
lines changed

3 files changed

+52
-14
lines changed

SSffmpegVideoOperation/src/main/java/com/simform/videooperations/FFmpegQueryExtension.kt

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -134,27 +134,49 @@ public class FFmpegQueryExtension {
134134
}
135135

136136
fun combineVideos(paths: ArrayList<Paths>, width: Int?, height: Int?, output: String): Array<String> {
137-
val inputs: ArrayList<String> = ArrayList()
138-
var query: String? = ""
139-
var queryAudio: String? = ""
140-
for (i in 0 until paths.size) {
141-
//for input
137+
val inputs = ArrayList<String>()
138+
var query = ""
139+
var queryAudio = ""
140+
val videoInputs = mutableListOf<String>()
141+
val audioInputs = mutableListOf<String>()
142+
var hasMissingAudio = false
143+
144+
for (i in paths.indices) {
145+
// Add input
142146
inputs.add("-i")
143147
inputs.add(paths[i].filePath)
144148

145-
//for video setting with width and height
146-
query = query?.trim()
147-
query += "[" + i + ":v]scale=${width}x${height},setdar=$width/$height[" + i + "v];"
149+
// Video scaling + fps normalization
150+
query += "[$i:v]scale=${width}x${height},setdar=${width}/${height},fps=${FFmpegQueryExtension().FRAME_RATE}[$i" + "v];"
151+
videoInputs.add("[$i" + "v]")
148152

149-
//for video and audio combine {without audio this query not supported so applied this function}
150-
queryAudio = queryAudio?.trim()
151-
queryAudio += if (paths[i].isImageFile) {
152-
"[" + i + "v][" + paths.size + ":a]"
153+
// Audio stream
154+
val audioLabel = "[$i" + "a]"
155+
if (paths[i].hasAudio) {
156+
queryAudio += "[$i:a]aresample=async=1,asetpts=N/SR/TB$audioLabel;"
153157
} else {
154-
"[" + i + "v][" + i + ":a]"
158+
queryAudio += "[${paths.size}:a]aresample=async=1,asetpts=N/SR/TB$audioLabel;"
159+
hasMissingAudio = true
155160
}
161+
audioInputs.add(audioLabel)
156162
}
157-
return getResult(inputs, query, queryAudio, paths, output)
163+
164+
// Add anullsrc only if any input lacks audio
165+
if (hasMissingAudio) {
166+
inputs.add("-f")
167+
inputs.add("lavfi")
168+
inputs.add("-t")
169+
inputs.add("0.1")
170+
inputs.add("-i")
171+
inputs.add("anullsrc")
172+
}
173+
174+
// Build concat input block: [0v][0a][1v][1a]...
175+
val concatInputs = paths.indices.joinToString("") { i ->
176+
"${videoInputs[i]}${audioInputs[i]}"
177+
}
178+
179+
return getResult(inputs, query, queryAudio + concatInputs, paths, output)
158180
}
159181

160182
private fun getResult(inputs: java.util.ArrayList<String>, query: String?, queryAudio: String?, paths: ArrayList<Paths>, output: String): Array<String> {

SSffmpegVideoOperation/src/main/java/com/simform/videooperations/Paths.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ package com.simform.videooperations
77
class Paths {
88
var filePath : String = ""
99
var isImageFile : Boolean = false
10+
var hasAudio: Boolean = false
1011
}

app/src/main/java/com/simform/videoimageeditor/videoProcessActivity/CombineVideosActivity.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ class CombineVideosActivity : BaseActivity(R.layout.activity_combine_videos, R.s
116116
}
117117

118118
paths.isImageFile = false
119+
paths.hasAudio = hasAudio(paths.filePath)
119120
pathsList.add(paths)
120121
}
121122

@@ -145,4 +146,18 @@ class CombineVideosActivity : BaseActivity(R.layout.activity_combine_videos, R.s
145146
})
146147
}
147148
}
149+
150+
private fun hasAudio(filePath: String): Boolean {
151+
val retriever = MediaMetadataRetriever()
152+
return try {
153+
retriever.setDataSource(filePath)
154+
val hasAudio = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO)
155+
hasAudio == "yes"
156+
} catch (e: Exception) {
157+
e.printStackTrace()
158+
false
159+
} finally {
160+
retriever.release()
161+
}
162+
}
148163
}

0 commit comments

Comments
 (0)