Multimedia 2.610 Themen, 14.811 Beiträge

ffmpeg position der Stream änderungen bestimmen?

robinx99 / 13 Antworten / Baumansicht Nickles

Hallo,

ich schneide hier ein Video (DVB Stream Channel 4 HD) und mir ist folgendes bei ffmpeg aufgefallen. Es gibt regelmäßig die Meldung:

Input stream #0:1 frame changed from rate:48000 fmt:fltp ch:6 chl:5.1(side) to rate:48000 fmt:fltp ch:2 chl:stereo

Also der Audio Stream hat sich von 5.1 auf Stereo verändert, natürlich gibt es auch die andere Meldung das der Audio Stream von Stereo wieder zu 5.1 wird. Dummerweise gibt es nirgendwo eine Positionsangabe. Da die Änderung des Streams genau bei der Werbung auftritt (Film 5.1, Werbung Stereo) frage ich mich ob man das nicht für ein Automatisches Schneiden nutzen könnte (mit einem kleinen Bash Script oder vielleicht ein bisschen Java) nur dafür bräuchte ich halt die Informationen wo genau der Audio Stream sich ändert, gibt es da eine Möglichkeit das man sich das Anzeigen lassen kann?

gruß

robinx99

bei Antwort benachrichtigen
Solaris96 robinx99 „ffmpeg position der Stream änderungen bestimmen?“
Optionen

hallo

überprüfe die ffmpeg parameter

http://howto-pages.org/ffmpeg/

zB MAPPING CHANNELS

good vibrationsZwinkernd

solaris

Eine Übertreibung ist eine Wahrheit, die ihre Geduld verloren hat
bei Antwort benachrichtigen
robinx99 Solaris96 „hallo überprüfe die ffmpeg parameter ...“
Optionen

Hallo

Die Mapping Optionen helfen mir da leider nicht wirklich, damit kann ich ja nur festlegen welche Channels ich verarbeiten will. Die hab ich schon vorher benutzt um mir die Streams rauszusuchen die ich benötige. "ffmpeg -i 000.ts -acodec copy -vcodec copy -map 0:0 -map 0:8 shield3.m2t"

So hier mal ein Beispiel mit ffmpeg output:

---

$ffmpeg -i shield3.m2t -ss 00:20:00 -t 2 /tmp/b.mkv

Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> libx264)
  Stream #0:1 -> #0:1 (ac3 -> libvorbis)
Press [q] to stop, [?] for help
Input stream #0:1 frame changed from rate:48000 fmt:fltp ch:2 chl:stereo to rate:48000 fmt:fltp ch:6 chl:5.1(side)
Input stream #0:1 frame changed from rate:48000 fmt:fltp ch:6 chl:5.1(side) to rate:48000 fmt:fltp ch:2 chl:stereo
frame=   13 fps=0.0 q=0.0 size=       5kB time=00:00:00.65 bitrate=  56.4kbits/sframe=   42 fps=0.1 q=0.0 size=       5kB time=00:00:01.82 bitrate=  20.4kbits/s

---

Und ich suche nach einem Weg mir die genaue Positionen anzeigen zu lassen wo die Stream änderungne auftreten irgendwie sehe ich da keine Informationen und auch loglevel verbose / debug helfen leider nicht weiter.

 

gruß

robinx99

bei Antwort benachrichtigen
Solaris96 robinx99 „Hallo Die Mapping Optionen helfen mir da leider nicht ...“
Optionen

hallo robinx99

sorry hab deinen Wunsch: "automatisieren" blöderweise ignoriert My fault!
die Grundlage dafür habe ich selbst nicht. Kein Anlass bisher mich schlau zu machen,außer der Referenz http://www.ffmpeg.org/ffmpeg-all.html#Advanced-Audio-options_003a
und hab das benutzt http://www.foobar2000.org/ demuxing wenn es beim sound komplex wurde

posting könnte vielleicht besser ins board Programmieren passen?

du willst die Werbeblöcke nicht entfernen um das prob zu umgehen? Es gibt proggies die es automatisch können, müsstest du testen, wenn es eine Alternative ist

