DJI OSMO ACTION シリーズの HDR って BT.709 なの?

まずは、HDR の規格を確認。


👉 よくわかる、HDR徹底解説! ガンマカーブの違い | EIZO株式会社 hatena-bookmark

10bit なんだけども、どうやっても BT.709 しか撮れない!

以下、HDR モードで撮影した動画の mediainfo


Video
ID                                       : 1
Format                                   : HEVC
Format/Info                              : High Efficiency Video Coding
Format profile                           : Main 10@L5@High
Codec ID                                 : hvc1
Codec ID/Info                            : High Efficiency Video Coding
Duration                                 : 25 s 192 ms
Bit rate                                 : 55.0 Mb/s
Width                                    : 3 840 pixels
Height                                   : 2 160 pixels
Display aspect ratio                     : 16:9
Frame rate mode                          : Constant
Frame rate                               : 29.970 (30000/1001) FPS
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 10 bits
Bits/(Pixel*Frame)                       : 0.221
Stream size                              : 165 MiB (95%)
Encoded date                             : 2024-08-23 08:24:56 UTC
Tagged date                              : 2024-08-23 08:24:56 UTC
Color range                              : Limited
Color primaries                          : BT.709
Transfer characteristics                 : BT.709
Matrix coefficients                      : BT.709
Codec configuration box                  : hvcC

まさか「HDR」というより「HDR モード」(のようなもの) では。。。。

You do not have HDR....is a pure commercial gimmick from producers, saying that they use a double exposure to gain more data...is not.
In fact, even that BT709 is cut, as is not Full but Limited RGB.
The 10bit is only for color, is not HLG or LOG true, but also a mambo-jumbo, as DR is not bigger but contrast is lowered, compressing the shadows and highlights (upper shadows, lower highs).
So...OA4 is not HDR, is not LOG, is not HLG. Is just BT709 with a possibility to get 10bit color profile and that is it.

Still, the good part (always is one, not only negative parts) is that this "LOG" (more like Neutral) profile will allow you to post edit better for scenes that have big contrast, like night footage with a lot of lights.

At this point you do not have a true HDR or LOG action camera on the market, GoPro is worst in dark and Insta ACE being 8bit.

Cheers.

HDR がないのは、プロデューサーが二重露光を使ってより多くのデータを得ると言っているだけの、純粋な商業的な仕掛けです...
実際は違います。BT709 もカットされており、Full ではなく Limited RGB です。10
ビットはカラー専用で、HLG や LOG ではありませんが、DR は大きくならずコントラストが下がり、シャドウとハイライト (上部シャドウ、下部高) が圧縮されるため、非常に複雑です。
つまり、OA4 は HDR でも LOG でも HLG でもありません。10 ビット カラー プロファイルを取得できる可能性のある BT709 であり、それだけです。

それでも、良い点 (常に 1 つあり、悪い点だけではありません) は、この "LOG" (ニュートラルに近い) プロファイルを使用すると、多くのライトがある夜の映像など、コントラストの大きいシーンを後から編集できる点です。

現時点では、市場には真の HDR または LOG アクション カメラはありません。GoPro は暗闇では最悪で、Insta ACE は 8 ビットです。

乾杯。

👉 10bit recording but not recorded in HDR? | DJI FORUM hatena-bookmark

Thank you for your feedback. The Osmo Action 3 does not use common standards such as HLG and HDR10, so some mobile devices and computer software do not recognize footage shot by the product as HDR footage. The product adopts HDR technology for camera sensors which supports shooting with a high dynamic range and 10-bit color depth, and can effectively restore highlight and shadow details. We appreciate your understanding.

ご意見ありがとうございます。Osmo Action 3はHLGやHDR10などの一般的な規格を使用していないため、一部のモバイルデバイスやコンピューターソフトウェアでは、製品で撮影した映像がHDR映像として認識されません。この製品は、カメラセンサーにHDRテクノロジーを採用しており、ハイダイナミックレンジと10ビットの色深度での撮影をサポートし、ハイライトとシャドウのディテールを効果的に復元できます。ご理解のほどよろしくお願いいたします。

It’s their own version of a high dynamic range. Not true HDR where you switch the monitor/tv (mine works in HLG and HDR10) to full brightness and contrast in order to take advantage of the extra range. The Action footage looks as though it flattens dynamic footage but that’s not HDR!

これは、ハイダイナミックレンジの独自のバージョンです。モニター/テレビ (私のモニター/テレビは HLG と HDR10 で動作します) を最大輝度とコントラストに設定して、追加のレンジを利用するという、真の HDR ではありません。アクション映像は、ダイナミックな映像を平坦化しているように見えますが、それは HDR ではありません。

👉 Osmo Action 3 HDR problem | DJI FORUM hatena-bookmark

👉 ffprobe vs mediainfo hatena-bookmark


