Как исправить ошибку «отсутствует ffmpeg.dll»?

Running ffmpeg.exe without opening a console window

If you want to run your ffmpeg «from a gui» without having it popup a console window which spits out all of ffmpeg’s input, a few things that may help:

  • If you can start your program like rubyw.exe or javaw.exe then all command line output (including child processes’) is basically not attached to a console.
  • If your program has an option to run a child program «hidden» or the like, that might work. If you redirect stderr and stdout to something you receive, that might work (but might be tricky because you may need to read from both pipes in different threads, etc.)

ffdshow tryouts

​ffdshow tryouts is a separate project that basically wraps FFmpeg’s core source (libavcodec, etc.) and then presents them as filter wrappers that your normal Windows applications can use for decoding video, etc. It’s not related to FFmpeg itself, per se, though uses it internally. see also https://github.com/Nevcairiel/LAVFilters?

Add FFmpeg to Windows 10 Path

3. To add FFmpeg to Windows 10 path, search for «Edit the system environment variables» in the Start menu and click on the result. Doing so will open the System Properties window.

4. Go to the «Advanced» tab and click on the «Environment Variables» button.

5. Select the «Path» variable and click «Edit.»

6. Click «New.»

7. In the blank field, type «C:\ffmpeg\bin» and click on the «Ok» button.

Note: If you’ve placed the FFmpeg folder in some other folder or drive then change the directory path accordingly.

8. This is how it looks like in the main Environment Variables window. Click on the «Ok» button to save changes.

9. That’s it. Close the main window and you are good to go.

Add FFmpeg to Windows 7 or Windows 8 Path

The procedure the add FFmpeg to Windows 7 path is similar to Windows 10 but the user interface is a bit different. Let me show you how to do it.

1. Open the Start menu, search for «Edit System Environment Variables» and click on the result.

2. Next, go to the Advanced tab and click on the «Environment Variables» button.

3. Under the System Variables section, find the «Path» variable, select it, click on the «Edit» button.

4. Go to the end of the line in the «Variable Value» field and add . Click on the «Ok» button to save changes. Each path you add in the value field should be separated by .

Note: If you’ve stored FFmpeg in some other folder then change the path accordingly.

Usage

Video Encoding

Code:

FFmpeg ffmpeg = new FFmpeg("/path/to/ffmpeg");
FFprobe ffprobe = new FFprobe("/path/to/ffprobe");

FFmpegBuilder builder = new FFmpegBuilder()

  .setInput("input.mp4")     // Filename, or a FFmpegProbeResult
  .overrideOutputFiles(true) // Override the output if it exists

  .addOutput("output.mp4")   // Filename for the destination
    .setFormat("mp4")        // Format is inferred from filename, or can be set
    .setTargetSize(250_000)  // Aim for a 250KB file

    .disableSubtitle()       // No subtiles

    .setAudioChannels(1)         // Mono audio
    .setAudioCodec("aac")        // using the aac codec
    .setAudioSampleRate(48_000)  // at 48KHz
    .setAudioBitRate(32768)      // at 32 kbit/s

    .setVideoCodec("libx264")     // Video using x264
    .setVideoFrameRate(24, 1)     // at 24 frames per second
    .setVideoResolution(640, 480) // at 640x480 resolution

    .setStrict(FFmpegBuilder.Strict.EXPERIMENTAL) // Allow FFmpeg to use experimental specs
    .done();

FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe);

// Run a one-pass encode
executor.createJob(builder).run();

// Or run a two-pass encode (which is better quality at the cost of being slower)
executor.createTwoPassJob(builder).run();

Get Media Information

Code:

FFprobe ffprobe = new FFprobe("/path/to/ffprobe");
FFmpegProbeResult probeResult = ffprobe.probe("input.mp4");

FFmpegFormat format = probeResult.getFormat();
System.out.format("%nFile: '%s' ; Format: '%s' ; Duration: %.3fs", 
	format.filename, 
	format.format_long_name,
	format.duration
);

FFmpegStream stream = probeResult.getStreams().get();
System.out.format("%nCodec: '%s' ; Width: %dpx ; Height: %dpx",
	stream.codec_long_name,
	stream.width,
	stream.height
);

Get progress while encoding

FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe);

FFmpegProbeResult in = ffprobe.probe("input.flv");

