LINUX.ORG.RU

ffmpeg не принимает файл без расширения

 , ,


0

1

ffmpeg не хочет работать с картинкой если в её имени отсутствует расширение.

с этой картинкой работает:

ffmpeg -y -i pic.jpg -vf "drawtext=text='sometext':x=50:y=50:fontsize=30:fontcolor=black: " pic.jpg
а с этой ошибка:
~$ffmpeg -y -i picture -vf "drawtext=text='sometext':x=50:y=50:fontsize=30:fontcolor=black: " picture
...

...
[NULL @ 0x5cb0583fe8c0] Unable to find a suitable output format for 'picture'
picture: Invalid argument
~$

Можно как-нибудь обойтись без расширения?

Используй ключ -f и указывай формат вывода.

ffmpeg -y -i picture -vf "drawtext=text='sometext':x=50:y=50:fontsize=30:fontcolor=black: " 
 -f jpg picture_2

Считывать и выводить в один и тот же файл нельзя.

anonymous
()

«-f jpg» указывает формат выходного файла. Без расширения ffmpeg не знает в какой контейнер помещать.

anonymous
()
Ответ на: комментарий от anonymous

проверил, сначала не получилось, потом подставил -f mjpeg и всё гуд. А почему нельзя в один и тот же файл?

WildUser
() автор топика
Ответ на: комментарий от WildUser

Почитай пожалуйста что-нибудь по программированию и вообще компьютерам.

Одновременно открыть файл на чтение и запись нельзя. Об этом рассказывают на уроках программирования вроде бы даже в школе.

Поэтому и нельзя в ffmpeg считывать и записывать сразу в один и тот же файл.

При открытии файла, указанного в опции -i вызывается функция fopen, создаётся файловый первый файловый дескриптор, ffmpeg считывает заголовок и определяет тип файла.

Затем открывается второй файл, указанный в конце команды, тоже через fopen, но уже на запись, для него создаётся второй файловый дескриптор.

После чего ffmpeg начинает считывать первый файл, кодировать данные из первого файла и записывать во второй.

Как ты понимаешь проблема в принципе уже здесь, ты сразу хочешь считывать данные и записывать в один и тот же файл, хоть и доступный через разные файловые дескрипторы, но по сути один и тот же.

Данные непосредственно в файл и файловую систему записываются не сразу. В начале они находятся в кэше файловой системы.

Если объем данных большой, то кэш может начать записываться на файловую систему непосредственно в файл.

В конце когда первый файл до конца прочитан, а второй записан вызывается функция fclose для первого файлового дескриптора и второго.

После чего остатки кэша записываются на диск.

И вот здесь в случае если ты открывал один и тот же файл в самом файле у тебя будет каша.

anonymous
()
Ответ на: комментарий от anonymous

а почему тогда есть функция -y ? или ffmpeg сначала копирует, а потом удаляет исходник, а готовый файл переименовует? Я всё понимаю, просто картинка маленькая ffmpeg её мог просто сначала прочитать, а потом записать изменения в тот же файл. Это ведь реально?) картинка ведь может в оперативной памяти хранится. а если указать все параметры изображения то нужные изменения можно внести в файл без его чтения. верно? программе нужно знать как минимум в каком месте рисовать и для этого нужно разрешение знать.

WildUser
() автор топика
Ответ на: комментарий от anonymous

Ну и ещё такой момент, почему с -y работает, а с вашей командой отказывается? нет проблемы добавить команду удаления исходников, НО есть нужда сохранить первичные имена файлов. это возможно без костылей?

WildUser
() автор топика
Ответ на: комментарий от WildUser

а почему тогда есть функция -y

Ты читал описание этой опции? «overwrite outpit file».

Допустим ты кодируешь файл первый раз

ffmpeg -i input.png output.jpg

И потом вызываешь команду второй раз

ffmpeg -i input.png output.jpg

В общем случае, без указания опции «-y» ffmpeg выдаст ошибку, что дескать файл output.jpg уже есть.

С опцией «-y» он перезапишет файл.

или ffmpeg сначала копирует, а потом удаляет исходник, а готовый файл переименовует?

