Ошибка “Operation not permitted” в ffmpeg при объединении файлов по конкретным временным меткам.

Вопрос или проблема

Я использую ffmpeg на MacOs 10.15.7 для соединения jpeg-файлов в определенные временные метки с использованием txt-файла с правами доступа 755 (содержание ниже)

file 'Walk1_pupil_00001_00.jpeg'
inpoint 00:00:00.862054
outpoint 00:00:01.722921
file 'Walk1_pupil_00002_00.jpeg'
inpoint 00:00:01.722922
outpoint 00:00:01.747019
file 'Walk1_pupil_00003_00.jpeg'
inpoint 00:00:01.747020
outpoint 00:00:01.748162
file 'Walk1_pupil_00003_00.jpeg'

Я запустил следующую команду в той же папке, где находятся изображения, которые я вызываю в txt-файле (который также находится в той же папке):

ffmpeg -f concat -safe 0 -i myra_test.txt -loglevel debug 1088x1080 -vcodec libx264 -pix_fmt yuv420p -metadata date=2021-04-27T19:27:05.000000Z /Users/mairahmac/Dropbox/My\ Mac\ \(Myras-MacBook-Pro.local\)/Desktop/Rotations/NanthiaSuthana/SpatialNavigationTask/subWalkVideoData/Walk1/VideoOut/myra_test.mp4 

что приводит к следующей ошибке:

ffmpeg version 4.4 Copyright (c) 2000-2021 the FFmpeg developers
  built with Apple clang version 12.0.0 (clang-1200.0.32.29)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.4_2 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-avresample --enable-videotoolbox
  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
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Splitting the commandline.
Reading option '-f' ... matched as option 'f' (force format) with argument 'concat'.
Reading option '-safe' ... matched as AVOption 'safe' with argument '0'.
Reading option '-i' ... matched as input url with argument 'myra_test.txt'.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument 'debug'.
Reading option '1088x1080' ... matched as output url.
Reading option '-vcodec' ... matched as option 'vcodec' (force video codec ('copy' to copy stream)) with argument 'libx264'.
Reading option '-pix_fmt' ... matched as option 'pix_fmt' (set pixel format) with argument 'yuv420p'.
Reading option '-metadata' ... matched as option 'metadata' (add metadata) with argument 'date=2021-04-27T19:27:05.000000Z'.
Reading option '/Users/mairahmac/Dropbox/My Mac (Myras-MacBook-Pro.local)/Desktop/Rotations/NanthiaSuthana/SpatialNavigationTask/subWalkVideoData/Walk1/VideoOut/myra_test.mp4' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option loglevel (set logging level) with argument debug.
Successfully parsed a group of options.
Parsing a group of options: input url myra_test.txt.
Applying option f (force format) with argument concat.
Successfully parsed a group of options.
Opening an input file: myra_test.txt.
[concat @ 0x7f8e8a809800] Opening 'myra_test.txt' for reading
[file @ 0x7f8e895236c0] Setting default whitelist 'file,crypto,data'
[NULL @ 0x7f8e8a80a400] Opening 'Walk1_pupil_00001_00.jpeg' for reading
[image2 @ 0x7f8e8a80a400] Format image2 probed with size=2048 and score=50
[image2 @ 0x7f8e8a80a400] Before avformat_find_stream_info() pos: 0 bytes read:19125 seeks:0 nb_streams:1
[mjpeg @ 0x7f8e89814200] marker=d8 avail_size_in_buf=19123
[mjpeg @ 0x7f8e89814200] marker parser used 0 bytes (0 bits)
[mjpeg @ 0x7f8e89814200] marker=e0 avail_size_in_buf=19121
[mjpeg @ 0x7f8e89814200] marker parser used 16 bytes (128 bits)
[mjpeg @ 0x7f8e89814200] marker=db avail_size_in_buf=19103
[mjpeg @ 0x7f8e89814200] index=0
[mjpeg @ 0x7f8e89814200] qscale[0]: 0
[mjpeg @ 0x7f8e89814200] marker parser used 67 bytes (536 bits)
[mjpeg @ 0x7f8e89814200] marker=db avail_size_in_buf=19034
[mjpeg @ 0x7f8e89814200] index=1
[mjpeg @ 0x7f8e89814200] qscale[1]: 1
[mjpeg @ 0x7f8e89814200] marker parser used 67 bytes (536 bits)
[mjpeg @ 0x7f8e89814200] marker=c0 avail_size_in_buf=18965
[mjpeg @ 0x7f8e89814200] Changing bps from 0 to 8
[mjpeg @ 0x7f8e89814200] sof0: picture: 1088x1080
[mjpeg @ 0x7f8e89814200] component 0 2:2 id: 0 quant:0
[mjpeg @ 0x7f8e89814200] component 1 1:1 id: 1 quant:1
[mjpeg @ 0x7f8e89814200] component 2 1:1 id: 2 quant:1
[mjpeg @ 0x7f8e89814200] pix fmt id 22111100
[mjpeg @ 0x7f8e89814200] Format yuvj420p chosen by get_format().
[mjpeg @ 0x7f8e89814200] marker parser used 17 bytes (136 bits)
[mjpeg @ 0x7f8e89814200] marker=c4 avail_size_in_buf=18946
[mjpeg @ 0x7f8e89814200] marker parser used 0 bytes (0 bits)
[mjpeg @ 0x7f8e89814200] marker=c4 avail_size_in_buf=18913
[mjpeg @ 0x7f8e89814200] marker parser used 0 bytes (0 bits)
[mjpeg @ 0x7f8e89814200] marker=c4 avail_size_in_buf=18730
[mjpeg @ 0x7f8e89814200] marker parser used 0 bytes (0 bits)
[mjpeg @ 0x7f8e89814200] marker=c4 avail_size_in_buf=18697
[mjpeg @ 0x7f8e89814200] marker parser used 0 bytes (0 bits)
[mjpeg @ 0x7f8e89814200] escaping removed 1 bytes
[mjpeg @ 0x7f8e89814200] marker=da avail_size_in_buf=18514
[mjpeg @ 0x7f8e89814200] marker parser used 18513 bytes (148104 bits)
[mjpeg @ 0x7f8e89814200] EOI missing, emulating
[mjpeg @ 0x7f8e89814200] decode frame unused 0 bytes
[image2 @ 0x7f8e8a80a400] After avformat_find_stream_info() pos: 19125 bytes read:19125 seeks:0 frames:1
[AVIOContext @ 0x7f8e89411440] Statistics: 19125 bytes read, 0 seeks
[AVIOContext @ 0x7f8e89523880] Statistics: 278 bytes read, 0 seeks
myra_test.txt: Operation not permitted