FFmpegBuilder builder = new FFmpegBuilder()
	.setInput(in) // Or filename
	.addOutput("output.mp4")
	.done();

FFmpegJob job = executor.createJob(builder, new ProgressListener() {

	// Using the FFmpegProbeResult determine the duration of the input
	final double duration_ns = in.getFormat().duration * TimeUnit.SECONDS.toNanos(1);

	@Override
	public void progress(Progress progress) {
		double percentage = progress.out_time_ns  duration_ns;

		// Print out interesting information about the progress
		System.out.println(String.format(
			" status:%s frame:%d time:%s ms fps:%.0f speed:%.2fx",
			percentage * 100,
			progress.status,
			progress.frame,
			FFmpegUtils.toTimecode(progress.out_time_ns, TimeUnit.NANOSECONDS),
			progress.fps.doubleValue(),
			progress.speed
		));
	}
});

job.run();

Choose a preset and tune

Preset

A preset is a collection of options that will provide a certain encoding speed to compression ratio. A slower preset will provide better compression (compression is quality per filesize). This means that, for example, if you target a certain file size or constant bit rate, you will achieve better quality with a slower preset. Similarly, for constant quality encoding, you will simply save bitrate by choosing a slower preset.

Use the slowest preset that you have patience for. The available presets in descending order of speed are:

  • ultrafast
  • superfast
  • veryfast
  • faster
  • fast
  • medium – default preset
  • slow
  • slower
  • veryslow
  • placebo – ignore this as it is not useful (see )

You can see a list of current presets with -preset help (see below). If you have the x264 binary installed, you can also see the exact settings these presets apply by running x264 --fullhelp.

Tune

You can optionally use -tune to change settings based upon the specifics of your input. Current tunings include:

  • film – use for high quality movie content; lowers deblocking
  • animation – good for cartoons; uses higher deblocking and more reference frames
  • grain – preserves the grain structure in old, grainy film material
  • stillimage – good for slideshow-like content
  • fastdecode – allows faster decoding by disabling certain filters
  • zerolatency – good for fast encoding and low-latency streaming
  • psnr – ignore this as it is only used for codec development
  • ssim – ignore this as it is only used for codec development

For example, if your input is animation then use the animation tuning, or if you want to preserve grain in a film then use the grain tuning. If you are unsure of what to use or your input does not match any of tunings then omit the -tune option. You can see a list of current tunings with -tune help, and what settings they apply with x264 --fullhelp.

Profile

The -profile:v option limits the output to a specific H.264 profile. Some devices (mostly very old or obsolete) only support the more limited Constrained Baseline or Main profiles. You can set these profiles with -profile:v baseline or -profile:v main.

Most modern devices support the more advanced High profile. Unless you need to support limited devices the recommendation is to omit setting the profile which will allow x264 to automatically select the appropriate profile.

Note that usage of -profile:v is incompatible with lossless encoding.

List presets and tunes

To list all possible internal presets and tunes:

ffmpeg -hide_banner -f lavfi -i nullsrc -c:v libx264 -preset help -f mp4 -

Note: Windows users may need to use NUL instead of - as the output.

Как исправить ffmpeg.dll missing error?

Если «ffmpeg.dll отсутствует» не удалось, используйте один из правильных методов для решения проблемы: ручной или автоматический. В первом случае вам необходимо скачать файл ffmpeg.dll и отправить его в папку установки игры / приложения. Во втором случае система автоматически исправляет ошибку с минимальными усилиями.

Мы предлагаем несколько эффективных методов:

Способ 1: скачать ffmpeg.dll

Диспетчер загрузки отслеживает изображения, документы и другие файлы, загруженные из Интернета. Загруженные ffmpeg.dll автоматически сохраняются в папке «Загрузки». Эта папка обычно находится на диске, на котором установлена ​​Windows (например, C: \ Users \ username \ Downloads). Загруженные файлы можно перемещать из папки «Загрузки» в другие папки на компьютере.

В зависимости от типа загружаемого файла доступны следующие параметры:

  • Откройте файл для просмотра, но не сохраняйте его на компьютере.

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

  • Сохраните под другим именем, с другим типом или в другой папке на компьютере.

  • Запустите приложение, расширение или файл другого типа. После того как система выполнит проверку безопасности, файл откроется и запустится на компьютере.

  • Отмените загрузку и вернитесь к просмотру веб-страниц.

