FFMPEG: преобразование видеофайла в YUV с помощью двоичного ffmpeg и кода C ++ дает разные результаты

Отказ от ответственности: я рассмотрел следующий вопрос: FFMPEG: преобразование RGB в YUV с помощью двоичного ffmpeg и кода C ++ дает разные результаты, но это не помогло и не применимо к меня, потому что я не использую SwsContext или что-то еще.

После первых нескольких руководств http://dranger.com/ffmpeg/ я создал простую программу, которая читает видео, декодирует его, а затем, когда кадр декодируется, он записывает необработанные значения yuv в файл (без заполнения), используя данные, предоставленные AVFrame после того, как мы успешно декодировали кадр. Чтобы быть более конкретным, я записываю массивы AVFrame->data[0], AVFrame->data[1] и AVFrame->data[2] в файл, т.е. я просто добавляю значения Y, затем значения U, затем значения V в файл. Файл оказывается формата yuv422p.

Когда я конвертирую одно и то же исходное видео в необработанный формат yuv с помощью инструмента командной строки ffmpeg (та же версия ffmpeg), два файла yuv имеют одинаковый размер, но различаются по содержанию.

К вашему сведению, я могу воспроизводить оба файла yuv с помощью проигрывателя yuv, и они тоже выглядят одинаково.

Вот точная команда, которую я запускаю для преобразования исходного видео в видео yuv с помощью инструмента командной строки ffmpeg.

 ~/bin/ffmpeg -i super-short-video.h264 -c:v rawvideo -pix_fmt yuv422p  "super-short-video-yuv422p.yuv"

Что вызывает эту разницу в байтах и ​​можно ли ее исправить? Возможно, есть другой способ конвертировать исходное видео в yuv с помощью инструмента ffmpeg, но, возможно, мне нужно использовать другие настройки?

Вывод ffmpeg при преобразовании в формат yuv:

ffmpeg version N-80002-g5afecff Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.1)
  configuration: --prefix=/home/me/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/me/ffmpeg_build/include --extra-ldflags=-L/home/me/ffmpeg_build/lib --bindir=/home/me/bin --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree --extra-cflags=-pg --extra-ldflags=-pg --disable-stripping
  libavutil      55. 24.100 / 55. 24.100
  libavcodec     57. 42.100 / 57. 42.100
  libavformat    57. 36.100 / 57. 36.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 45.100 /  6. 45.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Input #0, h264, from 'super-short-video.h264':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: h264 (High), yuv420p, 1280x720, 25 fps, 25 tbr, 1200k tbn
[rawvideo @ 0x24f6fc0] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
Output #0, rawvideo, to 'super-short-video-yuv422p.yuv':
  Metadata:
    encoder         : Lavf57.36.100
    Stream #0:0: Video: rawvideo (Y42B / 0x42323459), yuv422p, 1280x720, q=2-31, 200 kb/s, 25 fps, 25 tbn
    Metadata:
      encoder         : Lavc57.42.100 rawvideo
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native))
Press [q] to stop, [?] for help
frame=   50 fps=0.0 q=-0.0 Lsize=   90000kB time=00:00:02.00 bitrate=368640.0kbits/s speed=11.3x    
video:90000kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%

person Anny G    schedule 29.06.2016    source источник
comment
Ваш ввод и вывод (согласно ffmpeg output) - yuv420p. Что заставляет вас говорить, что это yuv422p? Кроме того, ваша командная строка и вывод ffmpeg не совпадают. В командной строке указано, что вы выводите yuv422p, но в выводе ffmpeg указано, что это yuv420p.   -  person Cornstalks    schedule 30.06.2016
comment
Прошу прощения, я снова запустил команду и вставил последний вывод и точную команду, которую использовал.   -  person Anny G    schedule 30.06.2016
comment
У меня все еще та же проблема. Два файла yuv разные :(   -  person Anny G    schedule 30.06.2016
comment
Спасибо за добавление правильной команды и вывода. К сожалению, ваш вопрос все еще не включает минимальный, полный и проверяемый пример. Невозможно сказать вам, что вы делаете неправильно, не увидев кода, который вы используете для записи видеофайла из AVFrame.   -  person Cornstalks    schedule 01.07.2016