동영상 공유 권장사항

많은 사용자가 Android 기기를 사용하여 동영상을 공유합니다. 수신된 동영상의 화질은 공유 앱에서 처리하는 처리로 인해 원본보다 품질이 떨어지는 경우가 많습니다. 이 문서에서는 공유 동영상의 품질을 최적화하는 방법 및 피해야 할 일반적인 동영상 처리 문제점에 관해 설명합니다. HDR 동영상 콘텐츠 공유를 최적화하려면 이 페이지의 변환기 모듈을 사용하여 HDR을 SDR로 트랜스코딩을 참고하세요.

가장 중요한 작업은 동영상 공유를 준비하는 동안 해상도를 유지하고 가능한 한 오랫동안 동영상 품질을 최대한 높게 유지하는 것입니다.

공유 파이프라인

그림 1은 동영상 공유의 일반적인 흐름을 보여줍니다.

동영상 파이프라인 공유그림 1. 동영상 공유 파이프라인

파이프라인에는 다음 단계가 포함됩니다.

  1. 동영상을 캡처하고 인코딩합니다. 캡처 중에 효과를 추가할 수 있습니다. 또는 이 단계를 건너뛰고 다른 앱에서 사전 녹화된 저장소에서 동영상을 선택할 수 있습니다.
  2. 동영상을 편집, 필터링, 보정 등의 방식으로 처리합니다.
  3. 트랜스코딩에 대비하여 동영상의 크기를 조정하거나 크기를 조절합니다.
  4. 공유할 동영상을 트랜스코딩합니다. 2단계의 필터링은 이 단계의 일부로 적용되는 경우가 많습니다.

파이프라인에서 동영상 품질을 결정하는 매개변수를 설정할 수 있는 두 가지 단계가 있습니다. 즉, 초기 녹화 중 인코딩과 공유 전 트랜스코딩입니다. 또한 최종 트랜스코딩 단계 전에 동영상 크기를 재조정해야 할 수 있으며 이로 인해 품질에도 영향을 미칠 수 있습니다.

추천

표 1은 동영상 품질의 5가지 기본 매개변수와 이를 사용할 수 있는 단계를 보여줍니다.

매개변수 촬영하기 공유
프로필 구매 가능 구매 가능
해상도 구매 가능 구매 가능
비트 전송률 구매 가능 구매 가능
양자화 매개변수 (QP) (드물게) 구매 가능
B 프레임 구매 불가 구매 가능

표 1. 동영상 품질을 결정하는 기본 매개변수

프로필

더 나은 결과를 얻으려면 특정 코덱에서 제공하는 고급 프로필을 사용하세요. AVC 인코딩의 경우 하이 프로필 및 수준 4를 선택합니다.

해상도, 자르기 및 크기 조정

공유를 위해 트랜스코딩하기 전에 크기 조정 단계에서 캡처된 동영상의 초기 해상도를 변경할 수 있지만 크기를 조정하면 동영상의 화질이 저하될 수 있습니다. 확장을 피하고 파이프라인 전체에서 사용할 수 있는 초기 인코딩의 해상도를 선택하는 것이 좋습니다. 또한 과도하게 자르면 이미지의 품질이 낮아진다는 점을 기억하세요(특히 잘린 이미지를 확대하는 경우). 다음 가이드라인을 준수하세요.

  • 적어도 최종 공유 해상도 이상의 해상도를 선택합니다.
  • 모든 중간 단계가 더 큰 해상도 (예: 초기 캡처 시 더 높은 비트 전송률)를 지원하도록 설계되지 않은 이상 캡처 해상도는 공유 해상도를 크게 초과하면 안 됩니다.

    • 공유 인코딩이 720x1280 해상도를 생성하는 경우 720x1280 캡처 해상도를 사용하는 것이 좋습니다.
    • 캡처와 공유 사이의 중간 단계에 자르기가 포함된 경우 1080x1920과 같이 더 높은 캡처 해상도를 사용하고 추가 픽셀을 처리하도록 캡처 비트 전송률을 늘립니다.
  • 과도하게 자르면 이미지 품질이 저하됩니다(특히 잘린 이미지가 확대되는 경우).

  • 낮은 해상도에서 높은 해상도로 업스케일링하지 않습니다. 업스케일링은 존재하지 않는 세부정보를 만들려고 합니다. 처음부터 끝까지 원하는 고해상도를 사용하세요.

  • 확장해야 하는 경우 인코딩 매개변수를 조정합니다. 예를 들어 확대된 해상도의 픽셀 수가 두 배이면 비트 전송률을 두 배로 늘립니다.

