From ec053549b1b563ab6c5d092a03b072ca56d19c08 Mon Sep 17 00:00:00 2001 From: xufulong <839789740@qq.com> Date: Fri, 29 Jan 2021 22:49:02 +0800 Subject: [PATCH] add subtitle into video --- .../ffmpeg/activity/VideoHandleActivity.kt | 24 ++++++----- .../com/frank/ffmpeg/util/FFmpegUtil.java | 40 +++++++++++-------- .../main/res/layout/activity_video_handle.xml | 7 ++++ app/src/main/res/values-en/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 46 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.kt b/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.kt index 9bd9039..9a8eff8 100644 --- a/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.kt +++ b/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.kt @@ -117,7 +117,8 @@ class VideoHandleActivity : BaseActivity() { R.id.btn_moov, R.id.btn_speed, R.id.btn_flv, - R.id.btn_thumbnail + R.id.btn_thumbnail, + R.id.btn_add_subtitle ) } @@ -148,6 +149,10 @@ class VideoHandleActivity : BaseActivity() { showToast(getString(R.string.wrong_video_format)) return } + val suffix = FileUtil.getFileSuffix(srcFile) + if (suffix == null || suffix.isEmpty()) { + return + } when (viewId) { R.id.btn_video_transform//transform format -> { @@ -156,10 +161,6 @@ class VideoHandleActivity : BaseActivity() { } R.id.btn_video_cut//cut video -> { - val suffix = FileUtil.getFileSuffix(srcFile) - if (suffix == null || suffix.isEmpty()) { - return - } val cutVideo = PATH + File.separator + "cutVideo" + suffix val startTime = 0 val duration = 20 @@ -321,14 +322,17 @@ class VideoHandleActivity : BaseActivity() { } R.id.btn_thumbnail// insert thumbnail into video -> { - val thumbSuffix = FileUtil.getFileSuffix(srcFile) - if (thumbSuffix == null || thumbSuffix.isEmpty()) { - return - } val thumbnailPath = PATH + File.separator + "thumb.jpg" - val thumbVideoPath = PATH + File.separator + "thumbnailVideo" + thumbSuffix + val thumbVideoPath = PATH + File.separator + "thumbnailVideo" + suffix commandLine = FFmpegUtil.insertPicIntoVideo(srcFile, thumbnailPath, thumbVideoPath) } + R.id.btn_add_subtitle//add subtitle into video + -> { + Log.e(TAG, "add subtitle...") + val subtitlePath = PATH + File.separator + "test.ass" + val addSubtitlePath = PATH + File.separator + "subtitle" + suffix + commandLine = FFmpegUtil.addSubtitleIntoVideo(srcFile, subtitlePath, addSubtitlePath) + } else -> { } } diff --git a/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java b/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java index 5f18f58..e78c349 100644 --- a/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java +++ b/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java @@ -95,14 +95,14 @@ public class FFmpegUtil { * @return mux success or not */ public static String[] mediaMux(String videoFile, String audioFile, boolean copy, String muxFile) { - String mixAudioCmd; + String mediaMuxCmd; if (copy) { - mixAudioCmd = "ffmpeg -i %s -i %s -codec copy -y %s"; + mediaMuxCmd = "ffmpeg -i %s -i %s -codec copy -y %s"; } else { - mixAudioCmd = "ffmpeg -i %s -i %s -y %s"; + mediaMuxCmd = "ffmpeg -i %s -i %s -y %s"; } - mixAudioCmd = String.format(Locale.getDefault(), mixAudioCmd, videoFile, audioFile, muxFile); - return mixAudioCmd.split(" "); + mediaMuxCmd = String.format(Locale.getDefault(), mediaMuxCmd, videoFile, audioFile, muxFile); + return mediaMuxCmd.split(" "); } /** @@ -114,9 +114,9 @@ public class FFmpegUtil { */ public static String[] extractAudio(String inputPath, String outputPath) { //-vn: disable video - String mixAudioCmd = "ffmpeg -i %s -acodec copy -vn %s"; - mixAudioCmd = String.format(mixAudioCmd, inputPath, outputPath); - return mixAudioCmd.split(" "); + String extractAudioCmd = "ffmpeg -i %s -acodec copy -vn %s"; + extractAudioCmd = String.format(extractAudioCmd, inputPath, outputPath); + return extractAudioCmd.split(" "); } /** @@ -128,9 +128,9 @@ public class FFmpegUtil { */ public static String[] extractVideo(String inputPath, String outputPath) { //-an: disable audio - String mixAudioCmd = "ffmpeg -i %s -vcodec copy -an %s"; - mixAudioCmd = String.format(mixAudioCmd, inputPath, outputPath); - return mixAudioCmd.split(" "); + String extractVideoCmd = "ffmpeg -i %s -vcodec copy -an %s"; + extractVideoCmd = String.format(extractVideoCmd, inputPath, outputPath); + return extractVideoCmd.split(" "); } /** @@ -360,9 +360,9 @@ public class FFmpegUtil { * @return encode audio success or not */ public static String[] encodeAudio(String inputPath, String outputPath, int sampleRate, int channel) { - String combineVideo = "ffmpeg -f s16le -ar %d -ac %d -i %s %s"; - combineVideo = String.format(Locale.getDefault(), combineVideo, sampleRate, channel, inputPath, outputPath); - return combineVideo.split(" "); + String encodeAudioCmd = "ffmpeg -f s16le -ar %d -ac %d -i %s %s"; + encodeAudioCmd = String.format(Locale.getDefault(), encodeAudioCmd, sampleRate, channel, inputPath, outputPath); + return encodeAudioCmd.split(" "); } /** @@ -551,9 +551,15 @@ public class FFmpegUtil { * @return command of inserting picture */ public static String[] insertPicIntoVideo(String inputPath, String picturePath, String outputPath) { - String buildIndex = "ffmpeg -i %s -i %s -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic %s"; - buildIndex = String.format(buildIndex, inputPath, picturePath, outputPath); - return buildIndex.split(" "); + String insertPicCmd = "ffmpeg -i %s -i %s -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic %s"; + insertPicCmd = String.format(insertPicCmd, inputPath, picturePath, outputPath); + return insertPicCmd.split(" "); + } + + public static String[] addSubtitleIntoVideo(String inputPath, String subtitlePath, String outputPath) { + String subtitleCmd = "ffmpeg -i %s -vf subtitles=%s %s"; + subtitleCmd = String.format(subtitleCmd, inputPath, subtitlePath, outputPath); + return subtitleCmd.split(" "); } /** diff --git a/app/src/main/res/layout/activity_video_handle.xml b/app/src/main/res/layout/activity_video_handle.xml index a142fc0..f2959d0 100644 --- a/app/src/main/res/layout/activity_video_handle.xml +++ b/app/src/main/res/layout/activity_video_handle.xml @@ -85,6 +85,13 @@ android:layout_marginTop="4dp" android:text="@string/video_multi"/> +