Ver Fonte

Support encode multi scenes video

Wayne há 6 anos atrás
pai
commit
07dc4a1db2

+ 2 - 2
src/main/java/com/bomostory/sceneeditmodule/MovieEditActivity.kt

@@ -259,11 +259,11 @@ class MovieEditActivity : AppCompatActivity(), DialogInterface.OnDismissListener
 
         val fileName = "test${System.currentTimeMillis()}.mp4"
         val outputFile = File(Environment.getExternalStorageDirectory(), fileName)
-        val s = scene ?: return
+        val project = project ?: return
 
         SuperMovieMaker().make(
                 outputFile,
-                s,
+                project,
                 musics,
                 scaledWidth,
                 scaleHeight,

+ 31 - 23
src/main/java/com/bomostory/sceneeditmodule/SuperMovieMaker.kt

@@ -7,6 +7,7 @@ import android.graphics.Paint
 import android.util.Log
 import com.bomostory.sceneeditmodule.MovieEditActivity.Companion.FPS
 import com.bomostory.sceneeditmodule.basicdata.Music
+import com.bomostory.sceneeditmodule.basicdata.Project
 import com.bomostory.sceneeditmodule.basicdata.Scene
 import com.example.exportmedia.MediaHelper
 import com.example.exportmedia.data.AudioSource
@@ -26,7 +27,7 @@ class SuperMovieMaker {
 
     fun make(
             outputFile: File,
-            scene: Scene,
+            project: Project,
             musics: List<Music>,
             scaleWidth: Int,
             scaleHeight: Int,
@@ -37,7 +38,7 @@ class SuperMovieMaker {
             movieBuilder.audioSources = generateAudioSource(musics)
 
             val inputSceneStatus = LinkedHashMap<Int, Int>()
-            val frameDataList = generateFrameDataList(scene)
+            val frameDataList = generateFrameDataList(project)
             var bitmapIndex = 0
             val permitCount = frameDataList.size
             val semaphore = Semaphore(permitCount)
@@ -50,8 +51,11 @@ class SuperMovieMaker {
                 inputSceneStatus[i] = frameData.repeat
                 semaphore.acquire()
                 Completable.create {
-                    val bitmap = drawScene(scene, frameData.x, scaleWidth, scaleHeight)
-                    movieBuilder.addImage(i, bitmap!!).blockingSubscribe()
+                    project?.story?.apply {
+                        val scene = scenes[frameData.sceneIndex]
+                        val bitmap = drawScene(scene, frameData.x, scaleWidth, scaleHeight)
+                        movieBuilder.addImage(i, bitmap!!).blockingSubscribe()
+                    }
                     it.onComplete()
                 }
                         .subscribeOn(Schedulers.computation())
@@ -83,28 +87,32 @@ class SuperMovieMaker {
         return audioSources
     }
 
-    fun generateFrameDataList(scene: Scene): List<FrameData> {
+    fun generateFrameDataList(project: Project): List<FrameData> {
         val frameDataList = ArrayList<FrameData>()
-        scene.record?.apply {
-            var x = 0
-            var trackPosition = -1
-
-            for (t in 0..period step ((1f / FPS) * 1000).toLong()) {
-                for (track in tracks) {
-                    if (t >= track.time && tracks.indexOf(track) > trackPosition) {
-                        x = track.positionX
-                        trackPosition = tracks.indexOf(track)
+        var index = 0
+        project.story?.scenes?.forEach { scene ->
+            val sceneIndex = index++
+            scene.record?.apply {
+                var x = 0
+                var trackPosition = -1
+
+                for (t in 0..period step ((1f / FPS) * 1000).toLong()) {
+                    for (track in tracks) {
+                        if (t >= track.time && tracks.indexOf(track) > trackPosition) {
+                            x = track.positionX
+                            trackPosition = tracks.indexOf(track)
+                        }
                     }
-                }
 
-                if (frameDataList.isEmpty()) {
-                    frameDataList.add(FrameData(x, 1))
-                } else {
-                    val frameData = frameDataList.last()
-                    if (frameData.x == x) {
-                        frameData.repeat++
+                    if (frameDataList.isEmpty()) {
+                        frameDataList.add(FrameData(sceneIndex, x, 1))
                     } else {
-                        frameDataList.add(FrameData(x, 1))
+                        val frameData = frameDataList.last()
+                        if (frameData.x == x) {
+                            frameData.repeat++
+                        } else {
+                            frameDataList.add(FrameData(sceneIndex, x, 1))
+                        }
                     }
                 }
             }
@@ -170,5 +178,5 @@ class SuperMovieMaker {
         return sceneBitmap
     }
 
-    data class FrameData(var x: Int, var repeat: Int)
+    data class FrameData(val sceneIndex: Int, val x: Int, var repeat: Int)
 }