proggis zB. wie hier http://www.freeware.de/download/film-riss_43368.html

gruß solaris

Eine Übertreibung ist eine Wahrheit, die ihre Geduld verloren hat
bei Antwort benachrichtigen
robinx99 Solaris96 „hallo robinx99 sorry hab deinen Wunsch: automatisieren ...“
Optionen

Hallo

Das Programm Scheitert schon an fehlender h264 Unterstützung.

Ich hab jetzt zwar schon etwas Java code geschrieben der halbwegs funktioniert aber der benutzt eher eine Art Bruteforce um die genaue Position der Änderung zu bestimmen, was aber sehr lange dauert. Vielleicht wäre es im Programmieren teil besser aufgehoben, aber mein Code ist doch sehr chaotisch. Und ich bin mir momentan gar nicht sicher ob das Forum meinen Code mag, wenn ich den hier rein Poste.

Aber ich hatte ja noch Hoffnung das ich einfach an die Positionen komme. Und dort nicht so ein Bruteforce nutzen muss.

gruß

robinx99

 

P.S.: so gerade mal getestet der source code ist hier in dem forum sehr unlesbar

bei Antwort benachrichtigen
Solaris96 robinx99 „Hallo Das Programm Scheitert schon an fehlender h264 ...“
Optionen
Scheitert ...an ...h264

'Film//Riss' ? //staun\\

Ist mir noch nicht klar was du anstrebst. Werbeblöcke=Stereo kicken? Generell für kommende vids ein script erstellen das Start/Stop-Funktion für <> 5.1-Bereich handled?

source code ist hier in dem forum sehr unlesbar

kommentieren wo nötig, konvertiere/speichere ihn txt2html, kleine Schriftgröße, benutze die HTML-Funktion im Forum-Editor,  table... <tr  <th ... code einfügen,

sollte dann besser lesbar sein Lachend

gruß

solaris

 

 

Eine Übertreibung ist eine Wahrheit, die ihre Geduld verloren hat
bei Antwort benachrichtigen
robinx99 Solaris96 „Film//Riss ? //staun Ist mir noch nicht klar was du ...“
Optionen

 

'Film//Riss' ? //staun\\

ja das nutzt intern Comskip und dort steht auf der Webseite http://www.kaashoek.com/comskip/

 

The h.264 and WTV version is still in beta test and available for donators.

 

Ist mir noch nicht klar was du anstrebst. Werbeblöcke=Stereo kicken? Generell für kommende vids ein script erstellen das Start/Stop-Funktion für <> 5.1-Bereich handled?

Im Prinzip ja mein Problem ist das ich noch keinen weg gefunden habe die mir die Stelle der Änderung zuverlässig mitteilt. Wenn ich die Datei zur wav audio Datei umwandelt dann kann ich den ffmpeg begrenzt nutzen

 

so habe ich auch immer unterschiedliche zahlen bei den unterschiedlichen durchläufen mal sieht es so aus

 

size= 99136kB time=00:08:48.86 bitrate=1535.6kbits/s
Input stream #0:1 frame changed from rate:48000 fmt:fltp ch:2 chl:stereo to rate:48000 fmt:fltp ch:6 chl:5.1(side) size= 103712kB time=00:09:13.18 bitrate=1535.9kbits/s

 mal so

 

 

size= 76768kB time=00:06:49.47 bitrate=1535.8kbits/s
Input stream #0:1 frame changed from rate:48000 fmt:fltp ch:2 chl:stereo to rate:48000 fmt:fltp ch:6 chl:5.1(side) size= 109760kB time=00:09:45.53 bitrate=1535.6kbits/s

