免责声明: 我看过以下问题, FFMPEG: RGB to YUV conversion by binary ffmpeg and by code C++ give different results 但它没有帮助,它不适用于我,因为我没有使用SwsContext或任何东西。
按照http://dranger.com/ffmpeg/的前几个教程,我创建了一个简单的程序来读取视频,对其进行解码,然后在解码帧时,它将原始yuv值写入文件(无填充),使用成功解码帧后AVFrame提供的数据。更具体地说,我将数组AVFrame->data[0]
,AVFrame->data[1]
和AVFrame->data[2]
写入文件,即我只是将Y值,然后是U值,然后将V值附加到文件。该文件原来是yuv422p格式。
当我使用ffmpeg(相同版本的ffmpeg)命令行工具将同一原始视频转换为原始yuv格式时,两个yuv文件的大小相同,但内容不同。
仅供参考,我可以使用yuv播放器播放两个yuv文件,它们看起来也一样。
以下是我使用ffmpeg命令行工具将原始视频转换为yuv视频的确切命令
~/bin/ffmpeg -i super-short-video.h264 -c:v rawvideo -pix_fmt yuv422p "super-short-video-yuv422p.yuv"
导致这种字节差异的原因是什么?有没有其他方法可以使用ffmpeg工具将原始视频转换为yuv,但也许我需要使用不同的设置?
转换为yuv格式时的Ffmpeg输出:
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%