|
7 | 7 | import java.io.IOException; |
8 | 8 | import java.util.Locale; |
9 | 9 | import java.util.concurrent.TimeUnit; |
| 10 | + |
| 11 | +import com.google.common.base.Joiner; |
10 | 12 | import net.bramp.ffmpeg.builder.FFmpegBuilder; |
11 | 13 | import net.bramp.ffmpeg.builder.Strict; |
12 | 14 | import net.bramp.ffmpeg.fixtures.Samples; |
@@ -146,4 +148,79 @@ public void progress(Progress progress) { |
146 | 148 |
|
147 | 149 | assertEquals(FFmpegJob.State.FINISHED, job.getState()); |
148 | 150 | } |
| 151 | + |
| 152 | + @Test |
| 153 | + public void testHLSVideoEncoding() throws IOException { |
| 154 | + long start = System.currentTimeMillis(); |
| 155 | + FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe); |
| 156 | + FFmpegProbeResult in = ffprobe.probe(Samples.big_buck_bunny_720p_1mb); |
| 157 | + FFmpegBuilder builder = new FFmpegBuilder() |
| 158 | + .setInput(in) |
| 159 | + .overrideOutputFiles(true) |
| 160 | + .addOutput("src/test/resources/net/bramp/ffmpeg/samples/%v/index.m3u8") |
| 161 | + .setPreset("slow") |
| 162 | + .addExtraArgs("-g", "48") |
| 163 | + .addExtraArgs("-sc_threshold","0") |
| 164 | + .addExtraArgs("-map","0:0") |
| 165 | + .addExtraArgs("-map","0:1") |
| 166 | + .addExtraArgs("-map","0:0") |
| 167 | + .addExtraArgs("-map","0:1") |
| 168 | + .addExtraArgs("-map","0:0") |
| 169 | + .addExtraArgs("-map","0:1") |
| 170 | + .addExtraArgs("-map","0:0") |
| 171 | + .addExtraArgs("-map","0:1") |
| 172 | + .addExtraArgs("-map","0:0") |
| 173 | + .addExtraArgs("-map","0:1") |
| 174 | + .addExtraArgs("-map","0:0") |
| 175 | + .addExtraArgs("-map","0:1") |
| 176 | + .addExtraArgs("-s:v:0","1920*1080") |
| 177 | + .addExtraArgs("-b:v:0","1800k") |
| 178 | + .addExtraArgs("-s:v:1","1280*720") |
| 179 | + .addExtraArgs("-b:v:1","1200k") |
| 180 | + .addExtraArgs("-s:v:2","858*480") |
| 181 | + .addExtraArgs("-b:v:2","750k") |
| 182 | + .addExtraArgs("-s:v:3","630*360") |
| 183 | + .addExtraArgs("-b:v:3","550k") |
| 184 | + .addExtraArgs("-s:v:4","426*240") |
| 185 | + .addExtraArgs("-b:v:4","400k") |
| 186 | + .addExtraArgs("-s:v:5","256*144") |
| 187 | + .addExtraArgs("-b:v:5","200k") |
| 188 | + .addExtraArgs("-c:a","copy") |
| 189 | + .addExtraArgs("-var_stream_map","v:0,a:0,name:1080p v:1,a:1,name:720p v:2,a:2,name:480p v:3,a:3,name:360p v:4,a:4,name:240p v:5,a:5,name:144p") |
| 190 | + .addExtraArgs("-master_pl_name","master.m3u8") |
| 191 | + .addExtraArgs("-f","hls") |
| 192 | + .addExtraArgs("-hls_time","10") |
| 193 | + .addExtraArgs("-hls_playlist_type","vod") |
| 194 | + .addExtraArgs("-hls_list_size","0") |
| 195 | + .addExtraArgs("-hls_segment_filename","src/test/resources/net/bramp/ffmpeg/samples/%v/segment%d.ts") |
| 196 | + .done(); |
| 197 | + String actual = Joiner.on(" ").join(ffmpeg.path(builder.build())); |
| 198 | + System.out.println("actual "+actual); |
| 199 | + FFmpegJob job = |
| 200 | + executor.createJob( |
| 201 | + builder, |
| 202 | + new ProgressListener() { |
| 203 | + // Using the FFmpegProbeResult determine the duration of the input |
| 204 | + final double duration_ns = in.getFormat().duration * TimeUnit.SECONDS.toNanos(1); |
| 205 | + @Override |
| 206 | + public void progress(Progress progress) { |
| 207 | + double percentage = progress.out_time_ns / duration_ns; |
| 208 | + // Print out interesting information about the progress |
| 209 | + System.out.println( |
| 210 | + String.format( |
| 211 | + locale, |
| 212 | + "[%.0f%%] status:%s frame:%d time:%s fps:%.0f speed:%.2fx", |
| 213 | + percentage * 100, |
| 214 | + progress.status, |
| 215 | + progress.frame, |
| 216 | + FFmpegUtils.toTimecode(progress.out_time_ns, TimeUnit.NANOSECONDS), |
| 217 | + progress.fps.doubleValue(), |
| 218 | + progress.speed)); |
| 219 | + } |
| 220 | + }); |
| 221 | + job.run(); |
| 222 | + long end = System.currentTimeMillis(); |
| 223 | + long execution = (end - start)/1000; |
| 224 | + System.out.println("Execution time: " + execution + " seconds"); |
| 225 | + } |
149 | 226 | } |
0 commit comments