Вы также можете сохранять файлы меньшего размера, например отдельные изображения, на своем компьютере. Для этого щелкните правой кнопкой мыши изображение, ссылку или файл и выберите «Сохранить изображение» или «Сохранить объект как».

ffmpeg.dll , 3 доступных версий
Bits & Version File size Language Description Checksums
64bit
1.0.0.0
3.8 MB U.S. English N/A

MD5

MD5
13dbfbd98d49e611ecf838553c150f15

SHA1

SHA1
0d94d6bfe19148e75e8ae789dead5d6d2dcc2a33

Download
32bit
1.0.0.0
11.9 MB U.S. English N/A

MD5

MD5
386f6afe8d447ba0a761efdd722c01cf

SHA1

SHA1
6aa64a2e79539c924a1b7ee43d3a4f444db8877a

Download
32bit
1.0.0.0
3.7 MB U.S. English N/A

MD5

MD5
74099c85f006daa91c1432985cf1487f

SHA1

SHA1
11a7f473cd1a2158781a0fbe3386377ce3bb1f5e

Download

Загрузка и предупреждения безопасности

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

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

Предупреждение безопасности «Не удалось проверить достоверность издателя этой программы» означает, что

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

Внимание! Скачивание ffmpeg.dll из Интернета всегда рискованно

Вот некоторые меры предосторожности, которые вы можете предпринять, чтобы защитить свой компьютер при загрузке файлов:

  • Установите и используйте антивирусную программу.
  • Скачать ffmpeg.dll только с доверенных сайтов
  • Если ffmpeg.dll имеет цифровую подпись, убедитесь, что он действителен и файл получен из надежного источника. Чтобы просмотреть цифровую подпись, щелкните ссылку издателя в диалоговом окне с предупреждением о безопасности, которое появляется при первой загрузке файла.

Verifying your FFmpeg Environment Setup

Launch Visual Studio ARM Cross Tools Command Prompt. E.g.

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2015\Visual Studio Tools\Windows Desktop Command Prompts\VS2015 x86 ARM Cross Tools Command Prompt

Open MSYS2 Shell from the command prompt above (use the correct drive and location of your MSYS2 installation). Note that the command shell above will close and it may take a while for the MSYS2 shell to launch.

C:\msys64\msys2_shell.cmd

In the MSYS2 shell verify that all the tools below are setup properly by running the following commands

$ which cl
/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/x86_ARM/cl

$ which link
/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/x86_ARM/link

$ which armasm
/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/x86_ARM/armasm

$ which yasm
/usr/bin/yasm

$ which cpp
/usr/bin/cpp

$ which gas-preprocessor.pl
/usr/bin/gas-preprocessor.pl

Verify that the tools are in the path and point to the right location where MSYS2 and Visual Studio are installed

To keep the source tree clean and the platforms separated, we will have the intermediate files go to the Output\<Platform>\<Architecture> folder under the FFmpeg source tree. We will also have the install files (the files necessary to link and use FFmpeg in your application) go to the Build\<Platform>\<Architecture> folder under the FFmpeg source tree.

Причины ошибок в файле Opencv_ffmpeg.dll

Большинство ошибок opencv_ffmpeg.dll связано с отсутствием или повреждениями файлов opencv_ffmpeg.dll. Тот факт, что opencv_ffmpeg.dll – внешний файл, открывает возможность для всяческих нежелательных последствий.

Непредвиденные завершения работы вашего компьютера или заражение вирусом может повредить opencv_ffmpeg.dll, что приведет к ошибкам dll. Когда файл opencv_ffmpeg.dll повреждается, он не может быть нормально загружен и выведет сообщение об ошибке.

В других случаях ошибки файла opencv_ffmpeg.dll могут быть связаны с проблемами в реестре Windows. Нерабочие ссылки DLL файлов могут помешать зарегистрировать файл dll должным образом и вызвать ошибку opencv_ffmpeg.dll. Эти нерабочие ключи реестра могут появиться в результате отсутствия файла DLL, перемещения файла DLL или ввиду наличия остаточной ссылки DLL файла в реестре Windows после неудачной установки или удаления программы.

