Отказ от ответственности: я рассмотрел следующий вопрос: 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%
ffmpeg
output) - yuv420p. Что заставляет вас говорить, что это yuv422p? Кроме того, ваша командная строка и выводffmpeg
не совпадают. В командной строке указано, что вы выводите yuv422p, но в выводеffmpeg
указано, что это yuv420p. - person Cornstalks   schedule 30.06.2016AVFrame
. - person Cornstalks   schedule 01.07.2016