h264 lossless coding

前端 未结 7 1800
长发绾君心
长发绾君心 2020-12-01 00:25

Is it possible to do completely lossless encoding in h264? By lossless, I mean that if I feed it a series of frames and encode them, and then if I extract all the frames fro

相关标签:
7条回答
  • 2020-12-01 00:28

    If x264 does lossless encoding but doesn't like your input format, then your best bet is to use ffmpeg to deal with the input file. Try starting with something like

    ffmpeg -i input.avi -f yuv4mpegpipe -pix_fmt yuv420p -y /dev/stdout \
      | x264 $OPTIONS -o output.264 /dev/stdin
    

    and adding options from there. YUV4MPEG is a lossless uncompressed format suitable for piping between different video tools; ffmpeg knows how to write it and x264 knows how to read it.

    0 讨论(0)
  • 2020-12-01 00:28

    To generate lossless H.264 with HandBrake GUI, set Video Codec: H.264, Constant Quality, RF: 0, H.264 Profile: auto. Though this file is not supported natively by Apple, it can be re-encoded as near-lossless for playback.

    HandBrake GUI's Activity Window:

    H.264 Profile: auto; Encoding at constant RF 0.000000...profile High 4:4:4 Predictive, level 3.0, 4:2:0 8-bit

    H.264 Profile: high; Encoding at constant RF 0.000000...lossless requires high444 profile, disabling...profile High, level 3.0

    0 讨论(0)
  • 2020-12-01 00:29

    I am going to add a late answer to this one after spending all day trying to figure out how to get YUV 4:4:4 pixels into x264. While x264 does accept raw 4:2:0 pixels in a file, it is really quite difficult getting 4:4:4 pixels passed in. With recent versions of ffmpeg, the following works for completely lossless encoding and extraction to verify the encoding.

    First, write your raw yuv 4:4:4 pixels to a file in a planar format. The planes are a set of Y bytes, then the U and V bytes where U and V use 128 as the zero value. Now, invoke ffmpeg and pass in the size of the raw YUV frames as use the "yuv444p" pixel format twice, like so:

    ffmpeg -y -s 480x480 -pix_fmt yuv444p -i Tree480.yuv \
    -c:v libx264 -pix_fmt yuv444p -profile:v high444 -crf 0 \
    -preset:v slow \
    Tree480_lossless.m4v
    

    Once the encoding to h264 and wrapping as a Quicktime file is done, one can extract the exact same bytes like so:

    ffmpeg -y -i Tree480_lossless.m4v -vcodec rawvideo -pix_fmt yuv444p \
    Tree480_m4v_decoded.yuv
    

    Finally, verify the two binary files with diff:

    $ diff -s Tree480.yuv Tree480_m4v_decoded.yuv
    Files Tree480.yuv and Tree480_m4v_decoded.yuv are identical
    

    Just keep in mind that you need to write the YUV bytes to a file yourself, do not let ffmpeg do any conversion of the YUV values!

    0 讨论(0)
  • 2020-12-01 00:29

    FFmpeg has a "lossless" mode for x264, see FFmpeg and x264 Encoding Guide

    § Lossless H.264

    in essence it's -crf 0

    0 讨论(0)
  • 2020-12-01 00:30

    I agree that sometimes the loss in data is acceptable, but it's not simply a matter of how it looks immediately after compression.

    Even a visually imperceptible loss of color data can degrade footage such that color correction, greenscreen keying, tracking, and other post tasks become more difficult or impossible, which add expense to a production.

    It really depends when and how you compress in the pipeline, but ultimately it makes sense to archive the original quality, as storage is usually far less expensive than reshooting.

    0 讨论(0)
  • 2020-12-01 00:36

    If you can't get lossless compression using a h.264 encoder and decoder, perhaps you could look into two alternatives:

    (1) Rather than passing all the data in h.264 format, some people are experimenting with transmitting some of the data with a residual "side channel":

    • (h.264 file) -> h264 decode -> some transformation -> a lossy approximation of the original series of bitmaps
    • (compressed residual file) --> decoder -> a series of lossless residual bitmaps
    • For each pixel in each bitmap, approximate_pixel + residual_pixel = a pixel bit-for-bit equal to the original pixel.

    (2) Use Dirac video compression format in "lossless" mode.

    0 讨论(0)
提交回复
热议问题