ffmpeg, манифест тире не может быть создан из-за неуказанного формата пикселей

Я использую ffmpeg 2.8 на OSX.

Я пытаюсь преобразовать короткое видео mp4 в webm для адаптивной потоковой передачи, как это предлагается здесь http://wiki.webmproject.org/adaptive-streaming/instructions-to-playback-adaptive-webm-using-dash следующим образом:

VP9_DASH_PARAMS="-tile-columns 6 -frame-parallel 1"

ffmpeg -i t2.mp4 -c:v libvpx-vp9 -s 160x90 -b:v 250k -keyint_min 150 -g 150 ${VP9_DASH_PARAMS} -an -f webm -dash 1 video_160x90_250k.webm
ffmpeg -i t2.mp4 -c:a libvorbis -b:a 128k -vn -f webm -dash 1 audio_128k.webm

ffmpeg \
 -f webm_dash_manifest -i video_160x90_250k.webm \
 -f webm_dash_manifest -i audio_128k.webm \
 -c copy -map 0 -map 1 \
 -f webm_dash_manifest \
 -adaptation_sets "id=0,streams=0 id=1,streams=1" \
 manifest.mpd

Однако это дает мне предупреждение неуказанный формат пикселей:

[webm_dash_manifest @ 0x7f9414812800] Could not find codec parameters for stream 0 (Video: vp9, none, 160x90): unspecified pixel format
Consider increasing the value for the 'analyzeduration' and 'probesize' options
video_160x90_250k.webm: could not find codec parameters
Input #0, webm_dash_manifest, from 'video_160x90_250k.webm':
  Metadata:
    encoder         : Lavf56.36.100
  Duration: 00:00:09.97, bitrate: 111 kb/s
    Stream #0:0: Video: vp9, none, 160x90, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn, 1k tbc (default)
    Metadata:
      webm_dash_manifest_duration: 9969
      webm_dash_manifest_initialization_range: 437
      webm_dash_manifest_file_name: video_160x90_250k.webm
      webm_dash_manifest_track_number: 1
      webm_dash_manifest_cues_start: 139297
      webm_dash_manifest_cues_end: 139399
      webm_dash_manifest_bandwidth: 99164
      webm_dash_manifest_cluster_keyframe: 1
      webm_dash_manifest_cue_timestamps: 0,2085,4171,6256,8342
Input #1, webm_dash_manifest, from 'audio_128k.webm':
  Metadata:
    encoder         : Lavf56.36.100
  Duration: 00:00:10.01, bitrate: 120 kb/s
    Stream #1:0: Audio: vorbis, 48000 Hz, stereo, fltp (default)
    Metadata:
      webm_dash_manifest_duration: 10009
      webm_dash_manifest_initialization_range: 4697
      webm_dash_manifest_file_name: audio_128k.webm
      webm_dash_manifest_track_number: 1
      webm_dash_manifest_cues_start: 151174
      webm_dash_manifest_cues_end: 151240
      webm_dash_manifest_bandwidth: 105517
      webm_dash_manifest_cluster_keyframe: 1
      webm_dash_manifest_cue_timestamps: 0,4999,9998
Output #0, webm_dash_manifest, to 'manifest.mpd':
  Metadata:
    encoder         : Lavf56.36.100
    Stream #0:0: Video: vp9, none, 160x90 [SAR 1:1 DAR 16:9], q=2-31, 23.98 fps, 23.98 tbr, 1k tbn, 1k tbc (default)
    Metadata:
      webm_dash_manifest_duration: 9969
      webm_dash_manifest_initialization_range: 437
      webm_dash_manifest_file_name: video_160x90_250k.webm
      webm_dash_manifest_track_number: 1
      webm_dash_manifest_cues_start: 139297
      webm_dash_manifest_cues_end: 139399
      webm_dash_manifest_bandwidth: 99164
      webm_dash_manifest_cluster_keyframe: 1
      webm_dash_manifest_cue_timestamps: 0,2085,4171,6256,8342
    Stream #0:1: Video: vorbis, none, q=2-31, 1k tbn, 1k tbc (default)
    Metadata:
      webm_dash_manifest_duration: 10009
      webm_dash_manifest_initialization_range: 4697
      webm_dash_manifest_file_name: audio_128k.webm
      webm_dash_manifest_track_number: 1
      webm_dash_manifest_cues_start: 151174
      webm_dash_manifest_cues_end: 151240
      webm_dash_manifest_bandwidth: 105517
      webm_dash_manifest_cluster_keyframe: 1
      webm_dash_manifest_cue_timestamps: 0,4999,9998
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=    0 fps=0.0 q=-1.0 Lsize=       1kB time=00:00:00.00 bitrate=N/A    
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)

