For Loop

Steev

(ツ)
Registriert
15 Juli 2013
Beiträge
22.194
Ort
zurück ins Dorf
Ich konvertiere gerade mit einem For Loop MKV in MP4 (wobei ich die Videospur kopiere und die Audiospur ändere) so:
[src=text]for file in *.mkv; do ffmpeg -i "$file" -c:v copy -c:a aac -b:a 128k "$file".mp4; done[/src]
Am Ende habe ich dann allerdings aus einer Video.mkv eine Video.mkv.mp4.
Geht das auch, dass ich am Ende namentlich eine Video.mp4 habe ohne das mkv?
 
Moin, auch wenn ich die Zeile👎 verstehe, kannst Bash Code auch mit [kw]src="bash"[/kw] formatieren lassen (anstatt nur Code) und das korrekt formatieren? ;)

Ansonsten gibt es auf Stackoverflow folgende Lösung:


Spontan hätte ich, "basename" genommen, aber die "angepinnte" Lösung, Zitat:
[src="bash"]$ s=/the/path/foo.txt
$ echo ${s##*/}
foo.txt
$ s=${s##*/}
$ echo ${s%.txt}
foo
$ echo ${s%.*}
foo[/src]

ist wohl beliebter oder einfacher.

Also in deinem Fall wohl die letzte (unbekannte Dateiendung) bzw. vorletzte Variante (wenn es immer ".mkv" ist) - was abgetrennt werden soll:
[src=bash]filename=${file%.mkv}[/src]

Und dann anstelle von [kw]$file[/kw] nur [kw]$filename[/kw] in der Schleife. Edit: (Siehe Metal_Warrior) - aber dann $filename nur für den Ausgabedateiname.
 
Zuletzt bearbeitet:
@Laui: Jupp, geht:

[src=bash]for FILE in "*.mkv"; do ffmpeg -i "$FILE" -c:v copy -c:a aac -b:a 128k "${FILE%.mkv}".mp4; done[/src]

Was ich hier gemacht hab, ist eine Bash-Substringmanipulation. Davon gibts ne riesige Menge, ich muss die auch selber immer wieder nachschauen, weil das Werkzeug verdammt mächtig ist:
 
Hi, nachträglich kannst Du mit einer Zeile auch alle Video.mkv.mp4 Dateien umbennen ;)

[src=bash]rename.ul '.mkv.mp4' '.mp4' *.mkv.mp4[/src]
 
  • Thread Starter Thread Starter
  • #5
@Metal Warrrior: Danke funktioniert. Nur bei den zwei Anführungzeichen "*.mkv* streikt es
[src=text]*.mkv: No such file or directory[/src]
lässt man die weg, geht es,

Was allerdings auf einem anderem Blatt steht, dass ich hier bei anderen MKVs die subtitle nicht kopiert bekomme mit dem Zusatz [kw]c:s copy[/kw]
Es kommt eine Fehlermeldung:
[src=text][mp4 @ 0x55d208c59f20] Could not find tag for codec subrip in stream #2, codec not currently supported in container
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 0:1 --
[aac @ 0x55d208cc6300] Qavg: -nan
Conversion failed![/src]
Ausgangsdatei/en ist, MediaInfo:
[src=text]General
Complete name : Video.mkv
Format : Matroska
Format version : Version 4 / Version 2
File size : 1.48 GiB
Duration : 51 min 10 s
Overall bit rate : 4 128 kb/s
Encoded date : UTC 2014-12-14 00:38:39
Writing application : mkvmerge v7.4.0 ('Circles') 64bit built on Dec 12 2014 12:19:56
Writing library : libebml v1.3.0 + libmatroska v1.4.1

Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High@L4.1
Format settings, CABAC : Yes
Format settings, RefFrames : 10 frames
Codec ID : V_MPEG4/ISO/AVC
Duration : 51 min 10 s
Bit rate : 2 846 kb/s
Width : 1 280 pixels
Height : 640 pixels
Display aspect ratio : 2.000
Frame rate mode : Constant
Frame rate : 23.976 (24000/1001) FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.145
Stream size : 1.02 GiB (69%)
Writing library : x264 core 142 r2479 dd79a61
Encoding settings : cabac=1 / ref=10 / deblock=1:-3:-3 / analyse=0x3:0x133 / me=umh / subme=10 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=48 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=6,6 / fast_pskip=0 / chroma_qp_offset=-2 / threads=12 / lookahead_threads=2 / sliced_threads=0 / nr=0 / decimate=0 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=7 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=24 / scenecut=40 / intra_refresh=0 / rc_lookahead=250 / rc=crf / mbtree=1 / crf=15.5 / qcomp=0.70 / qpmin=0 / qpmax=69 / qpstep=4 / vbv_maxrate=38000 / vbv_bufsize=30000 / crf_max=0.0 / nal_hrd=none / filler=0 / ip_ratio=1.10 / aq=1:0.70
Default : Yes
Forced : No

Audio #1
ID : 2
Format : AC-3
Format/Info : Audio Coding 3
Format settings, Endianness : Big
Codec ID : A_AC3
Duration : 51 min 10 s
Bit rate mode : Constant
Bit rate : 640 kb/s
Channel(s) : 6 channels
Channel positions : Front: L C R, Side: L R, LFE
Sampling rate : 48.0 kHz
Frame rate : 31.250 FPS (1536 SPF)
Bit depth : 16 bits
Compression mode : Lossy
Stream size : 234 MiB (15%)
Language : German
Service kind : Complete Main
Default : Yes
Forced : No

Audio #2
ID : 3
Format : AC-3
Format/Info : Audio Coding 3
Format settings, Endianness : Big
Codec ID : A_AC3
Duration : 51 min 10 s
Bit rate mode : Constant
Bit rate : 640 kb/s
Channel(s) : 6 channels
Channel positions : Front: L C R, Side: L R, LFE
Sampling rate : 48.0 kHz
Frame rate : 31.250 FPS (1536 SPF)
Bit depth : 16 bits
Compression mode : Lossy
Stream size : 234 MiB (15%)
Language : English
Service kind : Complete Main
Default : No
Forced : No

Text #1
ID : 4
Format : UTF-8
Codec ID : S_TEXT/UTF8
Codec ID/Info : UTF-8 Plain Text
Duration : 48 min 9 s
Bit rate : 41 b/s
Count of elements : 458
Stream size : 14.6 KiB (0%)
Language : German
Default : Yes
Forced : No

Text #2
ID : 5
Format : UTF-8
Codec ID : S_TEXT/UTF8
Codec ID/Info : UTF-8 Plain Text
Duration : 47 min 39 s
Bit rate : 47 b/s
Count of elements : 518
Stream size : 16.4 KiB (0%)
Language : English
Default : No
Forced : No
[/src]
Scheinbar kommt mp4 nicht mit diesem subtitle format klar oder ffmpeg
 
@Laui: Ah, kann sein, dass er bei Anführungszeichen die Wildcard nicht expanded, das hab ich nicht bedacht. Üblicherweise arbeite ich auch nicht mit Wildcards, ich mach das meist anders. Ist so ne persönliche Geschichte, kein best practice oder so.

Probier mal -map 0 als Option und lass den Rest der Codec-Optionen mal weg - das sollte dir alles packen. Wenn da immer noch Fehler rauskommen, versteht er was nicht. Ist aber jetzt geraten, ich konvertiere selbst nicht um.

Evtl. noch ne Hilfe:
 
Code:
Expand Collapse Copy
Format                                   : AC-3
Format/Info                              : Audio Coding 3

FFmpeg zählt die Tacks ab "0". MP4 unterstützt kein Dolby. Versuchs mit AAC.
 
  • Thread Starter Thread Starter
  • #8
ja mp4 kommt nur mit mov_text zurecht. Ich habe jetzt folgendes probiert, den Befehl habe ich mir aus dem Netz zusammengestückelt, aber am Ende habe ich immer nur die Eine erste deutsche Untertitelspur
[src=bash]ffmpeg -i Video.mkv -c:v copy -c:a aac -b:a 128k -c:s mov_text -metadata:s:s:0 language=ger -metadata:s:s:1 language=eng output.mp4[/src]
Endergebnis ist dann:
[src=text]General
Complete name : output.mp4
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/avc1/mp41)
File size : 1.07 GiB
Duration : 51 min 10 s
Overall bit rate mode : Variable
Overall bit rate : 2 981 kb/s
Writing application : Lavf57.71.100

Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High@L4.1
Format settings, CABAC : Yes
Format settings, RefFrames : 10 frames
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 51 min 10 s
Bit rate : 2 846 kb/s
Width : 1 280 pixels
Height : 640 pixels
Display aspect ratio : 2.000
Frame rate mode : Variable
Frame rate : 23.976 (23976/1000) FPS
Minimum frame rate : 23.564 FPS
Maximum frame rate : 24.390 FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.145
Stream size : 1.02 GiB (95%)
Writing library : x264 core 142 r2479 dd79a61
Encoding settings : cabac=1 / ref=10 / deblock=1:-3:-3 / analyse=0x3:0x133 / me=umh / subme=10 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=48 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=6,6 / fast_pskip=0 / chroma_qp_offset=-2 / threads=12 / lookahead_threads=2 / sliced_threads=0 / nr=0 / decimate=0 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=7 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=24 / scenecut=40 / intra_refresh=0 / rc_lookahead=250 / rc=crf / mbtree=1 / crf=15.5 / qcomp=0.70 / qpmin=0 / qpmax=69 / qpstep=4 / vbv_maxrate=38000 / vbv_bufsize=30000 / crf_max=0.0 / nal_hrd=none / filler=0 / ip_ratio=1.10 / aq=1:0.70

