1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
/*
* Copyright (C) 2014 Yuya Tanaka
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.ypresto.androidtranscoder.format;
import android.media.MediaCodecInfo;
import android.media.MediaFormat;
// Refer for example: https://gist.github.com/wobbals/3990442
// Refer for preferred parameters: https://developer.apple.com/library/ios/documentation/networkinginternet/conceptual/streamingmediaguide/UsingHTTPLiveStreaming/UsingHTTPLiveStreaming.html#//apple_ref/doc/uid/TP40008332-CH102-SW8
// Refer for available keys: (ANDROID ROOT)/media/libstagefright/ACodec.cpp
public class MediaFormatPresets {
private static final int LONGER_LENGTH_960x540 = 960;
private MediaFormatPresets() {
}
// preset similar to iOS SDK's AVAssetExportPreset960x540
@Deprecated
public static MediaFormat getExportPreset960x540() {
MediaFormat format = MediaFormat.createVideoFormat("video/avc", 960, 540);
format.setInteger(MediaFormat.KEY_BIT_RATE, 5500 * 1000);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
return format;
}
/**
* Preset similar to iOS SDK's AVAssetExportPreset960x540.
* Note that encoding resolutions of this preset are not supported in all devices e.g. Nexus 4.
* On unsupported device encoded video stream will be broken without any exception.
* @param originalWidth Input video width.
* @param originalHeight Input video height.
* @return MediaFormat instance, or null if pass through.
*/
public static MediaFormat getExportPreset960x540(int originalWidth, int originalHeight) {
int longerLength = Math.max(originalWidth, originalHeight);
int shorterLength = Math.min(originalWidth, originalHeight);
if (longerLength <= LONGER_LENGTH_960x540) return null; // don't upscale
int residue = LONGER_LENGTH_960x540 * shorterLength % longerLength;
if (residue != 0) {
double ambiguousShorter = (double) LONGER_LENGTH_960x540 * shorterLength / longerLength;
throw new OutputFormatUnavailableException(String.format(
"Could not fit to integer, original: (%d, %d), scaled: (%d, %f)",
longerLength, shorterLength, LONGER_LENGTH_960x540, ambiguousShorter));
}
int scaledShorter = LONGER_LENGTH_960x540 * shorterLength / longerLength;
int width, height;
if (originalWidth >= originalHeight) {
width = LONGER_LENGTH_960x540;
height = scaledShorter;
} else {
width = scaledShorter;
height = LONGER_LENGTH_960x540;
}
MediaFormat format = MediaFormat.createVideoFormat("video/avc", width, height);
format.setInteger(MediaFormat.KEY_BIT_RATE, 5500 * 1000);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
return format;
}
}
|