aus dem ersten Durchlauf kann ich erkennen das die Änderung irgendwo zwischen 00:08:48.86 und 00:09:13.18 stattfindet beim zweiten sehe ich das die Änderung zwischen 00:06:49.47 und 00:09:45.53 stattfindet. Aber wo genau die Änderung ist sehe ich so nicht bisher ist mein Ansatz einfach die erste zahl zu nehmen 10 Sekunden abzuziehen und dann 10 Sekunden audio zur wav umzuwandeln und schauen ob es eine Änderung gab, dann 10.1 Sekunden umwandeln und wieder schauen dann 10.2 Sekunden u.s.w. bis ich die Änderung finde und die zahl zurück zugeben. Da ich so ffmpeg jeweils in Zehntel Sekunden schritten aufrufe und somit auch mal 2 oder mehr Minuten überbrücke endet das schnell mal in 1200 Aufrufen von ffmpeg was logischerweise sehr lange dauert.

kommentieren wo nötig, konvertiere/speichere ihn txt2html, kleine Schriftgröße, benutze die HTML-Funktion im Forum-Editor,  table...

ok da ich zu doof bin das richtig hier im Forum zu Posten packe ich es mal auf pastebin was ich bisher habe http://pastebin.com/35idS89J

wirklich guter Code ist das nicht und auch nicht kommentiert ist halt eher auf die schnelle entstanden.

Jedenfall generiert mir der Javacode dort oben dann Folgendes: http://pastebin.com/gAAEC5tF

was ich dann halt ausführen kann und ich bekomme eine Video Datei ohne Werbung. Klar bis jetzt ist der Großteil in dem Javacode Hardcoded (und die 'Double' sollte ich vielleicht auch durch etwas anderes ersetzen) aber irgendwie störe ich mich momentan an der extremen Laufzeit (ich glaube es war fast eine Halbe Stunde)

 

gruß

robinx99

bei Antwort benachrichtigen
Solaris96 robinx99 „ja das nutzt intern Comskip und dort steht auf der Webseite ...“
Optionen
Forum zu Posten

etwas /breit\ dafür

okay

warum benutzt du nicht ffprobe ... ... ... -loglevel verbose ... (debug) ?

http://www.ffmpeg.org/ffprobe.html

solaris

Eine Übertreibung ist eine Wahrheit, die ihre Geduld verloren hat
bei Antwort benachrichtigen
robinx99 Solaris96 „etwas /breit dafür okay warum benutzt du nicht ffprobe ... ...“
Optionen

 

warum benutzt du nicht ffprobe ... ... ... -loglevel verbose ... (debug) ? http://www.ffmpeg.org/ffprobe.html

macht leider nicht wirklich etwas selbst mit loglevel debug gibt es keine brauchbaren informationen aus

 

so sieht da der ganze output aus

 

ffprobe version 1.2.3 Copyright (c) 2007-2013 the FFmpeg developers
  built on Sep 15 2013 16:10:06 with gcc 4.6.3 (Gentoo 4.6.3 p1.13, pie-0.5.2)
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ --ar=x86_64-pc-linux-gnu-ar --optflags='-march=native -O2 -pipe -fomit-frame-pointer' --extra-cflags='-march=native -O2 -pipe -fomit-frame-pointer' --extra-cxxflags='-march=native -O2 -pipe -fomit-frame-pointer' --disable-static --enable-gpl --enable-postproc --enable-avfilter --enable-avresample --disable-stripping --enable-version3 --enable-nonfree --enable-bzlib --disable-runtime-cpudetect --disable-debug --disable-doc --disable-gnutls --enable-hardcoded-tables --enable-iconv --enable-network --disable-openssl --enable-ffplay --disable-vaapi --enable-vdpau --enable-zlib --enable-libvo-aacenc --disable-libvo-amrwbenc --enable-libmp3lame --disable-libfdk-aac --disable-libaacplus --enable-libfaac --enable-libtheora --disable-libtwolame --enable-libx264 --enable-libxvid --disable-libcdio --disable-libiec61883 --disable-libdc1394 --disable-l
 libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[mpegts @ 0x17fad60] Format mpegts probed with size=2048 and score=100