Более конкретно, данные ошибки opencv_ffmpeg.dll могут быть вызваны следующими причинами:

  • Ошибочные или поврежденные записи реестра для opencv_ffmpeg.dll
  • Вирус или вредоносное ПО, повредившее файл opencv_ffmpeg.dll.
  • Отказ оборудования ソースネクスト株式会社, например, некачественный жесткий диск, вызвавший повреждение файла opencv_ffmpeg.dll.
  • Другая программа изменила требуемую версию opencv_ffmpeg.dll.
  • Другая программа злонамеренно или по ошибке удалила файл opencv_ffmpeg.dll.
  • Другая программа удалила файл opencv_ffmpeg.dll.

NVENC

NVENC can be used for H.264 and HEVC encoding. FFmpeg supports NVENC through the h264_nvenc and hevc_nvenc encoders. In order to enable it in FFmpeg you need:

  • A ​supported GPU
  • Supported drivers for your operating system
  • ​The NVIDIA Codec SDK or compiling FFmpeg with —enable-cuda-llvm
  • ffmpeg configured with --enable-nvenc (default if the drivers are detected while configuring)

Note:
FFmpeg uses its own slightly modified runtime-loader for NVIDIA’s CUDA/NVENC/NVDEC-related libraries. If you get an error from configure complaining about missing ffnvcodec, ​this project is what you need. It has a working Makefile with an install target: make install PREFIX=/usr. FFmpeg will look for its pkg-config file, called ffnvcodec.pc. Make sure it is in your PKG_CONFIG_PATH.

This means that running the following before compiling ffmpeg should suffice:

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
make
sudo make install

After compilation, you can use NVENC.

Usage example:

ffmpeg -i input -c:v h264_nvenc -profile high444p -pixel_format yuv444p -preset default output.mp4

You can see available presets, other options, and encoder info with ffmpeg -h encoder=h264_nvenc or ffmpeg -h encoder=hevc_nvenc.

Note: If you get the No NVENC capable devices found error make sure you’re encoding to a supported pixel format. See encoder info as shown above.

Windows Store 8.1 x86 (Windows 8.1 Win32 in Visual Studio)

Launch Developer Command Prompt for VS2013

Start Menu > Visual Studio 2013 (Start Menu Folder) > Visual Studio Tools > Developer Command Prompt for VS2013

Set the following environment variables in the launched command prompt above. These environment variables overwrite the default paths with correct target specific ones.

SET LIB=%VSINSTALLDIR%VC\lib\store;%VSINSTALLDIR%VC\atlmfc\lib;%WindowsSdkDir%lib\winv6.3\um\x86;;
SET LIBPATH=%WindowsSdkDir%References\CommonConfiguration\Neutral;;%VSINSTALLDIR%VC\atlmfc\lib;%VSINSTALLDIR%VC\lib;
SET INCLUDE=%VSINSTALLDIR%VC\include;%VSINSTALLDIR%VC\atlmfc\include;%WindowsSdkDir%Include\um;%WindowsSdkDir%Include\shared;%WindowsSdkDir%Include\winrt;;

Open MSYS2 Shell from the command prompt above (use the correct drive and location of your MSYS2 installation). Note that the command shell above will close and it may take a while for the MSYS2 shell to launch.

C:\msys64\msys2_shell.cmd

In your MSYS2 shell navigate to your cloned FFmpeg folder. E.g.

cd /c/ffmpeg

Invoke the following make commands

mkdir -p Output/Windows8.1/x86

cd Output/Windows8.1/x86

../../../configure \
--toolchain=msvc \
--disable-programs \
--disable-dxva2 \
--arch=x86 \
--enable-shared \
--enable-cross-compile \
--target-os=win32 \
--extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP -D_WIN32_WINNT=0x0603" \
--extra-ldflags="-APPCONTAINER" \
--prefix=../../../Build/Windows8.1/x86

make

make install

Generated libraries can be found in Build/Windows8.1/x86 folder specified in --prefix option above

1.2. Подключение аппаратного ускорения в стандартных декодерах

FFmpeg позволяет для некоторых декодеров подключить аппаратное ускорение. При программировании с использованием FFmpeg API все необходимое для подключения к декодерам аппаратного ускорения находится в заголовочном файле . В этом файле определено перечисление , каждый элемент которого и соответствует некоторому типу аппаратного ускорения. Какие типы аппаратного ускорения доступны в текущей сборке FFmpeg можно узнать с помощью следующего кода:

Для описанной выше программно-аппаратной конфигурации мы получим:

    cuda
    dxva2
    qsv
    d3d11va

