Puncte:0

`ffmpeg` nu recunoaște intrarea din pipe pentru fuzionarea mp4 prin intermediul demuxerului concat

drapel in

Vreau să fuzionez fișierele mp4 prin demuxer-ul concat și nu îl pot face să funcționeze cu un script.

Folosesc scriptul dintr-un alt răspuns AskUbuntu, numit concatmp4 Aici:

#!/usr/bin/env bash

dacă [ $# -lt 1 ]; atunci
    echo "Utilizare: `basename $0` input_1.mp4 input_2.mp4 ... output.mp4"
    iesirea 0
fi

ARGS=("$@") # determină toate argumentele
output=${ARGS[${#ARGS[@]}-1]} # obține ultimul argument (fișier de ieșire)
dezactivați ARGS[${#ARGS[@]}-1] # aruncați-l din matrice
(pentru f în „${ARGS[@]}”; ecou „fișierul „$f””; gata) | ffmpeg -protocol_whitelist file,pipe -f concat -safe 0 -i pipe: -vcodec copy -acodec copy $output

Cu toate acestea, când îl rulez pe fișiere mp4, primesc întotdeauna

$ concatmp4 Itazuraguma_no_Gloomy_01.mp4 Itazuraguma_no_Gloomy_02.mp4 test.mp4
ffmpeg versiunea 4.4-6ubuntu5 Copyright (c) 2000-2021 dezvoltatorii FFmpeg
  construit cu gcc 11 (Ubuntu 11.2.0-7ubuntu1)
  configurație: --prefix=/usr --extra-version=6ubuntu5 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu -- arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca -- enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack -- enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy -- enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp -- enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx -- enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 -- enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil 56. 70.100 / 56. 70.100
  libavcodec 58.134.100 / 58.134.100
  libavformat 58. 76.100 / 58. 76.100
  libavdevice 58. 13.100 / 58. 13.100
  libavfilter 7.110.100 / 7.110.100
  libswscale 5. 9.100 / 5. 9.100
  libswresample 3. 9.100 / 3. 9.100
  libpostproc 55. 9.100 / 55. 9.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55f2ed650200] Format mov,mp4,m4a,3gp,3g2,mj2 detectat numai cu scorul scăzut de 1, este posibilă detectarea greșită!
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55f2ed650200] moov atom nu a fost găsit
[concat @ 0x55f2ed63e440] Imposibil de deschis „pipe:Itazuraguma_no_Gloomy_01.mp4”
pipe:: S-au găsit date nevalide la procesarea intrării

Când modific ultima linie a scriptului la (pentru f în „${ARGS[@]}”; ecou „fișierul „$f””; gata) > input.textși apoi alergați ffmpeg -f concat -i input.text -c copy output.mp4 din linia de comandă, funcționează (!). Doar pentru a clarifica, când folosesc -c copie în script, eroarea este aceeași.

Funcționează și când scriptul trece printr-un fișier temporar:

... # linii după linia „unset” din original:
tmpfile="${output%.mp4}.tmp"
(pentru f în „${ARGS[@]}”; ecou „fișierul „$f””; gata) > „$tmpfile”
ffmpeg -f concat -safe 0 -i „$tmpfile” -c copie „$output”
rm "$tmpfile"

Ce este necesar pentru ca scenariul să funcționeze?

Puncte:1
drapel in

Conform instrumentului de urmărire a erorilor al ffmpeg, au existat modificări în versiunile mai noi. De la lansarea între 4.2.2 și 4.3.2, gestionarea URL-urilor relative a fost remediată pentru a o face compatibilă cu recomandările oficiale.

Dacă există nume de fișiere goale în scriptul concat, fișierele ar trebui să locuiască în același director (și, desigur, protocol) ca și scriptul. Ceea ce, desigur, nu este posibil pentru pipe:, dar încă se aplică. Dacă scriptul este salvat într-un fișier temporar, protocolul său se schimbă în „fișier” și vechea metodă funcționează din cauza acestei modificări.

Intrarea canalizată trebuie să specifice atât concatul fişier si protocolul fişier: în codul concat.

Exemplu pentru moment introducerea necesară prin teava protocol: fișier fișier: „input_01.mp4” în loc de vechi fișierul „input_01.mp4”.

Noua versiune a scriptului trebuie schimbată în

#!/usr/bin/env bash

dacă [ $# -lt 1 ]; atunci
    echo "Utilizare: `basename $0` input_1.mp4 input_2.mp4 ... output.mp4"
    iesirea 0
fi

ARGS=("$@") # determină toate argumentele
output=${ARGS[${#ARGS[@]}-1]} # obține ultimul argument (fișier de ieșire)
dezactivați ARGS[${#ARGS[@]}-1] # aruncați-l din matrice
(pentru f în „${ARGS[@]}”; face echo „fișier fișier:’$f’”; gata) | ffmpeg -protocol_whitelist file,pipe -f concat -safe 0 -i pipe: -c:v copy -c:a copy $output

a munci.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.