Video ffmpeg确定要使用的正确编解码器

Video ffmpeg确定要使用的正确编解码器,video,ffmpeg,Video,Ffmpeg,我正在尝试使用.y4m文件,这些文件是我输入到Chrome中用于播放的。 这是我唯一可以使用的格式 我有一组用于我的用例的.y4m文件,这些文件取自。 例如,假设我使用该文件 我还有一个.mp4文件(特别是来自的示例文件)。我知道如何使用以下命令将small.mp4转换为small.y4m: ffmpeg-y-i small.mp4 small.y4m 我希望结果文件被Chrome接受,就像其他文件一样。 我应该使用哪些选项(以及如何找到它们) 其他信息 ffprobe给出: $ ffprobe

我正在尝试使用
.y4m
文件,这些文件是我输入到Chrome中用于播放的。 这是我唯一可以使用的格式

我有一组用于我的用例的
.y4m
文件,这些文件取自。 例如,假设我使用该文件

我还有一个
.mp4
文件(特别是来自的示例文件)。我知道如何使用以下命令将
small.mp4
转换为
small.y4m

ffmpeg-y-i small.mp4 small.y4m

我希望结果文件被Chrome接受,就像其他文件一样。 我应该使用哪些选项(以及如何找到它们)

其他信息

ffprobe
给出:

$ ffprobe small.y4m 
avprobe version 0.8.13-6:0.8.13-0ubuntu0.13.10.1, Copyright (c) 2007-2014 the Libav developers
  built on Jul 15 2014 13:48:35 with gcc 4.8.1
[yuv4mpegpipe @ 0x23160c0] Estimating duration from bitrate, this may be inaccurate
Input #0, yuv4mpegpipe, from 'small.y4m':
  Duration: N/A, bitrate: N/A
    Stream #0.0: Video: rawvideo, yuv420p, 560x320, 30 fps, 30 tbr, 30 tbn, 30 tbc


$ ffprobe mobile_qcif_7.5fps.y4m
avprobe version 0.8.13-6:0.8.13-0ubuntu0.13.10.1, Copyright (c) 2007-2014 the Libav developers
  built on Jul 15 2014 13:48:35 with gcc 4.8.1
[yuv4mpegpipe @ 0x1e080c0] max_analyze_duration reached
[yuv4mpegpipe @ 0x1e080c0] Estimating duration from bitrate, this may be inaccurate
Input #0, yuv4mpegpipe, from 'mobile_qcif_7.5fps.y4m':
  Duration: N/A, bitrate: N/A
    Stream #0.0: Video: rawvideo, yuv420p, 176x144, PAR 128:117 DAR 1408:1053, 7.50 fps, 7.50 tbr, 7.50 tbn, 7.50 tbc
OS:我在Ubuntu 13.10中使用默认存储库中的ffmpeg:I运行了
sudo-apt-get安装ffmpeg-libavcodec-extra-53

完成控制台输出

$ ffmpeg -y -i small.mp4 small.y4m
ffmpeg version 0.8.13-6:0.8.13-0ubuntu0.13.10.1, Copyright (c) 2000-2014 the Libav developers
  built on Jul 15 2014 13:48:35 with gcc 4.8.1
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'small.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isomavc1
    creation_time   : 2010-03-20 21:29:11
    encoder         : HandBrake 0.9.4 2009112300
  Duration: 00:00:05.56, start: 0.000000, bitrate: 551 kb/s
    Stream #0.0(und): Video: h264 (Constrained Baseline), yuv420p, 560x320, 465 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc
    Metadata:
      creation_time   : 2010-03-20 21:29:11
    Stream #0.1(eng): Audio: aac, 48000 Hz, mono, s16, 83 kb/s
    Metadata:
      creation_time   : 2010-03-20 21:29:11
[buffer @ 0x7274e0] w:560 h:320 pixfmt:yuv420p
Output #0, yuv4mpegpipe, to 'small.y4m':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isomavc1
    creation_time   : 2010-03-20 21:29:11
    encoder         : Lavf53.21.1
    Stream #0.0(und): Video: rawvideo, yuv420p, 560x320, q=2-31, 200 kb/s, 90k tbn, 30 tbc
    Metadata:
      creation_time   : 2010-03-20 21:29:11
Stream mapping:
  Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