Понятно, что требует установки платы Nvidia и соответствущего ПО, использует технологию Intel Quick Sync Video (QSV), реализованную на встроенных графических процессорах Intel (см. ), и используют технологию DirectX Video Acceleration (см. ), доступную только в Windows, но зато реализованную для видеокарт разных производителей (Intel, Nvidia, AMD).

Конкретные декодеры не обязаны поддерживать все эти типы аппаратного ускорения (или хотя бы один из них). Для определения типов, поддерживаемых конкретным декодером, можно воспользоваться следующим кодом:

Для описанной выше программно-аппаратной конфигурации декодеры , , , поддерживают следующие типы аппаратного ускорения:

    dxva2
    d3d11va
    cuda

А вот вообще не поддерживает аппаратного ускорения.

Теперь совсем кратко рассмотрим процедуру подключения к декодеру аппаратного ускорения, за дополнительными деталями надо обратится к примеру . Также можно посмотреть статью , написанную 2expres.

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

Для подключения аппаратного ускорения в командной строке надо использовать опцию с ключом .

Способ 3: Собственноручная регистрация ffmpeg.dll в ОС

Вариант с повторной регистрацией ffmpeg.dll в системе не является самым эффективным, однако из-за простоты применения он и был поставлен на это место. От вас потребуется лишь запустить стандартную консоль и вписать две простые команды, чтобы убедиться в том, действительно ли ffmpeg.dll во время установки софта был зарегистрирован, и повторить инсталляцию в случае необходимости. Вся процедура умещается в трех шагах и выглядит так:

  1. Раскройте меню «Пуск». Там через поиск отыщите классическое приложение «Командная строка» и обязательно запустите его от имени администратора.

В появившемся окне впишите команду и активируйте ее, нажав на клавишу Enter. Это отменит уже существующую регистрацию файла.

Закройте появившееся уведомление, а затем используйте похожую команду для повторной регистрации.

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

Setting

Here is what another person once did for broadcast:

ffmpeg -f dshow -i video="Virtual-Camera" -preset ultrafast -vcodec libx264 -tune zerolatency -b 900k -f mpegts udp://10.1.0.102:1234

And here is what another person ​did:

ffmpeg -f dshow -i video="screen-capture-recorder":audio="Stereo Mix (IDT High Definition" \
-vcodec libx264 -preset ultrafast -tune zerolatency -r 10 -async 1 -acodec libmp3lame -ab 24k -ar 22050 -bsf:v h264_mp4toannexb \
-maxrate 750k -bufsize 3000k -f mpegts udp://192.168.5.215:48550

NB that they also (for directshow devices) had to adjust the rtbufsize in that example.

You can see a description of what some of these means, (for example bufsize, bitrate settings) in the Encode/H.264.