[mpegts @ 0x17fad60] stream=0 stream_type=1b pid=100 prog_reg_desc=
[mpegts @ 0x17fad60] stream=1 stream_type=81 pid=101 prog_reg_desc=
[mpegts @ 0x17fad60] File position before avformat_find_stream_info() is 0
[h264 @ 0x17feb10] Increasing reorder buffer to 1
[h264 @ 0x17feb10] no picture ooo
[h264 @ 0x17feb10] Increasing reorder buffer to 2
[h264 @ 0x17feb10] no picture ooo
    Last message repeated 1 times
[h264 @ 0x17feb10] no picture
    Last message repeated 1 times
[mpegts @ 0x17fad60] max_analyze_duration 5000000 reached at 5024000 microseconds
[mpegts @ 0x17fad60] File position after avformat_find_stream_info() is 0
Input #0, mpegts, from 'shield3.m2t':
  Duration: 01:15:01.33, start: 1.400000, bitrate: 9822 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100], 167, 1/90000: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 1/50, 25 fps, 50 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x101](eng), 159, 1/90000: Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz, stereo, fltp, 384 kb/s
[h264 @ 0x17feb10] detected 8 logical cores
[AVIOContext @ 0x1803330] Statistics: 4346000 bytes read, 2 seeks

bisher war ffmpeg wenn es den audio stream decodiert (auch wenn die wav datei nach /dev/null geschrieben wird) die einzige Möglichkeit die ich gefunden habe mir die Format wechsle anzuzeigen. Und ffprobe zeigt auch nur an wie die Streams am Anfang aussehen, nicht wie sie sich später verändern

 

gruß

robinx99

bei Antwort benachrichtigen
Solaris96 robinx99 „macht leider nicht wirklich etwas selbst mit loglevel debug ...“
Optionen

hallo robinx99

falsch ausgedrückt von mir Stirnrunzelnd

in deinem code, dachte ich, ffprobe im loop benutzen. Ich war der Meinung die Parameter wären identisch /so/ Speicherlast mit ffprobe kleiner, was Ergebnisse reproduzierbarer machen könnte

kann es hier mit deinem string nicht nachvollziehen, falsche avcodec-52.dll.
ich kann den javacode zwar "lesen", für Optimierung bin ich aber der Falsche.

ich frage mich auch, ob audioformatwechsel generell beim start v. Werbung und back immer vorhanden ist. Die vorhandenen proggis die Werbung killen sollen checken auf Szenenwechsel.

interessant aber als "Denkaufgabe"

sorry * ich habe sonst keine Idee das prob anders anzugehen.

gruß solaris

 

Eine Übertreibung ist eine Wahrheit, die ihre Geduld verloren hat
bei Antwort benachrichtigen
robinx99 Solaris96 „hallo robinx99 falsch ausgedrückt von mir in deinem code, ...“
Optionen
in deinem code, dachte ich, ffprobe im loop benutzen. Ich war der Meinung die Parameter wären identisch /so/ Speicherlast mit ffprobe kleiner, was Ergebnisse reproduzierbarer machen könnte

soweit ich das sehe kennt ffprobe überhaupt keinen "-ss" (also seek start) Parameter und somit bekomme ich nur Infos vom Stream anfang.

ich frage mich auch, ob audioformatwechsel generell beim start v. Werbung und back immer vorhanden ist. Die vorhandenen proggis die Werbung killen sollen checken auf Szenenwechsel.

Gut Frage dürfte stark vom Sender abhängen und was sie ausstrahlen. Aber wenn sie AC3 5.1 Audio Spuren ausstrahlen, dann dürfte die chance hoch sein, dass sich diese Verändert, da viele Sender aber generell nur Stero Spuren haben dürfte es bei vielen Sendern nicht funktionieren. Wobei zumindest bei dem Comskip (was ja leider nicht mit h264 funktioniert) auch noch der Aspekt Ratio genannt wird, nur dass kann man halt nur Nutzen wenn man einen älteren Film / Serie aufnehmen will die im 4:3 Format ausgestrahlt wird während die Werbung im 16:9 Ausgestrahlt wird.

Aber gut irgendwann ist die Werbung auch 5.1 Audio und es geht nicht mehr so einfach.

kann es hier mit deinem string nicht nachvollziehen, falsche avcodec-52.dll. ich kann den javacode zwar "lesen", für Optimierung bin ich aber der Falsche.

