ATS-812: PoC FFmpeg (experimental) - add frame width & height

- eg. to demo transcoding of video resolution (or even resize of frame if output to an image)
This commit is contained in:
Jan Vonka
2022-01-07 10:58:42 +00:00
parent ec5a813cd8
commit a0ec144310
4 changed files with 56 additions and 21 deletions

View File

@@ -7,12 +7,16 @@
<table> <table>
<tr><td><div style="text-align:right">file *</div></td><td><input type="file" name="file" /></td></tr> <tr><td><div style="text-align:right">file *</div></td><td><input type="file" name="file" /></td></tr>
<tr><td><div style="text-align:right">targetExtension *</div></td><td><input type="text" name="targetExtension" value="" /></td></tr> <tr><td><div style="text-align:right">targetExtension *</div></td><td><input type="text" name="targetExtension" value="" /></td></tr>
<tr><td><div style="text-align:right">timeOffset</div></td><td><input type="text" name="timeOffset" value="" /> (eg. S or HH:MM:SS)</td></tr>
<tr><td><div style="text-align:right">duration</div></td><td><input type="text" name="duration" value="" /> (eg. S or HH:MM:SS)</td></tr>
<tr><td><div style="text-align:right">frameWidth</div></td><td><input type="text" name="frameWidth" value="" /></td></tr>
<tr><td><div style="text-align:right">frameHeight</div></td><td><input type="text" name="frameHeight" value="" /></td></tr>
<tr><td><div style="text-align:right">timeout</div></td><td><input type="text" name="timeout" value="" /></td></tr> <tr><td><div style="text-align:right">timeout</div></td><td><input type="text" name="timeout" value="" /></td></tr>
<tr><td><div style="text-align:right">testDelay</div></td><td><input type="text" name="testDelay" value="" /></td></tr> <tr><td><div style="text-align:right">testDelay</div></td><td><input type="text" name="testDelay" value="" /></td></tr>
<tr><td><div style="text-align:right">timeOffset</div></td><td><input type="text" name="timeOffset" value="" /></td></tr>
<tr><td><div style="text-align:right">duration</div></td><td><input type="text" name="duration" value="" /></td></tr>
<tr><td></td><td><input type="submit" value="Transform" /></td></tr> <tr><td></td><td><input type="submit" value="Transform" /></td></tr>
</table> </table>
</form> </form>

View File

@@ -29,26 +29,29 @@ package org.alfresco.transformer;
import java.util.StringJoiner; import java.util.StringJoiner;
/** /**
* FFmpeg options builder. * FFmpeg options builder
* *
* https://ffmpeg.org/ffmpeg.html#Options including:
* - https://ffmpeg.org/ffmpeg.html#Main-options
* - https://ffmpeg.org/ffmpeg.html#Video-Options
* - https://ffmpeg.org/ffmpeg-utils.html#time-duration-syntax
*
* @author janv * @author janv
*/ */
// TODO PoC for FFmpeg // TODO PoC for FFmpeg - add other FFmpeg transform options (as needed) ...
public final class FFmpegOptionsBuilder public final class FFmpegOptionsBuilder
{ {
private String timeOffset;
private String duration;
private Integer framesNum; private Integer framesNum;
// TODO PoC - add other FFmpeg transform options ... // temporal
private FFmpegOptionsBuilder() {} private String timeOffset;
private String duration;
public FFmpegOptionsBuilder withTimeOffset(final String timeOffset) // frame resolution
{ private Integer frameWidth;
this.timeOffset = timeOffset; private Integer frameHeight;
return this;
} private FFmpegOptionsBuilder() {}
public FFmpegOptionsBuilder withFramesNum(final Integer framesNum) public FFmpegOptionsBuilder withFramesNum(final Integer framesNum)
{ {
@@ -56,31 +59,54 @@ public final class FFmpegOptionsBuilder
return this; return this;
} }
public FFmpegOptionsBuilder withTimeOffset(final String timeOffset)
{
this.timeOffset = timeOffset;
return this;
}
public FFmpegOptionsBuilder withDuration(final String duration) public FFmpegOptionsBuilder withDuration(final String duration)
{ {
this.duration = duration; this.duration = duration;
return this; return this;
} }
public FFmpegOptionsBuilder withFrameWidth(final Integer frameWidth)
{
this.frameWidth = frameWidth;
return this;
}
public FFmpegOptionsBuilder withFrameHeight(final Integer frameHeight)
{
this.frameHeight = frameHeight;
return this;
}
public String build() public String build()
{ {
StringJoiner args = new StringJoiner(" "); StringJoiner args = new StringJoiner(" ");
if (timeOffset != null)
{
args.add("-ss "+timeOffset);
}
if (framesNum != null) if (framesNum != null)
{ {
args.add("-frames:v "+framesNum); args.add("-frames:v "+framesNum);
} }
if (timeOffset != null)
{
args.add("-ss "+timeOffset);
}
if (duration != null) if (duration != null)
{ {
args.add("-t "+duration); args.add("-t "+duration);
} }
if ((frameWidth != null) && (frameHeight != null))
{
args.add("-s "+frameWidth+"x"+frameHeight);
}
return args.toString(); return args.toString();
} }

View File

@@ -124,6 +124,9 @@ public class FFmpegCommandExecutor extends AbstractCommandExecutor
optionsBuilder.withDuration(transformOptions.get(DURATION)); optionsBuilder.withDuration(transformOptions.get(DURATION));
} }
optionsBuilder.withFrameWidth(stringToInteger(transformOptions.get(FRAME_WIDTH)));
optionsBuilder.withFrameHeight(stringToInteger(transformOptions.get(FRAME_HEIGHT)));
optionsBuilder.withFramesNum(stringToInteger(transformOptions.get(FRAMES_NUM))); optionsBuilder.withFramesNum(stringToInteger(transformOptions.get(FRAMES_NUM)));
final String options = optionsBuilder.build(); final String options = optionsBuilder.build();

View File

@@ -73,8 +73,10 @@ public interface RequestParamMap
String NOT_EXTRACT_BOOKMARKS_TEXT = "notExtractBookmarksText"; String NOT_EXTRACT_BOOKMARKS_TEXT = "notExtractBookmarksText";
String PAGE_LIMIT = "pageLimit"; String PAGE_LIMIT = "pageLimit";
// TODO PoC for FFmpeg // TODO PoC for FFmpeg - effectively target options (note: if we need specific source options, may need extra set)
String TIME_OFFSET = "timeOffset"; String TIME_OFFSET = "timeOffset";
String DURATION = "duration"; String DURATION = "duration";
String FRAMES_NUM = "framesNum"; String FRAMES_NUM = "framesNum";
String FRAME_WIDTH = "frameWidth";
String FRAME_HEIGHT = "frameHeight";
} }