Here’s how one guy broadcast a live stream (in this instance a Capture/Desktop#Windows? screen capture device):

$ ffmpeg -y -loglevel warning -f dshow -i video="screen-capture-recorder" -vf crop=690:388:136:0 -r 30 -s 962x388 -threads 2 -vcodec libx264 -vpre baseline -vpre my_ffpreset -f flv rtmp:///live/myStream.sdp

with a custom FFmpeg preset (libx264-my_ffpreset.ffpreset) in this case:

coder=1
flags2=+wpred+dct8x8
level=31
maxrate=1200000
bufsize=200000
wpredp=0
g=60
refs=1
subq=3
trellis=0
bf=0
rc_lookahead=0

Here is how you stream to twitch.tv or similar services (rtmp protocol), using ffmpeg 1.0 or ffmpeg-git (tested on 2012-11-12), this is also for pulseaudio users:
Example 1, no sound:

ffmpeg -f x11grab -s 1920x1200 -framerate 15 -i :0.0 -c:v libx264 -preset fast -pix_fmt yuv420p -s 1280x800 -threads 0 -f flv "rtmp://live.twitch.tv/app/live_********_******************************"

Example 2, first screen (on dual screen setup, or if on a single screen):

ffmpeg -f x11grab -s 1920x1200 -framerate 15 -i :0.0 -f pulse -ac 2 -i default -c:v libx264 -preset fast -pix_fmt yuv420p -s 1280x800 -c:a aac -b:a 160k -ar 44100 -threads 0 -f flv "rtmp://live.twitch.tv/app/live_********_******************************"

Example 3, second screen (on dual screen setup):

ffmpeg -f x11grab -s 1920x1200 -framerate 15 -i :0.0+1920,0 -f pulse -ac 2 -i default -c:v libx264 -preset fast -pix_fmt yuv420p -s 1280x800 -c:a aac -b:a 160k -ar 44100 -threads 0 -f flv "rtmp://live.twitch.tv/app/live_********_******************************"

1.3. Использование специальных декодеров, реализующих декодирование на графических процессорах

В состав FFmpeg входят два семейства кодеков, реализующих кодирование и декодирование на графических процессорах.

Одно семейство использует технологию Intel Quick Sync Video (QSV), реализованную на видеопроцессорах, интегрированных в процессоры Intel семейств i3, i5, i7, i9. Подробнее см. . Эти кодеки имеют суффикс . В рассматриваемой сборке FFmpeg есть следующие декодеры: , , , , .

Другое семейство использует технологии NVDEC, NVENC реализованные на платах Nvidia. Декодеры имеют суффикс . В рассматриваемой сборке FFmpeg есть следующие декодеры: , , , , , , , .

После открытия входного потока доступ к декодеру обычно реализуется следующим образом:

Но таким образом можно получить только декодер по умолчанию для данного идентификатора кодека. Для альтернативных декодеров нужно использовать имя декодера примерно таким образом:

Для использования альтернативных декодеров в командной строке надо использовать опцию с ключом расположив ее перед ключом примерно таким образом

ffmpeg -c:v h264_qsv -i INPUT ...

2. Измерение скорости декодирования

Для экспериментов по измерению скорости декодирования были выбраны два видеоролика, один закодирован в H264, другой в HEVC(H265). Размер кадра — 3840х2160 (Ultra HD), скорость — 30 к/с. Тестировались стандартные декодеры — , и соответствующие QSV декодеры — , . Стандартные декодеры настраивались в 4х вариантах: по умолчанию, два рабочих потока, четыре рабочих потока, аппаратное ускорение . В наших экспериментах показал лучшие результаты, чем , поэтому последний не участвовал в измерениях скорости декодирования. Для проведения тестов была написана программа которая извлекала пакеты из файла и декодировала их с максимально возможной скоростью, игнорируя метки времени и не выполняя рендеринг или иную обработку. Было два режима этой программы: в первом выполнялось только декодирование, в втором еще производилось конвертирование декодированного кадра в 32-битный формат с использованием библиотеки . (На выходе декодера кадр обычно имеет 12-битный планарный формат или .) Проводилось измерение времени, затраченного программой, и фиксировалось относительное время по отношению к номинальной длительности видеопотока (в процентах). Таким образом, если результат меньше 100%, то у нас есть шанс обработать видеопоток в реальном масштабе времени, если больше, то таких шансов нет. Также с помощью Диспетчера задач фиксировалась примерная загрузка ЦП и графического процессора. Использовалась 64-битная сборка FFmpeg.

Таблица. Измерение скорости декодирования
h264 hevc
Config # Время CPU GPU Время CPU GPU
default 1 75 26 125 25
2 132 28 180 27
threads=2 1 47 42 74 42
2 79 48 104 46
threads=4 1 35 60 46 64
2 60 54 71 70
dxva2 1 45 14 72 34 28 70
2 107 28 35 99 30 36
xxxx_qsv 1 25 34 80 25 34 72
2 70 39 54 70 40 50

Большого обсуждения результаты, наверное, не требуют

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

Эксперименты проводились также для 32-битной сборки FFmpeg. Результаты довольно близкие, кроме одного случая: декодер в конфигурациях без аппаратного ускорения показал падение производительности в 2-3 раза. Весьма неожиданный результат.

Описанные тесты можно выполнить в командной строке. Надо использовать глобальную опцию и установить нулевой выход. Вот несколько примеров:

ffmpeg -benchmark -i INPUT -an -f null -
ffmpeg -benchmark -threads N -i INPUT -an -f null -
ffmpeg -benchmark -c:v h264_qsv -i INPUT -an -f null -
ffmpeg -benchmark -hwaccel dxva2 -i INPUT -an -f null -
ffmpeg -benchmark -i INPUT -an -pix_fmt bgra -f null -

На выходе будет показан фактический , а параметр покажет во сколько раз он выше номинального. Если не задана опция с ключом или для указано специальное значение , то декодер использует максимально возможное число потоков, загрузка ЦП при этом 100%.

3. Замечания о QSV декодерах

В рассматриваемой сборке FFmpeg есть следующие QSV декодеры: , , , , . Два последних оказались неработоспособными. Декодер выдавал искаженную картинку, а выдавал ошибку при передаче пакета на декодирование. Правда, эти декодеры не особо актуальны, но, все-таки, зачем выкладывать неработоспособные компоненты, не вполне понятно.

К оставшимся декодерам тоже есть претензии. В целом они работают, за исключением одного момента — они некорректно отрабатывают вызов . Ошибки нет, но после этого вызова позиционирование работает некорректно.

Cборка FFmpeg

Windows

  1. Ставим VS Studio или выше. Минимальная версия VS2013 u2.
  2. Ставим MSYS2.
  3. Открываем консоль разработчика. Пуск/Visual Studio (Version)/Developer Command Promt. В ней будут доступны пути до компилятора и компоновщика.
  4. Из открытой консоли открываем консоль MSYS2.
    • mingw32 или mingw64 в зависимости от архитектуры
    • full-path — позволяет увидеть путь до компилятора (можно раскомментировать строчку set MSYS2_PATH_TYPE=inherit в msys2_shell.cmd)
  5. Переходим в папку с исходниками ffmpeg.
    • –disable-shared — статические библиотеки, –disable-static — динамические.
    • –disable-asm — если будет ругаться на ассемблерные вставки. Я собирал без него на vs2015. Если использовать vs2010, то придется потанцевать с yasm(nasm), c99conv, c99wrap.
    • –arch=x86_64 — если требуется собрать x64 архитектуру. Должен быть MSYS64 и libx264 с x64 архитектурой.
    • –prefix — укажет папку куда выполнится make install.
    • –extra-ldflags — не работает на win7. ругается на линковку libx264.a. Нужно перенести libx264 в корень ffmpeg, либо в temp папку, которую создает configure в корне при выполнении.
  6. если не использовать –prefix собраные либы будут лежать в подпапках рядом с исходниками.

iOS

  1. Переходим в папку с исходниками ffmpeg. Это будет корень FFMPEG_ROOT.
  2. Сборка будет происходить в папке /Projects/iOS/. Создаем папку .
  3. Переходим в папку проекта.
  4. Создаем . Копируем в него скрипт.
  5. Правим пути до libx264 (если требуется).
  6. Запускаем сборку библиотек: .
  7. Файлы будут лежать в /Projects/iOS/Temp.
  8. Запускаем сборку FAT-либок.
  9. FAT-либка будут лежать в /lib/ios.

OSX

  1. Переходим в папку с исходниками ffmpeg. Это будет корень FFMPEG_ROOT.
  2. Сборка будет происходить в папке /Projects/OSX/. Создаем папку .
  3. Переходим в папку проекта.
  4. Создаем . Копируем в него скрипт.
  5. Правим пути до libx264 (если требуется).
  6. Запускаем сборку библиотек: .
  7. Файлы будут лежать в /Projects/OSX/Temp.
  8. Запускаем сборку FAT-либок.
  9. FAT-либка будут лежать в /lib/osx.

Android

  1. Ставим Cygwin (Mingw,MSYS2).
  2. Ставим Android NDK. Раньше качался отдельно, сейчас только через SDK Manager в Android Studio.
  3. Открываем консоль Cygwin.
  4. Переходим в папку с исходниками .
  5. Создаем папку .
  6. Создаем . Копируем в него скрипт.
  7. Правим переменные NDK, SYSROOT, TOOLCHAIN, ARCH.
  8. Запускаем сборку библиотек: .

FFmpeg: быстрый старт

После установки FFmpeg можно творить магию преобразования видео в консоли.

Указанная команда сконвертирует видео из файла input.avi в output.mp4. По умолчанию для файлов mov и mp4 используется кодек H.264. Размер кадра и fps будут взяты из исходного файла.

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

Ниже перечислены основные параметры FFmpeg:

  • -i имя исходного файла, который предстоит сконвертировать, если файлов несколько перед каждым из них нужно указать -i;
  • -y ответит Да (yes) на все вопросы от FFmpeg, если они возникнут в процессе кодирования, например при для перезаписи файла, если тот уже существует;
  • -vcodec или кратко c:v – параметры видеокодека, либо copy (если перекодирование не требуется), либо пустой параметр (по умолчанию);
  • -f – формат контейнера;
  • -b:v (-vb, -b) – битрейт видео в килобитах или мегабитах в секунду задаётся буквой K или M;
  • -aspect – соотношение сторон картинки (4:3, 16:9, 1.3333, 1.7777);
  • -r – частота кадров;
  • -s — разрешение, поддерживаются как числовые значения (640×480) и буквенные обозначения (например, qcif, qvga);
  • -vf (или -filter:v) — опция со списком фильтров, которые будут применены к видео;
  • -c:a (или -acodec) – параметры аудиокодека, либо copy (если аудио дорожку нужно оставить как есть), либо пустой параметр (по умолчанию);
  • -f – формат аудио;
  • -af (или -filter:a) — опция со списком фильтров, которые будут применены к аудио;
  • -ab (или -b:a) – битрейт аудио;
  • -ar – частота дискредитации;
  • -ac – количество каналов.

Для примера рассмотрим следующую команду.

Данная команда перекодирует файл input.avi в output.mp4. В случае если в конечной папке будет содержаться файл output.mp4, он будет перезаписан (опция -y). В качестве кодека будет использован libx264 со среднем соотношением скорость/качество (-preset medium). Конечный битрейт 17000kbps, соотношение сторон картинки 16:9, частота 25 кадров в секунду. В качестве аудиокодека будет использован AAC с битрейтом 256kbps.

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

или аналогичная (сокращенная запись)

Это может оказаться полезным, когда устройство, на котором вы хотите воспроизвести видео, не поддерживает исходный формат. Или, например программа видеомонтажа не умеет работать с каким либо форматом и не хочет импортировать его в проект (например Adobe Premiere не работает с mkv, хотя внутри – все тот же H.264). С помощью перепаковки проблема решиться.

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

3.3. Метки времени

Для задания времени в FFmpeg используется единица времени (time base), задаваемая в секундах с помощью рационального числа, представляемого типом . (Аналогичный подход используется в C++11. Например 1/1000 задает миллисекунду.) Кадры и пакеты имеют метки времени (timestamps), имеющие тип , их значения содержат время в соответствующих единицах времени. Кадр, то есть структура , имеет член (presentation timestamp), значение которого определяет относительное время сцены, запечатленной в кадре. Пакет, то есть структура , имеет члены (presentation timestamp) и (decompression timestamp). Значение определяет относительное время передачи пакета на декодирование. Для простых кодеков оно совпадает с , но для сложных кодеков может отличатся (например для при использовании B-frames), то есть пакеты могут декодироваться не в том порядке в котором должны использоваться кадры.

Единица времени определена для потока и кодека, структура имеет соответствующий член — , такой же член имеет структура .

Метки времени пакета, извлеченного из потока с помощью , будут заданы в единицах времени этого потока. При декодировании единица времени кодека не используется. Для видеодекодера она обычно просто не задана, для аудиодекодера имеет стандартное значение — обратное к частоте дискретизации. Декодер должен установить метку времени для выходного кадра основываясь на метках времени пакета. FFmpeg самостоятельно определяет такую метку и записывает ее в член структуры . Все эти метки времени будут использовать единицу времени потока, из которого извлечен пакет.

Для кодера необходимо задавать единицу времени. В клиентском коде, организующем декодирование, надо установить значение для члена структуры перед вызовом . Обычно берут единицу времени, используемую для меток времени кодируемого кадра. Если этого не сделать, то видеокодеры обычно выдают ошибку, аудиокодеры устанавливают значение по умолчанию — обратное к частоте дискретизации. Может ли кодек изменить заданную единицу времени, не вполне ясно. На всякий случай лучше всегда проверять значение после вызова и, если оно изменилось, пересчитывать метки времени входных кадров на единицу времени кодека. В процессе кодирования необходимо установить и пакета. После кодирования, перед записью пакета в выходной поток необходимо пересчитать метки времени пакета с единицы времени кодека на единицу времени потока. Для этого можно воспользоваться функцией

При записи пакетов в поток необходимо гарантировать, чтобы значения строго возрастали, иначе мультиплексор выдаст ошибку. (Подробнее см. документацию на функцию .)

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий