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"/>
+
+