【SwiftUI】Apple 公式サンプルでは Animation と Transition をどのように組み合わせているのか

画面上にメッセージを表示する View。


import SwiftUI

struct Message: View {
  var text: String

  var body: some View {
    HStack(spacing: 0) {
      Image(systemName: "heart.fill")
        .foregroundStyle(.red)
        .font(.title)
        .padding()
      Text(text)
        .padding(.trailing, 24)
    }
    .clipShape(.capsule)
    .background(
      .regularMaterial.shadow(.drop(radius: 16)),
      in: .capsule
    )
  }
}

#Preview {
  Message(text: "Hello, world!")
}

どのように、アニメーションやトランジションをつけて、生き生きとした画面にしているか。

Apple 公式サンプルを参考に書いてみます。

 

🧑🏻‍💻 Preview 用 View の準備

挙動を何度も確かめるために、

Preview 専用の View を作っておきます。


private struct RefreshPreview: View {
  var text: String

  @State private var id = false

  var body: some View {
    Message(text: text)
      .id(id)

    Button("Refresh") {
      id.toggle()
    }
    .buttonStyle(.borderedProminent)
  }
}

👉 【SwiftUI】View の 強制再描画 hatena-bookmark

ボタンを押すと強制的に画面再描画がされて、

表示開始からの動きを確認できるようになります。

 

🧑🏻‍💻 まずは アニメーション・トランジションなしでつくる


import SwiftUI

struct Message: View {
  var text: String

  @State private var showIcon = false
  @State private var showText = false

  var body: some View {
    HStack(spacing: 0) {
      if showIcon {
        Image(systemName: "heart.fill")
          .foregroundStyle(.red)
          .font(.title)
          .padding()
      }
      if showText {
        Text(text)
          .padding(.trailing, 24)
      }
    }
    .clipShape(.capsule)
    .background(
      .regularMaterial.shadow(.drop(radius: 16)),
      in: .capsule
    )
    .frame(height: 50)
    .onAppear {
      Task {
        showIcon = true
        try await Task.sleep(for: .seconds(1))
        showText = true
        try await Task.sleep(for: .seconds(1))
        showText = false
        try await Task.sleep(for: .seconds(1))
        showIcon = false
      }
    }
  }
}

private struct RefreshPreview: View {
  var text: String

  @State private var id = false

  var body: some View {
    Message(text: text)
      .id(id)

    Button("Refresh") {
      id.toggle()
    }
    .buttonStyle(.borderedProminent)
  }
}

#Preview {
  RefreshPreview(text: "Hello, world !!!")
    .padding()
    .frame(maxWidth: .infinity)
}

アイコン画像とテキスト部分をそれぞれの @State で


アイコン表示 

  ↓

テキスト表示

  ↓

テキスト非表示

  ↓

アイコン非表示

と Task の中で1秒ごとに変化させています。

しかし、アニメーションやトランジションがないので、

スムーズに View が変化しません。

 

🧑🏻‍💻 アニメーション・トランジションをつける



 

🧑🏻‍💻 まとめ

やっぱ、全然違いますね。

👉 sample-backyard-birds/Multiplatform/Birds/BirdFoodHappinessIndicator.swift at main · apple/sample-backyard-birds hatena-bookmark

 

🧑🏻‍💻 追記: 上記のトランジションっている ?

withAnimation() 記述は必要だとして、

transition() 記述は不要なのではないか。

できるだけシンプルにテンプレート化しておきたいので、

0.25 倍の速度で確認してみます。

上がトランジションなし、

下がトランジションあり。

トランジションはあったほうがいいですね。

やっぱり、Apple 公式サンプルコードは偉大。



ffmpeg で動画を明るくしたり横に並べる

ffmpeg コントラスト、明るさ(輝度)、サチュレーションを調整する


ffmpeg -i in.mp4 -vf eq=brightness=0.1:saturation=1.5:contrast=1.5 out.mp4

👉 【ffmpeg】ffmpegコマンドの備忘録(タイムラプス、切り抜き、アニメGIF、ビットレート指定、コーデック、音消し、手振れ補正、明るさ) #ffmpeg - Qiita hatena-bookmark

brightness
Set the brightness expression. The value must be a float value in range -1.0 to 1.0. The default value is "0".

contrast
Set the contrast expression. The value must be a float value in range -1000.0 to 1000.0. The default value is "1".

saturation
Set the saturation expression. The value must be a float in range 0.0 to 3.0. The default value is "1".

👉 FFmpeg Filters Documentation hatena-bookmark

これくらいで。


ffmpeg -i in.mp4 -vf eq=brightness=0.2:contrast=1.15 out.mp4

比較のため、横に並べて結合。


ffmpeg -i in.mp4 -i out.mp4 -filter_complex hstack h.mp4



動画って難しい。

プロは素人には見えないものが見えてる。