Я проверил все jpeg-файлы, чтобы убедиться, что они не повреждены, используя jpeginfo, и они все в порядке. Может ли кто-нибудь помочь мне с этим?

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

Используйте duration вместо этого.

См. документацию по concat demuxer и примеры на FFmpeg Wiki: Slideshow.

.

Ответ или решение

Проблема, с которой вы столкнулись при использовании FFmpeg для конкатенации JPEG изображений с указанием временных меток на MacOS 10.15.7, заключается в ошибке "Operation not permitted". Эта ошибка часто может ввести в заблуждение, так как кажется, что она связана с разрешениями на файлы. Однако, в вашем случае корень проблемы лежит в другом: использование параметров inpoint и outpoint неприменимо к неподвижным изображениям, таким как JPEG, которые по своей природе не содержат информации о длительности. Чтобы разобраться в этой проблеме и найти решение, давайте рассмотрим теоретические и практические аспекты.

Теория

FFmpeg — это мощный инструмент для обработки мультимедийных данных, который позволяет реализовывать широкий спектр операций, включая конкатенацию видео и изображений. Для конкатенации изображений FFmpeg использует "concat demuxer", который может объединять несколько файлов, описанных в текстовом файле. В этом файле можно задавать различные параметры, такие как duration, чтобы явно указать, как долго изображение должно отображаться в конечном видеофайле.

В вашем случае вы ошибочно пытаетесь использовать inpoint и outpoint, которые предназначены для аудио- и видеопотоков, имеющих временные метки и длительность. JPEG файлы являются статичными, и поэтому для них не определены временные метки начала и завершения.

Пример

Рассмотрим, как правильно настроить текстовый файл для конкатенации изображений. Предположим, что у вас есть несколько изображений, которые вы хотите объединить в видео. Вам нужно указать, как долго каждое изображение должно быть видимым.

Пример содержимого текстового файла images.txt, который может быть правильно обработан FFmpeg:

file 'Walk1_pupil_00001_00.jpeg'
duration 1.0
file 'Walk1_pupil_00002_00.jpeg'
duration 0.025
file 'Walk1_pupil_00003_00.jpeg'
duration 0.001
file 'Walk1_pupil_00003_00.jpeg'

Здесь мы заменили inpoint и outpoint на параметр duration, задающий длительность показа каждого изображения в секундах.

Применение

Теперь, после обновления текстового файла с указанием duration, вы можете снова запустить команду FFmpeg для конкатенации:

ffmpeg -f concat -safe 0 -i images.txt -loglevel debug -vcodec libx264 -pix_fmt yuv420p -metadata date=2021-04-27T19:27:05.000000Z /path/to/output/myra_test.mp4

В этой команде:

  • -f concat указывает FFmpeg использовать формат concat для обработки входного файла.
  • -safe 0 позволяет использовать относительные пути в файле списков.
  • -i images.txt — это путь к вашему текстовому файлу с описанием изображений.
  • -vcodec libx264 указывает кодек, который используется для кодирования видео.
  • -pix_fmt yuv420p используется для обеспечения совместимости видео с большинством плееров.
  • -metadata date=... добавляет метаданные с указанием даты.

Заключение

Используйте параметр duration вместо inpoint и outpoint для указания длительности отображения каждого изображения. Это поможет избежать ошибки "Operation not permitted" и успешно создать видео из статических изображений. FFmpeg предоставляет документацию и многочисленные примеры, которые могут помочь вам понять специфику работы с форматами и параметрами. Обязательно изучите официальную документацию и примеры на тематических ресурсах, таких как FFmpeg Wiki, чтобы расширить свои знания и эффективно использовать возможности этого инструмента.

Оцените материал
Добавить комментарий

Капча загружается...