私は Android カスタム Rom 開発にまったく慣れていません。コーデック自体の問題と思われるものを確認することについて疑問に思っています。デバッグ ログとアプリ自体のコピーがありますが、既にインストールされているアプリのソース コードを手動で変更する方法はありません。
私は現在、いくつかのファイルを変更して別のデバイスで動作させようとしている Android 12 GSI を使用しています。
デバッグログは次のとおりです。
10-24 03:57:39.788 24987 24987 D RecordingService: onStartCommand com.android.systemui.screenrecord.START
10-24 03:57:39.788 24987 24987 D RecordingService: recording with audio sourceNONE
10-24 03:57:39.790 24987 24987 D ScreenMediaRecorder: start recording
10-24 03:57:39.792 1479 1508 I InputManager-JNI: Setting show touches feature to disabled.
10-24 03:57:39.795 1479 1601 I InputReader: Reconfiguring input devices, changes=SHOW_TOUCHES |
10-24 03:57:39.798 1035 1203 W StagefrightRecorder: stop while neither recording nor paused
10-24 03:57:39.811 24987 24987 W System.err: java.lang.IllegalArgumentException: unsupported size
10-24 03:57:39.811 24987 24987 W System.err: at android.media.MediaCodecInfo$VideoCapabilities.getSupportedFrameRatesFor(MediaCodecInfo.java:1676)
10-24 03:57:39.811 24987 24987 W System.err: at com.android.systemui.screenrecord.ScreenMediaRecorder.getSupportedSize(ScreenMediaRecorder.java:254)
10-24 03:57:39.811 24987 24987 W System.err: at com.android.systemui.screenrecord.ScreenMediaRecorder.prepare(ScreenMediaRecorder.java:130)
10-24 03:57:39.811 24987 24987 W System.err: at com.android.systemui.screenrecord.ScreenMediaRecorder.start(ScreenMediaRecorder.java:270)
10-24 03:57:39.811 24987 24987 W System.err: at com.android.systemui.screenrecord.RecordingService.startRecording(RecordingService.java:235)
10-24 03:57:39.811 24987 24987 W System.err: at com.android.systemui.screenrecord.RecordingService.onStartCommand(RecordingService.java:146)
10-24 03:57:39.812 24987 24987 W System.err: at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4643)
10-24 03:57:39.812 24987 24987 W System.err: at android.app.ActivityThread.access$2000(ActivityThread.java:247)
10-24 03:57:39.812 24987 24987 W System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2095)
10-24 03:57:39.812 24987 24987 W System.err: at android.os.Handler.dispatchMessage(Handler.java:106)
10-24 03:57:39.812 24987 24987 W System.err: at android.os.Looper.loopOnce(Looper.java:201)
10-24 03:57:39.812 24987 24987 W System.err: at android.os.Looper.loop(Looper.java:288)
10-24 03:57:39.812 24987 24987 W System.err: at android.app.ActivityThread.main(ActivityThread.java:7842)
10-24 03:57:39.812 24987 24987 W System.err: at java.lang.reflect.Method.invoke(Native Method)
10-24 03:57:39.812 24987 24987 W System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
まったく関係ありませんが、PC用のマルチプラットフォームのスクリーンミラーリングツールであるscrcpyと同じ問題を調査しています。「c2.android.avc.encoder」を使用するようにデフォルトでエンコーダーを手動で変更するまで、同じ記録の問題が発生しました。
この種の問題について調べることができる便利なサイトはありますか? デバッグ ログしかありませんが、前述の「サポートされていないサイズ」を追跡する方法がありません。私はGoogleのソースコードに行き、それを正確にここで見ました:
android.media.MediaCodecInfo$VideoCapabilities.getSupportedFrameRatesFor(MediaCodecInfo.java:1676)
そして、この関数を見つけました:
private int[] getSupportedSize(final int screenWidth, final int screenHeight, int refreshRate) {
double maxScale = 0;
MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
MediaCodecInfo.VideoCapabilities maxInfo = null;
for (MediaCodecInfo codec : codecList.getCodecInfos()) {
String videoType = MediaFormat.MIMETYPE_VIDEO_AVC;
String[] types = codec.getSupportedTypes();
for (String t : types) {
if (!t.equalsIgnoreCase(videoType)) {
continue;
}
MediaCodecInfo.CodecCapabilities capabilities =
codec.getCapabilitiesForType(videoType);
if (capabilities != null && capabilities.getVideoCapabilities() != null) {
MediaCodecInfo.VideoCapabilities vc = capabilities.getVideoCapabilities();
int width = vc.getSupportedWidths().getUpper();
int height = vc.getSupportedHeights().getUpper();
int screenWidthAligned = screenWidth;
if (screenWidthAligned % vc.getWidthAlignment() != 0) {
screenWidthAligned -= (screenWidthAligned % vc.getWidthAlignment());
}
int screenHeightAligned = screenHeight;
if (screenHeightAligned % vc.getHeightAlignment() != 0) {
screenHeightAligned -= (screenHeightAligned % vc.getHeightAlignment());
}
if (width >= screenWidthAligned && height >= screenHeightAligned
&& vc.isSizeSupported(screenWidthAligned, screenHeightAligned)) {
// Desired size is supported, now get the rate
int maxRate = vc.getSupportedFrameRatesFor(screenWidthAligned,
screenHeightAligned).getUpper().intValue();
if (maxRate < refreshRate) {
refreshRate = maxRate;
}
Log.d(TAG, "Screen size supported at rate " + refreshRate);
return new int[]{screenWidthAligned, screenHeightAligned, refreshRate};
}
// Otherwise, continue searching
double scale = Math.min(((double) width / screenWidth),
((double) height / screenHeight));
if (scale > maxScale) {
maxScale = Math.min(1, scale);
maxInfo = vc;
}
}
}
}
// Resize for max supported size
int scaledWidth = (int) (screenWidth * maxScale);
int scaledHeight = (int) (screenHeight * maxScale);
if (scaledWidth % maxInfo.getWidthAlignment() != 0) {
scaledWidth -= (scaledWidth % maxInfo.getWidthAlignment());
}
if (scaledHeight % maxInfo.getHeightAlignment() != 0) {
scaledHeight -= (scaledHeight % maxInfo.getHeightAlignment());
}
// Find max supported rate for size
int maxRate = maxInfo.getSupportedFrameRatesFor(scaledWidth, scaledHeight)
.getUpper().intValue();
if (maxRate < refreshRate) {
refreshRate = maxRate;
}
Log.d(TAG, "Resized by " + maxScale + ": " + scaledWidth + ", " + scaledHeight
+ ", " + refreshRate);
return new int[]{scaledWidth, scaledHeight, refreshRate};
}
では、サポートされていないサイズ エラーの原因となっているエラーの調査をどこから開始できますか?