frame=  166 fps=  0 q=0.0 Lsize=   43576kB time=5.53 bitrate=64513.5kbits/s    
video:0kB audio:0kB global headers:0kB muxing overhead inf%
文件头

不确定这是否相关,但两个文件的文本内容都是这样开始的:

mobile_qcif_7.5fps.y4m
YUV4MPEG2 W176 H144 F15:2 Ip A128:117
FRAME

small.y4m (invalid)
YUV4MPEG2 W560 H320 F15:2 Ip A0:0 C420mpeg2 XYSCSS=420MPEG2
FRAME
附加实验

$ ffmpeg -y -i small.mp4 small.y4m
ffmpeg version 0.8.13-6:0.8.13-0ubuntu0.13.10.1, Copyright (c) 2000-2014 the Libav developers
  built on Jul 15 2014 13:48:35 with gcc 4.8.1
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'small.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isomavc1
    creation_time   : 2010-03-20 21:29:11
    encoder         : HandBrake 0.9.4 2009112300
  Duration: 00:00:05.56, start: 0.000000, bitrate: 551 kb/s
    Stream #0.0(und): Video: h264 (Constrained Baseline), yuv420p, 560x320, 465 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc
    Metadata:
      creation_time   : 2010-03-20 21:29:11
    Stream #0.1(eng): Audio: aac, 48000 Hz, mono, s16, 83 kb/s
    Metadata:
      creation_time   : 2010-03-20 21:29:11
[buffer @ 0x7274e0] w:560 h:320 pixfmt:yuv420p
Output #0, yuv4mpegpipe, to 'small.y4m':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isomavc1
    creation_time   : 2010-03-20 21:29:11
    encoder         : Lavf53.21.1
    Stream #0.0(und): Video: rawvideo, yuv420p, 560x320, q=2-31, 200 kb/s, 90k tbn, 30 tbc
    Metadata:
      creation_time   : 2010-03-20 21:29:11
Stream mapping:
  Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
frame=  166 fps=  0 q=0.0 Lsize=   43576kB time=5.53 bitrate=64513.5kbits/s    
video:0kB audio:0kB global headers:0kB muxing overhead inf%
将样本
mobile\u qcif_7.5fps.y4m
,将其转换为
.mp4
文件,然后再转换回
。y4m
会生成无效文件(至少对于Chrome而言)

回答@SirDarius回答中的评论

按照@SirDarius的建议;我尝试了以下命令。 他们未能生成有效的文件

# [COMMAND]   # [RESULT] [HEADER]
ffmpeg -i small.mp4 -vf fps=7.5 -an -c:v rawvideo -f yuv4mpegpipe -pix_fmt yuv444p -y small_yuv444p.y4m   # KO YUV4MPEG2 W560 H320 F15:2 Ip A0:0 C444 XYSCSS=444
ffmpeg -i small.mp4 -vf fps=7.5 -an -c:v rawvideo -f yuv4mpegpipe -pix_fmt yuv422p -y small_yuv422p.y4m   # KO YUV4MPEG2 W560 H320 F15:2 Ip A0:0 C422 XYSCSS=422
ffmpeg -i small.mp4 -vf fps=7.5 -an -c:v rawvideo -f yuv4mpegpipe -pix_fmt yuv420p -y small_yuv420p.y4m   # KO YUV4MPEG2 W560 H320 F15:2 Ip A0:0 C420mpeg2 XYSCSS=420MPEG2
ffmpeg -i small.mp4 -vf fps=7.5 -an -c:v rawvideo -f yuv4mpegpipe -pix_fmt yuv411p -y small_yuv411p.y4m   # KO   YUV4MPEG2 W560 H320 F15:2 Ip A0:0 C411 XYSCSS=411

