Извлечение кадров изображения из файла MJPG

Я пытаюсь извлечь кадры изображения из короткого клипа IP-камеры. Конкретно этот клип.

http://db.tt/GQwu0nZ8

Итак, я пытаюсь извлечь эти кадры с помощью ffmpeg.

ffmpeg -i M00001.jpg -vcodec mjpeg -f image2 image%03d.jpg

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

Спасибо


person edsonlp1    schedule 13.12.2012    source источник
comment
Вы можете использовать мою библиотеку, которая, вероятно, лучше HTTP, захватывая кадры по разным причинам... если камера поддерживает RTP или RTSP net7mma.codeplex.com   -  person Jay    schedule 12.06.2014


Ответы (2)


Это может быть слишком много, но вот короткая программа javascript для Node.js https://nodejs.org/, которая удалит все читаемые кадры и сохранить их как отдельные последовательно пронумерованные файлы jpg в текущем каталоге. Осторожно, даже короткий видеоклип может генерировать тысячи кадров, а механизм javascript V8, который использует Node, очень быстр, поэтому я рекомендую закрыть файловый браузер, потому что он будет потреблять ресурсы, пытаясь не отставать.

Если видеофайл слишком велик для создания буфера, Node выдаст ошибку и завершит работу.
В этом случае проще всего будет разделить файл на куски с помощью утилит оболочки или программы, такой как HexEdit. http://www.hexedit.com/

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

var orgFile=process.cwd()+"/"+process.argv[2]; //Grab the video filename from the command line
var fs = require("fs"); //Load the filesystem module
var stats = fs.statSync(orgFile);//Get stats of video file
var fileSizeInBytes = stats["size"];//Get video file size from stats
var fdata=new Buffer(fileSizeInBytes);//Create a new buffer to hold the video data
var i=0;
var fStart=0;
var fStop=0;
var fCount=0;
fdata=fs.readFileSync(orgFile);//Read the video file into the buffer
//This section looks for the markers at the begining and end of each jpg image
//records their positions and then writes them as separate files.
while (i<fileSizeInBytes){

if (fdata[i]==0xFF){
    //console.log("Found FF at "+i.toString);
    if (fdata[i+1]==0xD8){
        //console.log("Found D8 at "+(i+1).toString);

        if (fdata[i+2]==0xFF){
            //console.log("Found FF at "+(i+2).toString);
            fStart=i;
            }
        }
    }
if (fStart>0){
    if (fdata[i]==0xFF){
        if(fdata[i+1]==0xD9){
            fStop=i+1;

        }
    }
if (fStart>0){
    if (fStop>0){
    fCount++;
    fs.writeFileSync(orgFile+"."+fCount.toString()+".jpg",fdata.slice(fStart,fStop));   
    console.log (orgFile+"."+fCount.toString()+".jpg");
    fStart=0;
    fStop=0;
    }
}
}

i++;
}

console.log ("Wrote "+fCount.toString()+" frames.");

Если вы сохраните приведенный выше код как mjpeg_parse.js, пример вызова будет таким:

Узел mjepeg_parse.js videofile.avi

person user3712539    schedule 25.01.2016

Команда с ffmpeg работает нормально, но в качестве входного файла нужно указать видео mjpeg. Если M00001.jpg — это одно изображение в формате jpg, вы получите только одно (одно и то же) выходное изображение.

person user1871166    schedule 13.12.2012
comment
Фактически, IP-камера возвращает это изображение в виде видео в формате .jpg. С помощью программного обеспечения производителя вы можете видеть, что сгенерированное изображение является видео. - person edsonlp1; 13.12.2012
comment
@edsonlp1 Как я вижу, это формат MxPEG, созданный камерой Mobotix. Как вы получили этот образ? Можете ли вы получить доступ к потоку mjpeg через URL-адрес http://<CAMERA_IP>/cgi-bin/faststream.jpg? Если это так, вы можете попробовать передать этот URL-адрес ffmpeg в качестве входных данных. К сожалению, мне не удалось декодировать живой поток MxPEG с помощью ffmpeg. Но он может легко декодировать загруженную часть потока (скачанную, например, с помощью wget 'http://<CAMERA_IP>/cgi-bin/faststream.jpg'). - person user1871166; 13.12.2012
comment
Я получаю это изображение из хранилища камеры. Как вы можете извлечь информацию, зная, что это формат MxPEG? Стрим через урл у меня не работает, так как мне нужно максимальное качество и разрешение на картинке. Спасибо - person edsonlp1; 14.12.2012
comment
Загруженное вами изображение в формате jpeg содержит некоторые данные в комментарии, откуда видно, что это камера Mobotix и формат MxPEG. Вы можете получить доступ к потоку через HTTP API и выбрать параметры потоковой передачи, соответствующие вашим потребностям. - person user1871166; 14.12.2012
comment
@edsonlp1 Например, я погуглил случайную камеру и увидел ее страница справки через HTTP API. Я скачал часть потока с помощью wget -O vid.mjpg 'http://58.93.69.127/cgi-bin/faststream.jpg' и теперь могу извлечь кадры изображения из vid.mjpg с помощью команды ffmpeg из вашего вопроса. - person user1871166; 14.12.2012