2015-01-05 4 views
1

Я пытаюсь использовать файлы .y4m, которые я передаю в Chrome для игры. Это единственный формат, который я могу использовать.ffmpeg определить правильный кодек для использования

У меня есть набор .y4m файлов, которые работают для моего использования, взятых с here. Например, скажем, что я использую файл mobile_qcif_7.5fps.y4m.

У меня также есть файл .mp4 (в частности, образец small.mp4 файл от techslides). Я знаю, как преобразовать 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: Я использую FFmpeg в Ubuntu 13.10 из репозитория по умолчанию: Я побежал sudo apt-get install 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 

Дополнительный эксперимент

Принимая образец mobile_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), у меня был следующий вывод (следовательно, мои предыдущие исследования):

$ ffmpeg -i small.mp4 -vf fps=7.5 -an -c:v rawvideo -f yuv4mpegpipe -pix_fmt yuv420p12be -y small_yuv420p12be.y4m 
ffmpeg version N-68884-g3ebd76a Copyright (c) 2000-2015 the FFmpeg developers 
    built on Jan 6 2015 11:03:21 with gcc 4.8 (Ubuntu/Linaro 4.8.1-10ubuntu9) 
    configuration: 
    libavutil  54. 16.100/54. 16.100 
    libavcodec  56. 19.100/56. 19.100 
    libavformat 56. 18.100/56. 18.100 
    libavdevice 56. 3.100/56. 3.100 
    libavfilter  5. 6.100/5. 6.100 
    libswscale  3. 1.101/3. 1.101 
    libswresample 1. 1.100/1. 1.100 
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x21d0220] overread end of atom 'colr' by 1 bytes 
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.57, start: 0.000000, bitrate: 551 kb/s 
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1/0x31637661), yuv420p(tv, bt709), 560x320, 465 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc (default) 
    Metadata: 
     creation_time : 2010-03-20 21:29:11 
     encoder   : JVT/AVC Coding 
    Stream #0:1(eng): Audio: aac (LC) (mp4a/0x6134706D), 48000 Hz, mono, fltp, 83 kb/s (default) 
    Metadata: 
     creation_time : 2010-03-20 21:29:11 
[yuv4mpegpipe @ 0x21d8180] ERROR: yuv4mpeg can only handle yuv444p, yuv422p, yuv420p, yuv411p and gray8 pixel formats. And using 'strict -1' also yuv444p9, yuv422p9, yuv420p9, yuv444p10, yuv422p10, yuv420p10, yuv444p12, yuv422p12, yuv420p12, yuv444p14, yuv422p14, yuv420p14, yuv444p16, yuv422p16, yuv420p16 and gray16 pixel formats. Use -pix_fmt to select one. 
Output #0, yuv4mpegpipe, to 'small_yuv420p12be.y4m': 
    Metadata: 
    major_brand  : mp42 
    minor_version : 0 
    compatible_brands: mp42isomavc1 
    encoder   : Lavf56.18.100 
    Stream #0:0(und): Video: rawvideo ([12][11]3Y/0x59330B0C), yuv420p12be, 560x320, q=2-31, 200 kb/s, 7.50 fps, 7.50 tbn, 7.50 tbc (default) 
    Metadata: 
     creation_time : 2010-03-20 21:29:11 
     encoder   : Lavc56.19.100 rawvideo 
Stream mapping: 
    Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native)) 
Could not write header for output file #0 (incorrect codec parameters ?): Input/output error 

После этого, я также пытался отредактируйте с помощью шестнадцатеричного редактора (благословите) файл small_yuv420p.y4m. Я заменяю C420mpeg2 на C420, и файл был принят Chrome. Что соответствует номеру в 420p[number]? Не объясняется there. Есть ли способ сделать ffmpeg вывод такого рода файлов заголовков?

@SirDarius, еще раз спасибо за вашу помощь.

Вопрос

(в случае, если вы забыли после этого текста сгустка)

Как я могу преобразовать small.mp4 в small.y4m файл, который имеет те же свойства, что и файл mobile_qcif_7.5fps.y4m?

+1

arrrhh, пресловутый фальшивый ffmpeg, который действительно avconv. Используйте реальный FFMpeg. Статические сборки можно найти на веб-сайте ffmpeg.org. – SirDarius

+0

@SirDarius Итак, я собираюсь открыть ошибку для трекера 'ffmpeg', чтобы узнать, что происходит. – nha

+0

Отчет об ошибке открыт по адресу https://trac.ffmpeg.org/ticket/4231#ticket – nha

ответ

2

Прежде всего, этот ответ предполагает официальный выпуск FFMpeg при загрузке с официального сайта http://ffmpeg.org. Версия, которую вы используете, представляет собой программу-оболочку из avkvv-вилки, которая пытается распространять ложную информацию, которую ffmpeg устарела.

Вы должны использовать кодек rawvideo в формате контейнера yuv4mpegpipe.

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

Следующая команда должна произвести желаемый результат:

ffmpeg -i small.mp4 -vf fps=7.5 -an -c:v rawvideo -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 
+0

Здравствуйте, спасибо за ваш ответ. Я скомпилировал 'ffmpeg' из источника (' ppa: jon-severinsson/ffmpeg' не работал). Я уверен, что вывод 'mediainfo' теперь тот же. Однако есть что-то еще, и он по-прежнему не работает с Chrome. Чтобы закончить, я пытаюсь создать видеоролик для игры в Chrome, как описано там: https://code.google.com/p/chromium/issues/detail?id=318797 Имеет ли этот конкретный фрагмент "(Только 420 будет работать - 422 не поддерживается). имеет какой-то смысл для вас? Кроме того, это можно легко протестировать на https://apprtc.appspot.com/ – nha

+2

420 здесь означает формат пикселей YUV420. Это формат по умолчанию, созданный ffmpeg здесь, но я не уверен, что он правильно написан в заголовке, у нас есть 'C420mpeg2', в то время как кажется, что формат упоминает' C420' вместо ... может быть ошибкой в ​​ffmpeg .. . Образец y4m из вашего сообщения даже не имеет параметра 'C'. Возможно, вы захотите попробовать и отредактировать полученный файл, чтобы удалить этот параметр, или просто часть 'mpeg2'. – SirDarius

+1

Этот https://www.ffmpeg.org/doxygen/2.5/yuv4mpegenc_8c_source.html#l00069 дает больше информации о том, что происходит в мультиплеерах ... Возможно, стоит попробовать использовать разные значения '-pix_fmt', см. вывод 'ffmpeg -pix_fmts' – SirDarius

Смежные вопросы