
Recherche avancée
Médias (91)
-
Spitfire Parade - Crisis
15 mai 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Wired NextMusic
14 mai 2011, par
Mis à jour : Février 2012
Langue : English
Type : Video
-
Video d’abeille en portrait
14 mai 2011, par
Mis à jour : Février 2012
Langue : français
Type : Video
-
Sintel MP4 Surround 5.1 Full
13 mai 2011, par
Mis à jour : Février 2012
Langue : English
Type : Video
-
Carte de Schillerkiez
13 mai 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Texte
-
Publier une image simplement
13 avril 2011, par ,
Mis à jour : Février 2012
Langue : français
Type : Video
Autres articles (59)
-
Websites made with MediaSPIP
2 mai 2011, parThis page lists some websites based on MediaSPIP.
-
Keeping control of your media in your hands
13 avril 2011, parThe vocabulary used on this site and around MediaSPIP in general, aims to avoid reference to Web 2.0 and the companies that profit from media-sharing.
While using MediaSPIP, you are invited to avoid using words like "Brand", "Cloud" and "Market".
MediaSPIP is designed to facilitate the sharing of creative media online, while allowing authors to retain complete control of their work.
MediaSPIP aims to be accessible to as many people as possible and development is based on expanding the (...) -
Des sites réalisés avec MediaSPIP
2 mai 2011, parCette page présente quelques-uns des sites fonctionnant sous MediaSPIP.
Vous pouvez bien entendu ajouter le votre grâce au formulaire en bas de page.
Sur d’autres sites (6018)
-
avcodec : remove "get_buffer() failed" message
8 avril 2016, par Paul B Mahol -
"Undefined reference to `avcodec_alloc_frame" Error when compile and install Opencv on linux
7 avril 2016, par Kathy LeeI am compiling and installing OpenCV using the steps in http://docs.opencv.org/2.4/doc/tutorials/introduction/linux_install/linux_install.html
But during "making" it, it has error when it reaches 45%. The error message is
...
[ 43%] Built target pch_Generate_opencv_video
[ 44%] Built target opencv_video
[ 44%] Built target opencv_perf_video_pch_dephelp
[ 45%] Built target pch_Generate_opencv_perf_video
Linking CXX executable ../../bin/opencv_perf_video
../../lib/libopencv_videoio.so.3.1.0: undefined reference to `avcodec_alloc_frame'
../../lib/libopencv_videoio.so.3.1.0: undefined reference to `avcodec_encode_video'
collect2: error: ld returned 1 exit status
make[2]: *** [bin/opencv_perf_video] Error 1
make[1]: *** [modules/video/CMakeFiles/opencv_perf_video.dir/all] Error 2
make: *** [all] Error 2I downloaded and installed the latest version of ffmpeg from https://www.ffmpeg.org/.
Anyone knows how can I fix the errors ?
Thank you.
-
libav error message with H264 codec. "non-strictly-monotonic PTS"
13 mars 2018, par user1496491I have almost zero experience with
libav
/FFMPEG
. I wrote this piece of code which capturing the screen and writes it to the file, and I’m facing some prolems with that. I was working withAV_CODEC_ID_MPEG4
codec at first, it worked just fine, but very quikly application started to spam messages like that[dshow @ 02da1c80] real-time buffer [screen-capture-recorder] [video input] too full or near too full (64% of size: 128000000 [rtbufsize parameter])! frame dropped!
So I googled for some time, and found that probbably encoder is too slow, and I need to change it to faster one. So I changed it to
AV_CODEC_ID_H264
. Suddenly written file became unreadable, and application started to spam messages[libx264 @ 0455ff40] non-strictly-monotonic PTS
I looked everywhere and all I found was a suggestion to put this two lines
if(outPacket.pts != AV_NOPTS_VALUE) outPacket.pts = av_rescale_q(outPacket.pts, videoStream->codec->time_base, videoStream->time_base);
if(outPacket.dts != AV_NOPTS_VALUE) outPacket.dts = av_rescale_q(outPacket.dts, videoStream->codec->time_base, videoStream->time_base);So I added them, and the result was the same.
So, what should I do ? How do I configure output correctly ?
Here’s my code :
#include "MainWindow.h"
#include <qguiapplication>
#include <qlabel>
#include <qscreen>
#include <qtimer>
#include <qlayout>
#include <qimage>
#include <qtconcurrent></qtconcurrent>QtConcurrent>
#include <qthreadpool>
#include <qvideoframe>
#include "ScreenCapture.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
resize(800, 600);
label = new QLabel();
label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
auto layout = new QHBoxLayout();
layout->addWidget(label);
auto widget = new QWidget();
widget->setLayout(layout);
setCentralWidget(widget);
connect(this, &MainWindow::imageReady, [=](QImage image) {label->setPixmap(QPixmap::fromImage(image).scaled(label->size(), Qt::KeepAspectRatio));});
init();
initOutFile();
collectFrames();
}
MainWindow::~MainWindow()
{
isRunning = false;
QThreadPool::globalInstance()->waitForDone();
avformat_close_input(&inputFormatContext);
avformat_free_context(inputFormatContext);
}
void MainWindow::init()
{
av_register_all();
avcodec_register_all();
avdevice_register_all();
auto screen = QGuiApplication::screens()[0];
QRect geometry = screen->geometry();
inputFormatContext = avformat_alloc_context();
// AVDictionary* options = NULL;
// av_dict_set(&options, "framerate", "30", NULL);
// av_dict_set(&options, "offset_x", QString::number(geometry.x()).toLatin1().data(), NULL);
// av_dict_set(&options, "offset_y", QString::number(geometry.y()).toLatin1().data(), NULL);
// av_dict_set(&options, "preset", "ultrafast", NULL);
// av_dict_set(&options, "probesize", "10MB", NULL);
// av_dict_set(&options, "pix_fmt", "yuv420p", NULL);
// av_dict_set(&options, "video_size", QString(QString::number(geometry.width()) + "x" + QString::number(geometry.height())).toLatin1().data(), NULL);
// AVInputFormat* inputFormat = av_find_input_format("gdigrab");
// avformat_open_input(&inputFormatContext, "desktop", inputFormat, &options);
QSettings settings("HKEY_CURRENT_USER\\Software\\screen-capture-recorder", QSettings::NativeFormat);
settings.setValue("start_x", geometry.x());
settings.setValue("start_y", geometry.y());
settings.setValue("capture_width", geometry.width());
settings.setValue("capture_height", geometry.height());
AVDictionary* options = NULL;
av_dict_set(&options, "preset", "ultrafast", NULL);
av_dict_set(&options, "vcodec", "h264", NULL);
av_dict_set(&options, "video_size", "1920x1080", NULL);
av_dict_set(&options, "crf", "0", NULL);
av_dict_set(&options, "tune", "zerolatency", NULL);
av_dict_set(&options, "rtbufsize", "128M", NULL);
AVInputFormat *format = av_find_input_format("dshow");
avformat_open_input(&inputFormatContext, "video=screen-capture-recorder", format, &options);
av_dict_free(&options);
avformat_find_stream_info(inputFormatContext, NULL);
videoStreamIndex = av_find_best_stream(inputFormatContext, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);
AVStream* inStream = inputFormatContext->streams[videoStreamIndex];
inputCodec = avcodec_find_decoder(inStream->codecpar->codec_id);
if(!inputCodec) qDebug() << "Can't find input codec!";
inputCodecContext = avcodec_alloc_context3(inputCodec);
qDebug() << "IN_FORMAT" << av_get_pix_fmt_name(inStream->codec->pix_fmt);
avcodec_parameters_to_context(inputCodecContext, inStream->codecpar);
if(avcodec_open2(inputCodecContext, inputCodec, NULL)) qDebug() << "Can't open input codec!";
}
void MainWindow::initOutFile()
{
const char* filename = "C:/Temp/output.mp4";
if(avformat_alloc_output_context2(&outFormatContext, NULL, NULL, filename) < 0) qDebug() << "Can't create out context!";
outCodec = avcodec_find_encoder(AV_CODEC_ID_H264);
if(!outCodec) qDebug() << "Can't find codec!";
videoStream = avformat_new_stream(outFormatContext, outCodec);
videoStream->time_base = {1, 30};
const AVPixelFormat* pixelFormat = outCodec->pix_fmts;
while (*pixelFormat != AV_PIX_FMT_NONE)
{
qDebug() << "OUT_FORMAT" << av_get_pix_fmt_name(*pixelFormat);
++pixelFormat;
}
outCodecContext = videoStream->codec;
outCodecContext->bit_rate = 16000000;
outCodecContext->rc_max_rate = 0;
outCodecContext->rc_buffer_size = 0;
outCodecContext->qmin = 10;
outCodecContext->qmax = 51;
outCodecContext->qcompress = 0.6f;
outCodecContext->width = inputCodecContext->width;
outCodecContext->height = inputCodecContext->height;
outCodecContext->time_base = videoStream->time_base;
outCodecContext->gop_size = 10;
outCodecContext->max_b_frames = 1;
outCodecContext->pix_fmt = AV_PIX_FMT_YUV420P;
if (outFormatContext->oformat->flags & AVFMT_GLOBALHEADER) outCodecContext->flags |= CODEC_FLAG_GLOBAL_HEADER;
if(avcodec_open2(outCodecContext, outCodec, NULL)) qDebug() << "Can't open out codec!";
swsContext = sws_getContext(inputCodecContext->width,
inputCodecContext->height,
inputCodecContext->pix_fmt,
outCodecContext->width,
outCodecContext->height,
outCodecContext->pix_fmt,
SWS_BICUBIC, NULL, NULL, NULL);
if(avio_open(&outFormatContext->pb, filename, AVIO_FLAG_WRITE) < 0) qDebug() << "Can't open file!";
if(avformat_write_header(outFormatContext, NULL) < 0) qDebug() << "Can't write header!";
}
void MainWindow::collectFrames()
{
QtConcurrent::run([this](){
AVFrame* inFrame = av_frame_alloc();
inFrame->format = inputCodecContext->pix_fmt;
inFrame->width = inputCodecContext->width;
inFrame->height = inputCodecContext->height;
int size = av_image_alloc(inFrame->data, inFrame->linesize, inFrame->width, inFrame->height, inputCodecContext->pix_fmt, 1);
AVFrame* outFrame = av_frame_alloc();
outFrame->format = outCodecContext->pix_fmt;
outFrame->width = outCodecContext->width;
outFrame->height = outCodecContext->height;
av_image_alloc(outFrame->data, outFrame->linesize, outFrame->width, outFrame->height, outCodecContext->pix_fmt, 1);
AVPacket packet;
av_init_packet(&packet);
while(isRunning && (av_read_frame(inputFormatContext, &packet) >= 0))
{
if(packet.stream_index == videoStream->index)
{
//for gdigrab
// uint8_t* result = new uint8_t[inFrame->width * inFrame->height * 4];
// for (int i = 0; i < inFrame->height * inFrame->width * 4; i += 4)
// {
// result[i + 0] = packet.data[i + 2]; //B
// result[i + 1] = packet.data[i + 3]; //G
// result[i + 2] = packet.data[i + 0]; //R
// result[i + 3] = packet.data[i + 1]; //A
// }
// memcpy(inFrame->data[0], result, size);
// delete result;
QImage image(packet.data, inFrame->width, inFrame->height, QImage::Format_ARGB32);
QImage mirrored = image.mirrored(false, true);
emit imageReady(mirrored);
memcpy(inFrame->data[0], mirrored.bits(), size);
sws_scale(swsContext, inFrame->data, inFrame->linesize, 0, inputCodecContext->height, outFrame->data, outFrame->linesize);
av_packet_unref(&packet);
AVPacket outPacket;
av_init_packet(&outPacket);
int encodeResult = AVERROR(EAGAIN);
while(encodeResult == AVERROR(EAGAIN))
{
if(avcodec_send_frame(outCodecContext, outFrame)) qDebug() << "Send frame error!";
encodeResult = avcodec_receive_packet(outCodecContext, &outPacket);
}
if(encodeResult != 0) qDebug() << "Encoding error!" << encodeResult;
if(outPacket.pts != AV_NOPTS_VALUE) outPacket.pts = av_rescale_q(outPacket.pts, videoStream->codec->time_base, videoStream->time_base);
if(outPacket.dts != AV_NOPTS_VALUE) outPacket.dts = av_rescale_q(outPacket.dts, videoStream->codec->time_base, videoStream->time_base);
av_interleaved_write_frame(outFormatContext, &outPacket);
av_packet_unref(&outPacket);
}
}
av_freep(inFrame->data);
av_freep(outFrame->data);
av_write_trailer(outFormatContext);
avio_close(outFormatContext->pb);
});
}
</qvideoframe></qthreadpool></qimage></qlayout></qtimer></qscreen></qlabel></qguiapplication>