Audio
ID : 2
Format : AAC
Format/Info : Advanced Audio Codec
Format profile : LC
Codec ID : 40
Duration : 51 min 10 s
Duration_LastFrame : -11 ms
Bit rate mode : Constant
Bit rate : 129 kb/s
Channel(s) : 2 channels
Channel(s)_Original : 6 channels
Channel positions : Front: L C R, Side: L R, LFE
Sampling rate : 48.0 kHz
Frame rate : 46.875 FPS (1024 SPF)
Compression mode : Lossy
Stream size : 47.0 MiB (4%)
Language : German
Default : Yes
Alternate group : 1

Text
ID : 3
Format : Timed Text
Muxing mode : sbtl
Codec ID : tx3g
Duration : 48 min 21 s
Bit rate mode : Variable
Bit rate : 46 b/s
Stream size : 16.2 KiB (0%)
Language : German
Default : Yes
Forced : No
Alternate group : 3
[/src]
Nur eine Untertitelspur, irgendwas ist an meinem Befehl falsch, aber was?
 
Vergiss mein Posting oben. Du hast ja schon in AAC codiert. MP4 unterstützt Untertitel im "mov"-Format.
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #11
@Metal:
klappt so nicht
[src=text]ffmpeg -i Video.mkv -map 0 output.mp4[/src]
[src=text]Automatic encoder selection failed for output stream #0:3. Default encoder for format mp4 (codec none) is probably disabled. Please choose an encoder manually.
Error selecting an encoder for stream 0:3[/src]
Wie gesagt, habe herausgefunden, das mp4 nur mit mov_text kann.
@ Meta: Mein letzten Post gelesen?
 