В опции «-y» речь идёт именно об выходном файле, с этой опцией он его просто перезапишет.

Функция fopen умеет открывать файловые дескрипторы в разных режимах.

  • на чтение
  • на чтение и добавление
  • на запись нового файла
  • на перезапись существующего файла

И вот опция «-y» указывает, что при вызове функции fopen для выходного файла нужно создать файловый дескриптор с разрешением на перезапись существующего файла, а не просто на создание нового файла.

Я всё понимаю, просто картинка маленькая ffmpeg её мог просто сначала прочитать, а потом записать изменения в тот же файл.

Может и может, но ffmpeg работает с файлами или потоком данных.

А это значит, что в начале открывается входной файл, затем открывается выходной файл, данные из входного файла считываются, кодируются и записываются в выходной.

Т.е. код написан примерно так:

f1 = fopen(file1, r)
f2 = fopen(file2, w)
ТУТ ИДЁТ ЦИКС ПОКА СЧИТЫВАЮТСЯ ДАННЫЕ
  data1 = fread(size, count, f1)
  data2 = coding(data1)
  fwrite(data2, f2)
ДЕЛАЙ
fclose(f1)
fclose(f2)

Если ты используешь опцию «-y», то файл f2 открывается с разрешением на перезапись

Как ты видишь в этом алгоритме нет кода, который в начале прочитает тебе весь входной файл в память.

Прочти предыдущий мой комментарий ещё раз и обдумай написанное там.

Считывать и записывать сразу в один файл НЕЛЬЗЯ.

Прими это как аксиому.

И почитай что-нибудь по программированию и компьютерам в целом.

anonymous
()
Ответ на: комментарий от anonymous

Да я вас понял но тут такое дело, что у меня работает команда:

ffmpeg -i -y input.jpg input.jpg
то есть имя входного и выходного файла совпадают и всё без ошибок выполняется) Что скажите?

WildUser
() автор топика
Ответ на: комментарий от WildUser

Значит в ffmpeg добавили проверку что если имя входного и выходного файла совпадает, то вывод осуществлять во временный файл, потом закрывать входной и выходной файл и входной файл заменять временным.

anonymous
()
Ответ на: комментарий от WildUser

Ты пишешь, что у тебя не работает в связке с find, вот я тебя и спрашиваю показать как ты написан с find, что у тебя не работает.

anonymous
()
Ответ на: комментарий от anonymous
find . -type f -exec ffmpeg -y -i {} vf "drawtext=text='hello world':x=50:y=50:fontsize=30:fontcolor=black" -f mjpeg {} \;
WildUser
() автор топика
Ответ на: комментарий от WildUser

У меня вот так команда отрабаытвает:

$ ffmpeg -i input -f mjpeg input -y
ffmpeg version 3.2.14-1~deb9u1 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
  configuration: --prefix=/usr --extra-version='1~deb9u1' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 34.101 / 55. 34.101
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.101 / 57. 56.101
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Input #0, jpeg_pipe, from 'input':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 545x545 [SAR 37:37 DAR 1:1], 25 tbr, 25 tbn, 25 tbc
Output #0, mjpeg, to 'input':
  Metadata:
    encoder         : Lavf57.56.101
    Stream #0:0: Video: mjpeg, yuvj444p(pc), 545x545 [SAR 37:37 DAR 1:1], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
    Metadata:
      encoder         : Lavc57.64.101 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> mjpeg (native))
Press [q] to stop, [?] for help
frame=    1 fps=0.0 q=4.7 Lsize=      32kB time=00:00:00.04 bitrate=6651.8kbits/s speed=9.11x
video:32kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%

Файл не побился.

Но так, как ты пытаешься изгаляться это в принципе неправильно.

И для работы с изображениями обычно применяется imagemagick.

anonymous
()
Ответ на: комментарий от anonymous

почему неправильно? к сожалению только ffmpeg есть возможность использовать

WildUser
() автор топика
Ответ на: комментарий от anonymous

В линуксе можно. Если запись в новый файл происходит после удаления предыдущего, то старый файл «держится» системной для инпута. Но это как-то рисковано.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.