Dlaczego mogę odtwarzać plik ogg, ale nie konwertować go do mkv lub mp4 za pomocą FFMPEG?

0

Chcę przekonwertować wideo OGG na MP4 lub MKV , ale pojawiają się różne błędy.

Mam dwa strumienie (z tego samego źródła), które przechwyciłem. Są w pojemniku OGG.

Jeśli staram się je konwertować do mkv z ffmpeg -i stream.ogg -c copy -map 0 stream.mkv, pojawi się ten komunikat o błędzie:

ffmpeg version 0.10.7 Copyright (c) 2000-2013 the FFmpeg developers
  built on May 14 2013 21:35:02 with gcc 4.7.2 20120921 (Red Hat 4.7.2-2)
  configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib --mandir=/usr/share/man --arch=i686 --extra-cflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables' --enable-bzlib --disable-crystalhd --enable-gnutls --enable-libass --enable-libcdio --enable-libcelt --enable-libdc1394 --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopenjpeg --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvpx --enable-libx264 --enable-libxvid --enable-x11grab --enable-avfilter --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib --cpu=i686 --enable-runtime-cpudetect
  libavutil      51. 35.100 / 51. 35.100
  libavcodec     53. 61.100 / 53. 61.100
  libavformat    53. 32.100 / 53. 32.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 61.100 /  2. 61.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0.  6.100 /  0.  6.100
  libpostproc    52.  0.100 / 52.  0.100
[ogg @ 0x8685b00] Estimating duration from bitrate, this may be inaccurate
Input #0, ogg, from 'stream.ogg':
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: theora, yuv420p, 640x480 [SAR 1:1 DAR 4:3], 8 fps, 8 tbr, 8 tbn, 8 tbc
    Stream #0:1: Audio: flac, 48000 Hz, 1 channels, s16
    Metadata:
      ENCODER         : Lavf53.32.100
Output #0, matroska, to '/dev/shm/stream.mkv':
  Metadata:
    encoder         : Lavf53.32.100
    Stream #0:0: Video: theora (theo / 0x6F656874), yuv420p, 640x480 [SAR 1:1 DAR 4:3], q=2-31, 8 fps, 1k tbn, 8 tbc
    Stream #0:1: Audio: flac ([172][241][0][0] / 0xF1AC), 48000 Hz, 1 channels
    Metadata:
      ENCODER         : Lavf53.32.100
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[matroska @ 0x8835880] Application provided invalid, non monotonically increasing dts to muxer in stream 1: 1440 >= 1440
av_interleaved_write_frame(): Invalid argument

A jeśli spróbuję przekonwertować je na MP4 za pomocą ffmpeg -i stream.ogg -c copy -map 0 stream.mp4, pojawi się następujący komunikat o błędzie:

track 0: could not find tag, codec not currently supported in container
Could not write header for output file #0 (incorrect codec parameters ?)

Pliki można odtwarzać za pomocą mplayera i ffplay. Zawierają jeden strumień wideo i jeden strumień audio:

$ ffmpeg -i stream.ogg
[ogg @ 0x85a9b00] Estimating duration from bitrate, this may be inaccurate
Input #0, ogg, from 'stream.ogg':
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: theora, yuv420p, 640x480 [SAR 1:1 DAR 4:3], 8 fps, 8 tbr, 8 tbn, 8 tbc
    Stream #0:1: Audio: flac, 48000 Hz, 1 channels, s16
    Metadata:
      ENCODER         : Lavf53.32.100

Kiedy odtwarzam pliki za pomocą VLC, otrzymuję dwa ostrzeżenia i dwa błędy (na czerwono), ale pliki są odtwarzane:

TagLib: Vorbis::File::read() - Could not find the Vorbis comment header.
TagLib: Vorbis::File::read() - Could not find the Vorbis comment header.
[0xb71029c0] ogg demux error: Got invalid packet, read 62187 of 63676: OggS
[0xb6d00618] main input error: Invalid PCR value in ES_OUT_SET_(GROUP_)PCR !

W czym problem z plikami? Czy istnieje sposób na konwersję plików, np. Nakazanie ffmpeg zignorowania błędów? Nie byłoby problemu pominąć pierwszą lub ostatnią sekundę filmu, jeśli to rozwiązałoby problem.

erik
źródło
Proszę nie obcinać wyjścia. Opublikuj pełny dziennik ffmpeg pierwszego polecenia. Drugi nie działa, ponieważ kontenery MP4 nie obsługują wideo Theora, a po prostu kopiujesz strumień bitów wideo, gdy go używasz -c copy.
slhck
@ slhck ♦ Ok, teraz dodałem resztę danych wyjściowych. Czy to pomaga?
erik

Odpowiedzi:

2

Odpowiedź brzmi:

  • Kontenery MP4 nie obsługują wideo z teorią (dziękuję Slhck)
  • dzięki najnowszej wersji nocnej to po prostu działa

Na przyszłość: zawsze wypróbuj wersję nocną, jeśli nie działa.

erik
źródło