해상도와 비트 전송률은 서로 관련이 있습니다. 예를 들어, 궁극적으로 낮은 비트 전송률로 트랜스코딩되는 공유 파이프라인을 통해 고해상도 동영상을 전달하면 낮은 해상도로 시작할 때보다 화질이 낮아집니다. 비트 전송률이 감소함에 따라 해상도가 작을수록 더 나은 결과를 얻기 시작하는 크로스오버 지점이 있습니다.

비트 전송률 해상도
5Mbps 이상 1080x1920
1.5~5Mbps 이상 720x1280
1.5Mbps 이하 SD와 동일합니다. 9:16 가로세로 비율에서 동일한 픽셀 수는 약 416x736입니다.

표 2. 비트 전송률과 해상도 비교

인기 있는 많은 앱이 720p 이하의 해상도에서 동영상을 공유합니다. 데이터에 따르면 720p 해상도가 1.5~5Mbps 사이의 비트 전송률 타겟에 적합한 선택임을 알 수 있습니다.

비트 전송률

녹화

더 높은 인코딩 비트 전송률을 사용하면 동영상 품질이 가장 크게 향상됩니다. 기본 카메라 앱과 일치하는 비트 전송률을 선택하는 것이 좋습니다. 해상도가 720x1280이면 캡처 비트 전송률 10Mbps를 권장합니다.

캡처 인코딩은 기기 내에서 실행되므로 더 높은 비트 전송률을 사용하여 부정적인 영향 없이 대부분의 공유 단계 변환을 보정할 수 있습니다. 더 큰 결과 파일은 기기 내 조작에만 사용됩니다.

표 2와 같이 최종 트랜스코딩 단계에서 비트 전송률을 줄일 수 있습니다.

공유

비트 전송률은 업로드되는 동영상의 크기와 직접적으로 관련되므로 공유 시점에 가장 큰 영향을 미칩니다. 이에 따라 동영상 품질, 파일 전송 시간, 클라우드 스토리지 비용 사이에서 적절한 균형점을 찾아야 합니다.

인코딩 프로필, B-프레임, QP 경계 값 선택도 캡처 중보다 이 단계에서 더 중요합니다.

우수한 화질을 위해 4~5Mbps (해상도 720x1280)의 비트 전송률을 사용하는 것이 좋습니다.

양자화 매개변수 (QP)

Android 12 및 이후 버전에서는 QP 키가 표준화되며 MediaFormat API 및 NDK 미디어 라이브러리에서 사용할 수 있습니다. 이전 Android 버전에서는 QP 조작이 MediaFormat 구성에서 공급업체별 키를 사용하는 프레임워크 함수를 통해서만 사용할 수 있습니다.

녹화

동영상을 캡처하는 동안에는 항상 사용할 수 있는 것은 아닌 QP 설정 대신 비트 전송률 컨트롤을 사용합니다.

10Mbps(720x1280) 캡처 비트 전송률로 QP 설정을 조정하지 않는 것이 좋습니다. 캡처 비트 전송률이 상당히 낮은 경우(720x1280의 경우 5Mbps 미만) QP 설정을 40으로 설정하면 코덱이 타겟 비트 전송률을 너무 자주 초과하도록 하지 않고 품질을 향상시키는 것이 좋습니다.

공유

특히 비트 전송률이 4Mbps 미만인 경우 최대 QP 한도를 40으로 설정하는 것이 좋습니다. 이렇게 하면 인코딩된 동영상의 최소 화질은 보장되지만 비트 전송률이 더 높아질 수 있습니다. 비트 전송률은 동영상의 복잡도에 따라 달라집니다. 공유 앱은 생성된 동영상의 비트 전송률에 약간의 차이를 허용할 수 있지만 특정 기준점을 넘어서는 증가는 허용하지 않을 수 있습니다.

덜 제한적인 (높은) 최대 QP 한도로 공유할 수 있도록 동영상을 다시 인코딩하여 비트 전송률 증가를 제한할 수 있습니다. 이렇게 하면 코덱이 품질을 포기하고 동영상의 다른 부분을 보존할 수 있는 자유가 부여됩니다. 트랜스코딩 작업이므로 공유할 동영상을 다시 인코딩할 수 있습니다. 공유하려는 동영상을 이미 캡처했습니다.

