ffmpeg concat tidak bekerja dengan path absolut

14

Saya perlu menggunakan concat dengan jalur absolut, tetapi sepertinya tidak berhasil. Dalam dokumen itu dikatakan harus bekerja. Adakah yang punya ide bagaimana membuatnya bekerja? ffmpeg Doc

Itu tidak berfungsi karena tampaknya menambahkan direktori file teks ke path file

Impossible to open 'C:/temp/ffmpeg/c:/temp/ffmpeg/01.mov'

Saya menggunakan Windows 7.

ffmpegTest.txt:
file 'c:/temp/ffmpeg/01.mov'
file 'c:/temp/ffmpeg/02.mov'

"Y:/Shotgun/bin/ffmpeg/bin/ffmpeg.exe" -f concat -i "C:/temp/ffmpeg/ffmpegTest.txt" -c copy "C:/temp/ffmpeg/test.mov
ffmpeg version N-58949-g0e575c2 Copyright (c) 2000-2013 the FFmpeg developers
  built on Dec  9 2013 22:06:49 with gcc 4.8.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 58.100 / 52. 58.100
  libavcodec     55. 45.100 / 55. 45.100
  libavformat    55. 22.100 / 55. 22.100
  libavdevice    55.  5.102 / 55.  5.102
  libavfilter     3. 92.100 /  3. 92.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
[concat @ 0000000000337920] Impossible to open 'C:/temp/ffmpeg/c:/temp/ffmpeg/01.mov'
C:/temp/ffmpeg/ffmpegTest.txt: Invalid argument
DarkPixel
sumber

Jawaban:

16

Saya hanya mengalami pesan kesalahan serupa. Saya akhirnya menemukan jawabannya. Ada dua masalah.

Masalah 1:

Ketika melakukan

ffmpeg -f concat -i <path_to_text_file> ...

yang path_to_text_fileharus menggunakan garis miring ke depan, bukan backslashes, bahkan dalam Windows. Aturan ini tampaknya tidak berlaku untuk jalur file video pada baris perintah - hanya untuk jalur file teks pada baris perintah.

Edisi 2:

Jalur yang tercantum dalam file teks Anda ditafsirkan oleh ffmpeg sebagai relatif terhadap lokasi file teks Anda. (Secara khusus, jalur yang terdaftar tidak relatif terhadap direktori kerja saat ini.)

Jadi, misalnya, jika file video yang Anda coba gabungkan bersama berada di direktori yang sama dengan file teks Anda (tetapi berbeda dari direktori kerja saat ini), maka jalur yang tercantum dalam file teks Anda seharusnya hanya nama file video tanpa direktori sebelumnya.

Semoga ini bisa membantu seseorang di masa depan.

anjing laut
sumber
Jalur yang tercantum dalam file teks Anda ditafsirkan oleh ffmpeg sebagai relatif terhadap lokasi file teks Anda. Ada bug di ffmpeg di bawah windows, yang disorot dalam jawaban saya
Leon
2

Anda dapat juga menggunakan file teks yang merupakan daftar file masukan seperti:

ffmpeg -f concat -i ffmpegTest.txt -c:v copy output.mov

ATAU

Anda dapat secara eksplisit memberi nama file seperti:

ffmpeg.exe -f concat -i 'c:/temp/ffmpeg/01.mov' -i 'c:/temp/ffmpeg/02.mov' -c:v copy 'C:/temp/ffmpeg/output.mov'    

Perhatikan bahwa Anda menggunakan 2 input satu demi satu, dan kemudian gunakan -c:v copyuntuk mengatakan bahwa seharusnya tidak ada penyatuan kembali pengkodean saja. Juga, ini adalah demuxer concat . Ini fleksibel, tetapi membutuhkan 2 file input untuk memiliki codec yang sama.

Konten file teks adalah seperti yang Anda tulis:

file 'c:/temp/ffmpeg/01.mov'
file 'c:/temp/ffmpeg/02.mov'

Perhatikan kutipan tunggal

Format generik adalah:

file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

Itu akan berlaku untuk banyak drive dan jalur.

Berikut ini adalah contoh nyata dari file gabungan yang berfungsi:

file '/run/media/rnx/New Volume1/PREMIER_OUTPUTEST/Sequence004.mpeg'
file '/home/rnx/Sequence003.mpeg'
file '/run/user/rnx/gvfs/users on edtmchn/Public/Sequence01.mpeg'