Vielleicht hilft die explicite Zuordnung der Tracks.
Code:
Expand Collapse Copy
ffmpeg -i Video.mkv -map 0:0 -map 0:1 -map 0:2 -map 0:3 -c:v copy -c:a aac -b:a 128k -c:s mov_text -metadata:s:s:0 language=ger -metadata:s:s:1 language=eng Video.mp4


Oder du versuchst mal den englischen UT zu isolieren:
Code:
Expand Collapse Copy
ffmpeg -i Video.mkv -map 0:3 -c:s mov_text UT-2.ttx
 
  • Thread Starter Thread Starter
  • #14
Vielleicht hilft die explicite Zuordnung der Tracks.
Code:
Expand Collapse Copy
ffmpeg -i Video.mkv -map 0:0 -map 0:1 -map 0:2 -map 0:3 -c:v copy -c:a aac -b:a 128k -c:s mov_text -metadata:s:s:0 language=ger -metadata:s:s:1 language=eng Video.mp4
Damit habe ich jetzt 2 Audiospuren und nach wie vor nur die 1 Untertitelspur :D =
Code:
Expand Collapse Copy
General
Complete name                            : Video.mp4
Format                                   : MPEG-4
Format profile                           : Base Media
Codec ID                                 : isom (isom/iso2/avc1/mp41)
File size                                : 1.11 GiB
Duration                                 : 51 min 10 s
Overall bit rate mode                    : Variable
Overall bit rate                         : 3 113 kb/s
Writing application                      : Lavf57.71.100