단점은 이러한 다양한 매개변수를 사용하여 트랜스코딩 단계를 반복하면 동영상 공유에 걸리는 시간이 증가한다는 것입니다. 이러한 지연 시간을 줄이는 한 가지 방법은 부분 트랜스코딩된 동영상을 살펴보고 비트 전송률 초과의 허용 범위를 벗어나지 않는지 확인하는 것입니다. 그렇지 않은 경우 트랜스코딩을 중지하고 더 적절한 QP 매개변수로 다시 시도할 수 있습니다.

B-프레임 및 인코딩 프로필

공유 단계에서 그리고 Android 10 이상을 실행할 때만 B-프레임을 사용하는 것이 좋습니다.

모든 기기가 기본 또는 상위 프로필을 지원하는 것은 아니므로 앱은 CodecCapabilities를 사용하여 지원되는 인코딩 프로필을 확인해야 합니다. AVC 인코더에서 지원하는 최고 프로필(High > Main > Baseline)을 사용하세요. 가장 안전한 결과를 얻으려면 기준 프로필을 사용할 때 B 프레임(KEY_LATENCY 또는 KEY_MAX_B_FRAMES)을 구성하지 마세요. 일부 인코더의 구성이 실패할 수 있기 때문입니다.

다음 코드 세그먼트는 AVC 인코더를 구성하는 데 사용될 'MediaFormat format'를 가정합니다.

Android 10

API 29 이상

지원되는 가장 높은 프로필을 사용하고 B-frame 매개변수를 1로 설정합니다.

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);

이러한 상황에서는 KEY_LATENCY를 설정하면 안 됩니다.

Android 8, 8.1, 9

API 26, 27, 28

지원되는 가장 높은 프로필을 사용하되 B-프레임 생성을 사용 중지합니다. 이렇게 하면 이러한 시스템 버전의 MediaMuxer에 있는 일부 제한사항이 수용됩니다.

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);

KEY_LATENCY 값은 코덱이 B-프레임을 생성하는 것을 금지하지만 다른 코덱 효율성은 여전히 활용합니다.

앱이 MediaMuxer를 사용하여 최종 출력 파일을 어셈블하지 않는 경우 KEY_LATENCY 값을 1이 아닌 2로 설정하여 B-프레임을 사용 설정할 수 있습니다. 이렇게 하면 코덱이 B-프레임을 생성할 수 있습니다.

Android 7.1 이하

API 25 이하

가장 안전한 결과를 얻으려면 기준 프로필을 사용하세요.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

버전 7 이전의 Android AOSP는 기준 프로필만 지원합니다. 그러나 OEM이 일부 기기에서 공급업체별 프로필을 사용하여 기본/하이 프로필을 사용 설정했을 수 있습니다.

앱이 MediaMuxer를 사용하지 않는 경우 코덱이 지원하는 경우 기본 또는 높은 프로필을 사용할 수 있습니다. B-프레임 수를 제어하는 공개 형식 키는 없습니다.

Transformer 모듈을 사용하여 HDR을 SDR로 트랜스코딩

Android 13 (API 수준 33)부터는 Jetpack Media3의 Transformer 모듈을 사용하여 HDR을 지원하지 않는 앱, 서비스, 기기에 HDR 콘텐츠를 공유하는 것이 좋습니다. Transformer 모듈은 입력 HDR 동영상 스트림을 SDR에 톤 매핑하고 결과를 MP4로 저장하는 방식으로 작동하므로 세부정보나 이미지 밝기를 손실하지 않고 성공적으로 재생할 수 있습니다.

참고: Android 12 (API 수준 32)부터 Android 7.0 (API 수준 24)까지의 시스템 버전을 타겟팅하는 기기에서는 변환기 모듈이 다르게 작동합니다. 기기에서 HDR을 지원하면 앱은 톤 매핑 없이 콘텐츠를 재생합니다. 기기에서 HDR을 지원하지 않으면 HDR 톤 매핑이 지원되지 않음을 나타내는 오류가 발생합니다.

다음 코드는 입력을 SDR에 톤 매핑하고 입력 형식 (예: H.264/AVC)으로 다시 인코딩하는 Transformer를 설정합니다.

Kotlin

val transformer = Transformer.Builder(context)
    .setTransformationRequest(
        TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build()

Java

Transformer transformer = new Transformer.Builder(context)
    .setTransformationRequest(
        new TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build();

톤 매핑 기능을 사용해 보려면 Transformer 데모 앱을 참고하세요.

MediaCodec를 사용하여 톤 매핑을 설정할 수도 있지만 구현이 더 복잡합니다. 자세한 내용은 MediaCodec 참조 문서를 확인하세요.