Downsampling eines Videos mit avconv / ffmpeg

7

Ich weiß wirklich wenig über das Codieren und Verwenden von avconv / ffmpeg. Ich versuche, ein Video wie folgt herunterzusampeln:

avconv -i blah_in.avi -s 640x360 -pass 1 blah.avi
avconv -i blah_in.avi -s 640x360 -pass 2 blah.avi

Mir ist bewusst, dass dies sehr simpel ist, aber ich kann nicht herausfinden, wo das Problem liegt. Hier ist die Fehlermeldung aus Pass 1:

avconv version 0.8.3-4:0.8.3-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers
  built on Jun 12 2012 16:37:58 with gcc 4.6.3
[avi @ 0x9fdd240] non-interleaved AVI
Input #0, avi, from 'blah_in.avi':
  Metadata:
    encoder         : MEncoder svn r34540 (Ubuntu), built with gcc-4.6
  Duration: 01:21:59.24, start: 0.000000, bitrate: 8996 kb/s
    Stream #0.0: Video: mpeg4 (Advanced Simple Profile), yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 23.98 tbr, 23.98 tbn, 23.98 tbc
    Stream #0.1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s
File 'blah.avi' already exists. Overwrite ? [y/N] y
[buffer @ 0x9fe1e00] w:1920 h:1080 pixfmt:yuv420p
[scale @ 0x9fdcfa0] w:1920 h:1080 fmt:yuv420p -> w:640 h:360 fmt:yuv420p flags:0x4
Incompatible sample format 's16' for codec 'ac3', auto-selecting format 'flt'
[ac3 @ 0x9fdc740] invalid bit rate
Output #0, avi, to 'blah.avi':
  Metadata:
    encoder         : MEncoder svn r34540 (Ubuntu), built with gcc-4.6
    Stream #0.0: Video: mpeg4, yuv420p, 640x360 [PAR 1:1 DAR 16:9], q=2-31, pass 1, 200 kb/s, 90k tbn, 23.98 tbc
    Stream #0.1: Audio: ac3, 44100 Hz, stereo, flt, 200 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg4 -> mpeg4)
  Stream #0:1 -> #0:1 (mp3 -> ac3)
Error while opening encoder for output stream #0:1 - maybe incorrect parameters such as bit_rate, rate, width or height

Ich habe eine Reihe von Dingen ausprobiert, aber entweder wird eine ähnliche Fehlermeldung angezeigt, oder die Qualität ist äußerst schlecht. Nicht so sehr aufgrund der geringen Auflösung, sondern voller Komprimierungsartefakte.

Was ich jetzt erreichen möchte, ist die gleiche Auflösung / Codierung wie die folgende AVI-Datei, die auf meinem Kindervideogerät einwandfrei funktioniert:

Stream #0.0: Video: mpeg4 (Advanced Simple Profile), yuv420p, 624x352 [PAR 1:1 DAR 39:22], 25 fps, 25 tbr, 25 tbn, 25 tbc
Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 128 kb/s
Januar
quelle
1
Ich bin mir nicht sicher, ob dies die Hauptursache des Problems ist, aber Sie sollten wirklich die Bitrate angeben - 200 kb/sfür Audio ist es ziemlich viel (insbesondere wenn der Eingang eine niedrigere Bitrate hat), während es für Video viel zu wenig ist. Sie können den Stream auch unverändert kopieren ( -acodec copyiirc).
Peterph

Antworten:

2

Die letzte Zeile im Ausgabeprotokoll ist zu allgemein - Sie müssen weiter nachschlagen. Der Fehler ist folgender:

[ac3 @ 0x9fdc740] invalid bit rate

Das Problem ist, dass avconv aus irgendeinem Grund Ihr MP3-Audio in AC3 codieren möchte. Wenn Sie nur die Größe von Videos ändern, können Sie den Audio-Bitstream in Ruhe lassen.


Beachten Sie, dass das Ändern der Größe und das Neucodieren Ihre Qualität drastisch verringert. Also, es sei denn, Sie müssen es wirklich tun, tun Sie es nicht. Dein Video leidet unter Generationsverlust .

Wenn Sie können, vermeiden Sie die Verwendung von MPEG-4 Part 2-Codecs (Xvid oder libavcodec-native mpeg4) und verwenden Sie stattdessen MPEG-4 Part 10 / H.264-Codecs (z. B. x264). Da H.264 in AVI-Containern nicht ordnungsgemäß unterstützt wird, verwenden wir stattdessen MP4, das die meiste Zeit anstelle von AVI der Container Ihrer Wahl sein sollte.

ffmpeg -i in.avi -c:a copy -c:v libx264 -crf 23 -s:v 640x360 output.mp4

Dadurch wird der Audiostream ( -c:a copy) kopiert und das Video -c:v libx264mit einer konstanten Qualität von 23 ( -crf) in x264 ( ) codiert . Verwenden Sie hier einen niedrigeren Wert für eine bessere Qualität (mit vernünftigen Werten von 18 bis 28). Die Größe wird mit geändert -s:v.

Ich verwende FFmpeg hier synonym mit Libav, da die Syntax dieselbe sein sollte. Ich würde Ihnen jedoch empfehlen, die mit Ubuntu gelieferte Libav-Standardversion zu verwerfen und FFmpeg aus dem Quellcode zu kompilieren oder einen aktuellen statischen Linux-Build zu verwenden .

slhck
quelle
1
... insbesondere schlägt die AC-3-Codierung fehl, weil 200 kbit keine gültige Bitrate ist, die in der AC-3-Spezifikation , Anhang A, Tabelle 4 aufgeführt ist. Die nächsten sind 192 und 224.
derobert
1

Die angegebene Videobitrate ist sehr niedrig: 200 kpbs. Versuchen Sie diesen Befehl

ffmpeg -i input_video -b 800 -s 640x360 -vcodec xvid -acodec copy output_video

Wie in den Kommentaren vorgeschlagen , wäre es eine bessere Wahl, wenn das Gerät h.264 unterstützt .

Rajneesh
quelle