Video
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : High@L4.1
Format settings, CABAC                   : Yes
Format settings, RefFrames               : 10 frames
Codec ID                                 : avc1
Codec ID/Info                            : Advanced Video Coding
Duration                                 : 51 min 10 s
Bit rate                                 : 2 846 kb/s
Width                                    : 1 280 pixels
Height                                   : 640 pixels
Display aspect ratio                     : 2.000
Frame rate mode                          : Variable
Frame rate                               : 23.976 (23976/1000) FPS
Minimum frame rate                       : 23.810 FPS
Maximum frame rate                       : 24.390 FPS
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.145
Stream size                              : 1.02 GiB (91%)
Writing library                          : x264 core 142 r2479 dd79a61
Encoding settings                        : cabac=1 / ref=10 / deblock=1:-3:-3 / analyse=0x3:0x133 / me=umh / subme=10 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=48 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=6,6 / fast_pskip=0 / chroma_qp_offset=-2 / threads=12 / lookahead_threads=2 / sliced_threads=0 / nr=0 / decimate=0 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=7 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=24 / scenecut=40 / intra_refresh=0 / rc_lookahead=250 / rc=crf / mbtree=1 / crf=15.5 / qcomp=0.70 / qpmin=0 / qpmax=69 / qpstep=4 / vbv_maxrate=38000 / vbv_bufsize=30000 / crf_max=0.0 / nal_hrd=none / filler=0 / ip_ratio=1.10 / aq=1:0.70

Audio #1
ID                                       : 2
Format                                   : AAC
Format/Info                              : Advanced Audio Codec
Format profile                           : LC
Codec ID                                 : 40
Duration                                 : 51 min 10 s
Duration_LastFrame                       : -11 ms
Bit rate mode                            : Constant
Bit rate                                 : 129 kb/s
Channel(s)                               : 2 channels
Channel(s)_Original                      : 6 channels
Channel positions                        : Front: L C R, Side: L R, LFE
Sampling rate                            : 48.0 kHz
Frame rate                               : 46.875 FPS (1024 SPF)
Compression mode                         : Lossy
Stream size                              : 47.0 MiB (4%)
Language                                 : German
Default                                  : Yes
Alternate group                          : 1

Audio #2
ID                                       : 3
Format                                   : AAC
Format/Info                              : Advanced Audio Codec
Format profile                           : LC
Codec ID                                 : 40
Duration                                 : 51 min 10 s
Bit rate mode                            : Constant
Bit rate                                 : 129 kb/s
Channel(s)                               : 2 channels
Channel(s)_Original                      : 6 channels
Channel positions                        : Front: L C R, Side: L R, LFE
Sampling rate                            : 48.0 kHz
Frame rate                               : 46.875 FPS (1024 SPF)
Compression mode                         : Lossy
Stream size                              : 47.1 MiB (4%)
Language                                 : English
Default                                  : No
Alternate group                          : 1

Text
ID                                       : 4
Format                                   : Timed Text
Muxing mode                              : sbtl
Codec ID                                 : tx3g
Duration                                 : 48 min 21 s
Bit rate mode                            : Variable
Bit rate                                 : 46 b/s
Stream size                              : 16.2 KiB (0%)
Language                                 : German
Default                                  : Yes
Forced                                   : No
Alternate group                          : 3
 
  • Thread Starter Thread Starter
  • #16
ich kann auf die Englisch Spur verzichten und nutze daher jetzt nur ein [kw]-c:s mov_text[/kw], passt schon
 
Damit habe ich jetzt 2 Audiospuren und nach wie vor nur die 1 Untertitelspur :D =

Weil ich erst jetzt bemerkt habe, dass in der Quelldatei auch zwei Audio-Track drin sind, insgesamt also 5 Tracks :m

Also müßte es korrekt heißen:
Code:
Expand Collapse Copy
ffmpeg -i Video.mkv -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:4 -c:v copy -c:a aac -b:a 128k -c:s mov_text -metadata:s:s:0 language=ger -metadata:s:s:1 language=eng Video.mp4
 
Die Expansion einer Dateinamens-Variablen sollte immer quotiert werden.

Was ist das für ein Ausdruck (funktioniert hier nicht):
Code:
Expand Collapse Copy
"$f:r.mp4"
 
Zurück
Oben