Тем не менее файл манифеста создается. Я попытался указать формат пикселей:

-pix_fmt yuv420p

Однако это ничего не изменило. Предупреждение остается прежним.

Любые идеи, почему появляется предупреждение и как это исправить?


person Upvote    schedule 18.09.2015    source источник
comment
ffmpeg -f webm_dash_manifest -i video_160x90_250k.webm заставляет ffmpeg интерпретировать следующий входной файл как webm_dash_manifest, вы уверены, что это то, что вам нужно?   -  person SirDarius    schedule 18.09.2015
comment
@SirDarius Нет, вот как это используется: ffmpeg.org/ffmpeg-formats.html #Пример-2. Это, вероятно, связано с этим ответом правильные параметры ffmpeg"> stackoverflow.com/questions/29004197/   -  person aergistal    schedule 18.09.2015
comment
Ах, мой плохой, если я правильно понимаю, использование webm_dash_manifest в качестве демультиплексора только демультиплексирует метаданные видео, так что это действительно допустимо, пока веб-мастер создается с -dash. Не совсем работает, как большинство демультиплексоров, к которым я привык.   -  person SirDarius    schedule 18.09.2015
comment
Зачем вам конвертировать ваш mp4 в WebM, чтобы затем разбить его? MP4 очень хорошо подходит для MPEG-DASH. Просто DASH файл MP4 с помощью MP4Box.   -  person cconcolato    schedule 19.09.2015
comment
@cconcolato webm великолепен, когда дело доходит до адаптивной потоковой передачи :)   -  person Upvote    schedule 19.09.2015
comment
@artworkadシУ вас не возникнет здесь проблемы с mp4, так как вам вообще не нужно будет преобразовывать свой контент. И у вас будут те же функции адаптивной потоковой передачи. Удачи.   -  person cconcolato    schedule 21.09.2015
comment
@cconcolato Скорее всего, проблема не в контейнере, поскольку с WebM / VP8 он работает без предупреждений. Возможно, ОП не хочет платить гонорары за AVC, так что давайте сосредоточимся на этом вопросе.   -  person aergistal    schedule 21.09.2015


Ответы (1)


Проблема заключается в том, что ffmpeg не может декодировать несколько кадров для получения формата пикселей при использовании webm_dash_manifest с кодеком VP9. На VP8 работает без проблем.

Это происходит в функции avformat_find_stream_info:

        ret = read_frame_internal(ic, &pkt1);
        if (ret == AVERROR(EAGAIN))
            continue;

        if (ret < 0) {
            /* EOF or error*/
            break;
        }

read_frame_internal() возвращает мусор и не позволяет коду достичь части try_decode_frame().

При использовании VP8 он извлекает параметры непосредственно из контекста кодека:

        // Try to just open decoders, in case this is enough to get parameters.
        if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
            if (codec && !st->codec->codec)
                if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
                    av_log(ic, AV_LOG_WARNING,
                           "Failed to open codec in av_find_stream_info\n");
        }

st->codec-pix_fmt равно 0 для VP8 и -1 (не найдено) для VP9. Если предполагается получать параметры непосредственно из контекста, возможно, проблема с libvpx-vp9.

Он работает при использовании ffprobe напрямую с файлом webm:

ffprobe -i video_160x90_250k.webm

Stream #0:0: Video: vp9 (Profile 0), yuv420p(tv), 160x90, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn, 1k tbc (default)

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

Я еще недостаточно знаком с ffmpeg, чтобы предложить исправление, поэтому, возможно, будет лучше сообщить об этом как об ошибке на трекере ffmpeg: http://ffmpeg.org/pipermail/ffmpeg-user/2015-September/028610.html

person aergistal    schedule 21.09.2015
comment
Спасибо за Ваш ответ. С ffprobe я получаю тот же результат. - person Upvote; 21.09.2015
comment
Я обновил ответ выводами VP8 и сообщил о проблеме на ffmpeg-user. - person aergistal; 21.09.2015
comment
Ценю вашу помощь. У вас есть ссылка на отчет? - person Upvote; 21.09.2015
comment
Это в списке рассылки на данный момент - person aergistal; 21.09.2015