Ini melintasi:
Satu drive internal Satu drive
USB eksternal
Satu drive jaringan pada mesin windows lain pada domain yang sama

Penggunaan perintah adalah:

ffmpeg -f concat -i conc.txt -c:v copy -strict -2 output.mpeg

Ini berfungsi seperti yang diharapkan tanpa kesalahan.

Rajib
sumber
1
Saya perlu menggunakan file karena saya dapat memiliki banyak video. Dan saya perlu path absolut dalam file
DarkPixel
Saya tidak bisa, file ada di drive jaringan dan di beberapa folder. Saya tidak bisa memaksakan direktori tertentu
DarkPixel
Saya memiliki kesalahan ini dengan jalur absolut: Mustahil untuk membuka 'C: / temp / ffmpeg / c: /temp/ffmpeg/01.mov'
DarkPixel
Anda mendapatkan kesalahan karena perintah Anda salah. Lihat jawabannya.
Rajib
1
Jawaban ini berfungsi pada ffmpeg versi N-90173, Win10, CMD meminta hanya jika parameter -i TIDAK memiliki tanda kutip tunggal dan TIDAK menggunakan tanda garis miring: -i C: \ foo \ bar \ filelist.txt
Jay Borseth
2

Memperhatikan; pada Windows, jika Anda menggunakan concat dengan textfile, path di textfile harus relatif terhadap path output .

Misalnya

ffmpeg -f concat -i file.txt "C:\foo\file.mp4"

Jika file Anda berada di direktori C:\temp\bar.mp4filefile Anda terlihat seperti ini:

file ..\temp\bar.mp4
...
Patrick
sumber
1
"Karakter yang hilang ?
DavidPostill
2

Menggunakan

ffmpeg.exe" -f concat -safe 0 -i fileWithAbsoluePaths.txt -c copy out.mov

Dalam kasus Anda

"Y:/Shotgun/bin/ffmpeg/bin/ffmpeg.exe" -f concat -safe 0 -i "C:/temp/ffmpeg/ffmpegTest.txt" -c copy "C:/temp/ffmpeg/test.mov

Kuncinya adalah -aman 0 . Itu memungkinkan Anda untuk meletakkan path absolut dalam file txt.

Eric
sumber
Di bawah windows ada peringatan yang tercakup dalam jawaban saya: superuser.com/a/1374679/598963
Leon
2

@ Eric menjawab memberikan instruksi penting untuk memungkinkan path lengkap dalam input demuxer concat (Anda harus memberikan -safe 0opsi ke ffmpeg). Namun, di bawah Windows, demuxer concat ffmpeg tidak benar menangani path absolut / penuh dimulai dengan nama disk . Meskipun ia benar mengenali jalur penuh dalam pemeriksaan keamanannya, ia salah menafsirkan jalur tersebut sebagai relatif (karena tidak dimulai dengan garis miring) saat membuka file. Karena jalur non-absolut relatif terhadap lokasi skrip input demuxer concat, ffmpegtambahkan path yang terakhir ke path file. Jika argumen baris perintah skrip concat tidak mengandung pemisah jalur file (yaitu hanya nama file) masalahnya tertutup.

Ilustrasi:

concat.txt:
file 'c:/videos/01.flv'
file 'c:/videos/02.flv'


ffmpeg -f concat -safe 0 -i "C:/temp/concat.txt" -c copy "C:/temp/test.flv"
...
[concat @ 0000000000abcdef] Impossible to open 'C:/temp/c:/videos/01.flv'
C:/temp/concat.txt: Invalid argument


cd C:\temp
ffmpeg -f concat -safe 0 -i "./concat.txt" -c copy "C:/temp/test.flv"
...
[concat @ 0000000000abcdef] Impossible to open './c:/videos/01.flv'
./concat.txt: Invalid argument


ffmpeg -f concat -safe 0 -i "concat.txt" -c copy "C:/temp/test.flv"
# Works successfully!
Leon
sumber
-1

Walaupun cmd.execase-insensitive, ffmpegtidak (sedang dibangun terutama di linux, ia cenderung ke * nix shell conventions). Jika Anda mengubah c:pada setiap baris file input Anda C:, itu akan berfungsi, saya pikir.

Evilsoup
sumber