ffmpeg -i small.mp4 -vf fps=7.5 -an -c:v rawvideo -f yuv4mpegpipe -strict -1 -pix_fmt yuv420p9 -y small_yuv420p9.y4m   # KO YUV4MPEG2 W560 H320 F15:2 Ip A0:0 C420p9 XYSCSS=420P9
ffmpeg -i small.mp4 -vf fps=7.5 -an -c:v rawvideo -f yuv4mpegpipe -strict -1 -pix_fmt yuv420p12 -y small_yuv420p12.y4m # KO YUV4MPEG2 W560 H320 F15:2 Ip A0:0 C420p12 XYSCSS=420P12
ffmpeg -i small.mp4 -vf fps=7.5 -an -c:v rawvideo -f yuv4mpegpipe -strict -1 -pix_fmt yuv420p14 -y small_yuv420p14.y4m # KO YUV4MPEG2 W560 H320 F15:2 Ip A0:0 C420p14 XYSCSS=420P14
ffmpeg -i small.mp4 -vf fps=7.5 -an -c:v rawvideo -f yuv4mpegpipe -strict -1 -pix_fmt yuv420p16 -y small_yuv420p16.y4m # KO YUV4MPEG2 W560 H320 F15:2 Ip A0:0 C420p16 XYSCSS=420P16
在尝试其他格式时(如
yuv420p12be
,它在
-pix_fmts
的输出中),我有以下输出(因此我以前的试验):

之后,我还尝试使用十六进制编辑器(bless)编辑小的_yuv420p.y4m文件。我将
C420mpeg2
替换为
C420
,文件被Chrome接受。
420p[number]
中的数字对应什么?没有解释。 有没有办法让
ffmpeg
输出这种头文件

@小天狼星,再次感谢你的帮助

问题

(以防您在此文本块后忘记)


如何将
small.mp4
转换为
small.y4m
文件,该文件与
mobile\u qcif\u 7.5fps.y4m
文件具有相同的属性?

首先,此答案假设从官方网站下载的FFMpeg正式版本。您正在使用的版本是来自avconv fork的包装程序,它试图传播ffmpeg不推荐使用的错误信息

您必须以
yuv4mpegpipe
容器格式使用原始视频

此外,为了具有相同的帧速率,需要使用
fps
过滤器,并且使用
-一个
标志,以便输出视频不会有音轨

以下命令行应产生所需的结果:

 ffmpeg -i small.mp4 -vf fps=7.5 -an -f yuv4mpegpipe -y small.y4m
Mediainfo给出了以下结果:

General
Complete name                            : small.y4m
Format                                   : YUV4MPEG2
File size                                : 10.8 MiB

Video
Format                                   : YUV
Width                                    : 560 pixels
Height                                   : 320 pixels
Display aspect ratio                     : 16:9
Frame rate                               : 7.500 fps
Color space                              : YUV
Scan type                                : Progressive
Compression mode                         : Lossless
将其与链接到的原始y4m文件进行比较:

General
Complete name                            : mobile_qcif_7.5fps.y4m
Format                                   : YUV4MPEG2
File size                                : 2.72 MiB

Video
Format                                   : YUV
Width                                    : 176 pixels
Height                                   : 144 pixels
Display aspect ratio                     : 4:3
Frame rate                               : 7.500 fps
Color space                              : YUV
Scan type                                : Progressive
Compression mode                         : Lossless

啊,臭名昭著的伪ffmpeg,真的是avconv。请使用真正的FFMpeg。静态版本可以在ffmpeg.org网站上找到。@SirDarius所以我要打开一个bug到
ffmpeg
bug跟踪器,看看发生了什么。bug报告在Hello打开,谢谢你的回答。我从源代码编译了
ffmpeg
ppa:jon severinsson/ffmpeg
不起作用)。我声明,
mediainfo
输出现在是相同的。不过还有其他一些东西,它仍然不能与Chrome一起使用。最后,我尝试生成一个视频在Chrome上播放,正如上面所描述的:这个特定的片段(只有420个可以工作——不支持422)对您有意义吗?此外,这可以在420上轻松测试,这里指的是YUV420的像素格式。这是ffmpeg在这里创建的默认格式,但我不确定它在标题中是否正确写入,我们有
C420mpeg2
,而该格式似乎提到了
C420
。。。可能是ffmpeg中的一个bug。。。您帖子中的示例y4m甚至没有
C
参数。您可能希望尝试对生成的文件进行十六进制编辑以删除该参数,或者仅删除
mpeg2
部分。这会让您更深入地了解muxer中发生的情况。。。可能值得尝试使用不同的
-pix_fmt
值,请参见
ffmpeg-pix_fmts
Wow!我编辑了文件:删除
C420mpeg2
works。移除
XYSCSS=420MPEG2
仍会导致Chrome崩溃。删除这两个工程!我还将尝试您的其他建议(我最终需要能够自动执行)。X参数只是一个注释,因此不会以任何方式解释,请参阅