Keine Ahnung wo die Meldung herkommt vielleicht auch unterschiedliche ffmpeg Versionen, aber im wesentlichen ist die ausgegebene Datei ja nur die Teile mittels ffmpeg zu kodieren, dann mit mkvmerge zusammen zufügen und nochmals ffmpeg drüber laufen zu lassen (um das audio umzuwandeln, ich hatte schon lustige Probleme wenn ich direkt nach AAC kodiere und dann zusammen füge deshalb halt erst Flac für die kleineren Teile).

gruß

robinx99

bei Antwort benachrichtigen
Solaris96 robinx99 „soweit ich das sehe kennt ffprobe überhaupt keinen -ss ...“
Optionen
ffprobe überhaupt keinen "-ss"

hatte gedacht du könntest zB. über -read_intervals + zusätzliche Parameter in einer Schleife vielleicht infos bekommen Verlegen

irgendwann ist die Werbung auch 5.1 Audio

Lachend

 vor etlichen Jahren war ein FP-Recorder f. uns geplant der Funktion*Werbung rausschneiden* anbot, wurde im selben Monat aber vom Markt genommen weil die marker//?\\ Werben an/aus von den Sendern geändert wurden. Glück gehabt 

 

vielleicht auch unterschiedliche ffmpeg Versionen

möglich, auf dem NB hier ist nur eine ältere Grundausrüstung an multimediatools vorhanden auch schon wieder 3-4J. alt.

ich hatte schon lustige Probleme wenn ich direkt nach AAC kodiere und dann zusammen füge deshalb halt erst Flac für die kleineren Teile

wird langsam klar warum du automatisieren möchtest, machst dir ja ne ziemliche Arbeit.
hobby oder Brötchen? Zwinkernd

solaris

Eine Übertreibung ist eine Wahrheit, die ihre Geduld verloren hat
bei Antwort benachrichtigen
robinx99 Solaris96 „hatte gedacht du könntest zB. über -read_intervals ...“
Optionen
hatte gedacht du könntest zB. über -read_intervals + zusätzliche Parameter in einer Schleife vielleicht infos bekommen 

da muss ich mal schauen was da noch geht, aber zumindest meine ffprobe version kennt den parameter read_intervals garnicht

 vor etlichen Jahren war ein FP-Recorder f. uns geplant der Funktion*Werbung rausschneiden* anbot, wurde im selben Monat aber vom Markt genommen weil die marker//?\\ Werben an/aus von den Sendern geändert wurden. Glück gehabt 

tja meine Lösung dürfte auch nur für einige TV Sender interessant sein und sobald die Werbung auch 5.1 ist, ist sie logischerweise auch hinfällig, aber egal eine Temporäre Lösung ist es allemal.

wird langsam klar warum du automatisieren möchtest, machst dir ja ne ziemliche Arbeit. hobby oder Brötchen?

Hobby, aber auch gleichzeitig der Wunsch im Programmieren fit zu bleiben und da hat ist ein Programm, das man selber haben möchte schon mal keine so schlechte Idee da etwas zu üben. Und wenn man es Automatisiert hat, dann kann man sich die Aufnahme auch gleich Ohne Werbung anschauen und spoilert sich nicht selber schon beim Schneiden.

 

gruß

robinx99

bei Antwort benachrichtigen
Solaris96 robinx99 „da muss ich mal schauen was da noch geht, aber zumindest ...“
Optionen
Werbung auch 5.1
super 

denke an frooop-alaaarm oder sowas in 5.1 = Körperverletzung!

eine Temporäre Lösung ist es

Erfolg wünsche ich dir!
Tele5 und andere 2nd-level--TVs nehmen vielfach noch 0.5sec-Schwarzblende mit Volumeboost f. adverts On/Off. 

im Programmieren fit zu bleiben

advisable! habs schleifen lassen und bereue nunWeinend

gruß

solaris

Eine Übertreibung ist eine Wahrheit, die ihre Geduld verloren hat
bei Antwort benachrichtigen