
Recherche avancée
Autres articles (60)
-
Amélioration de la version de base
13 septembre 2013Jolie sélection multiple
Le plugin Chosen permet d’améliorer l’ergonomie des champs de sélection multiple. Voir les deux images suivantes pour comparer.
Il suffit pour cela d’activer le plugin Chosen (Configuration générale du site > Gestion des plugins), puis de configurer le plugin (Les squelettes > Chosen) en activant l’utilisation de Chosen dans le site public et en spécifiant les éléments de formulaires à améliorer, par exemple select[multiple] pour les listes à sélection multiple (...) -
Menus personnalisés
14 novembre 2010, parMediaSPIP utilise le plugin Menus pour gérer plusieurs menus configurables pour la navigation.
Cela permet de laisser aux administrateurs de canaux la possibilité de configurer finement ces menus.
Menus créés à l’initialisation du site
Par défaut trois menus sont créés automatiquement à l’initialisation du site : Le menu principal ; Identifiant : barrenav ; Ce menu s’insère en général en haut de la page après le bloc d’entête, son identifiant le rend compatible avec les squelettes basés sur Zpip ; (...) -
Déploiements possibles
31 janvier 2010, parDeux types de déploiements sont envisageable dépendant de deux aspects : La méthode d’installation envisagée (en standalone ou en ferme) ; Le nombre d’encodages journaliers et la fréquentation envisagés ;
L’encodage de vidéos est un processus lourd consommant énormément de ressources système (CPU et RAM), il est nécessaire de prendre tout cela en considération. Ce système n’est donc possible que sur un ou plusieurs serveurs dédiés.
Version mono serveur
La version mono serveur consiste à n’utiliser qu’une (...)
Sur d’autres sites (4144)
-
C++ ffmpeg API created video does not open in some players
18 novembre 2017, par ar2015After my previous question, I found codes from here to create videos in
C++
usingavcodec
offfmpeg
libraries.I have modified this code to comply with
C++
. Everything is fine and it createsmp4
videos. Except for the output video opens with some video managers and does not open with some others.E.g. I can open it on Linux by totem (the slider does not allow back and forth anyway). But VLC (on the same Linux machine) does not open this file. Probably, there will be similar problem in windows.
Is there any missing process for this code causing this problem ?
#include
#include
#include
#include <string>
#include <iostream>
extern "C" {
#include <libavcodec></libavcodec>avcodec.h>
#include <libavutil></libavutil>opt.h>
#include <libavutil></libavutil>imgutils.h>
}
static void encode(AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt,
FILE *outfile)
{
int ret;
/* send the frame to the encoder */
if (frame)
std::cout<<"Send frame "<<(frame->pts)<= 0) {
ret = avcodec_receive_packet(enc_ctx, pkt);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
return;
else if (ret < 0) {
fprintf(stderr, "Error during encoding\n");
exit(1);
}
std::cout<<"Write packet "<<(pkt->pts)<<" (size="<<(pkt->size)<<")"</ printf("Write packet %3" PRId64" (size=%5d)\n", pkt->pts, pkt->size);
fwrite(pkt->data, 1, pkt->size, outfile);
av_packet_unref(pkt);
}
}
int main(int argc, char **argv)
{
const char *filename;
const AVCodec *codec;
AVCodecContext *c= NULL;
int i, ret, x, y;
FILE *f;
AVFrame *frame;
AVPacket *pkt;
uint8_t endcode[] = { 0, 0, 1, 0xb7 };
if (argc < 2) {
fprintf(stderr, "Usage: %s <output file="file">\n", argv[0]);
exit(0);
}
filename = argv[1];
std::string codec_name = "mpeg4";
avcodec_register_all();
/* find the mpeg1video encoder */
codec = avcodec_find_encoder_by_name(codec_name.c_str());
if (!codec) {
fprintf(stderr, "Codec '%s' not found\n", codec_name.c_str());
exit(1);
}
c = avcodec_alloc_context3(codec);
if (!c) {
fprintf(stderr, "Could not allocate video codec context\n");
exit(1);
}
pkt = av_packet_alloc();
if (!pkt)
exit(1);
/* put sample parameters */
// c->bit_rate = 400000;
c->bit_rate = 4000000;
/* resolution must be a multiple of two */
// c->width = 352;
// c->height = 288;
c->width = 640;
c->height = 480;
/* frames per second */
c->time_base = (AVRational){1, 25};
c->framerate = (AVRational){25, 1};
/* emit one intra frame every ten frames
* check frame pict_type before passing frame
* to encoder, if frame->pict_type is AV_PICTURE_TYPE_I
* then gop_size is ignored and the output of encoder
* will always be I frame irrespective to gop_size
*/
c->gop_size = 10;
c->max_b_frames = 1;
c->pix_fmt = AV_PIX_FMT_YUV420P;
if (codec->id == AV_CODEC_ID_H264)
av_opt_set(c->priv_data, "preset", "slow", 0);
/* open it */
ret = avcodec_open2(c, codec, NULL);
if (ret < 0) {
fprintf(stderr, "Could not open codec\n");
// fprintf(stderr, "Could not open codec: %s\n", av_err2str(ret));
exit(1);
}
f = fopen(filename, "wb");
if (!f) {
fprintf(stderr, "Could not open %s\n", filename);
exit(1);
}
frame = av_frame_alloc();
if (!frame) {
fprintf(stderr, "Could not allocate video frame\n");
exit(1);
}
frame->format = c->pix_fmt;
frame->width = c->width;
frame->height = c->height;
ret = av_frame_get_buffer(frame, 32);
if (ret < 0) {
fprintf(stderr, "Could not allocate the video frame data\n");
exit(1);
}
/* encode 10 second of video */
for (i = 0; i < 250; i++) {
fflush(stdout);
/* make sure the frame data is writable */
ret = av_frame_make_writable(frame);
if (ret < 0)
exit(1);
/* prepare a dummy image */
/* Y */
for (y = 0; y < c->height; y++) {
for (x = 0; x < c->width; x++) {
frame->data[0][y * frame->linesize[0] + x] = uint8_t(x + y + i * 3);
}
}
/* Cb and Cr */
for (y = 0; y < c->height/2; y++) {
for (x = 0; x < c->width/2; x++) {
frame->data[1][y * frame->linesize[1] + x] = uint8_t(128 + y + i * 2);
frame->data[2][y * frame->linesize[2] + x] = uint8_t(64 + x + i * 5);
}
}
frame->pts = i;
/* encode the image */
encode(c, frame, pkt, f);
}
/* flush the encoder */
encode(c, NULL, pkt, f);
/* add sequence end code to have a real MPEG file */
fwrite(endcode, 1, sizeof(endcode), f);
fclose(f);
avcodec_free_context(&c);
av_frame_free(&frame);
av_packet_free(&pkt);
return 0;
}
</output></iostream></string>build :
g++ -I ./FFmpeg/ video.cpp -L ./fflibs -lavdevice -lavfilter -lavformat -lavcodec -lrt -ldl -lXfixes -lXext -lX11 -lasound -lSDL -lz -lrt -lswresample -lswscale -lavutil -lm -llzma -lbz2 -lswresample -lpthread
run
./a.out myvideo.mp4
This video will be fine if converted in bash via
ffmpeg -i myvideo.mp4 out1.mp4
But I look for a method to fix it from the code.
Generated video played on totem (Ubuntu) :
Video after conversion :
-
Can not open a video file in OpenCV
31 octobre 2017, par mansI have a video file that encoded in h264 and save in mkv format (*.mkv).
I can pen file in VLC and play it, but I want to open it in OpenCV and extract each frame of the video.I have this code :
std::string fileName = "D:/Temp/video.mkv";
cv::VideoCapture capture(fileName);
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('H', '2', '6', '4'));
if (!capture.isOpened())
{
//error!
std::cout << "Can not load video";
}
else
{
double prevtimestamp = 0;
cv::Mat frame;
while (1)
{
capture.grab();
double timestamp = capture.get(CV_CAP_PROP_POS_MSEC);
}
}when I run this code, I am getting message that the file can not be open.
My questions :
- Is there anything wrong with this code ?
- Do I need FFMPEG on the path so OpenCV can open h264 videos ?
- How can I get more information why OpenCV can not open the file ?
-
FFMPEG Open several video files at the same time ? C++ [on hold]
8 octobre 2017, par LemanRassI wrote a C++ plugin for playing videos using FFmpeg libraries. All works perfectly when playing a single video, but when I try to play at least 2 videos at the same time I have these errors :
#01 pc 0000714d /data/app/com.ffmpeg.sdk.videoplugin-
1/lib/arm/libAndroidVideoPlugin.so (_ZN12FFmpegReader13ReadNextFrameEPvPc+404)
#02 pc 00005a9f /data/app/com.ffmpeg.sdk.videoplugin-
1/lib/arm/libAndroidVideoPlugin.so (_ZN9Videofile17UpdateFramesCacheEv+118)
#03 pc 000057d1 /data/app/com.ffmpeg.sdk.videoplugin-
1/lib/arm/libAndroidVideoPlugin.so (_firstUpdateThread+80)It seems that when I open the second video it, replaces the first one.
I came up with this idea when I opened 2 videos one by one (without any errors) then I started to play only the second one and as a result I didn’t get any errors. But when I tried to read frames from the first video, my app crashed with the error above.A bit about plugin`s structure :
-
I created a class called
FFmpegReader
where methods work
directly with ffmpeg (Opening file, ReadFrames and returning them as void*,
Seek and Close). -
Then I created one more class which creates a
FFmpegReader
instance using
the "new" operator inside its constructor, descriptor (unique id of the opened
file),queue
of cached frames (up to 100 at the same time) and
methods to operate withFFmpegReader
andframesCache
. -
I created a main file where I created a vector of objects of class from
the second point I described above. Also I declared 4 threads for each
opened video file (4 opened videos is the max number of allowed opened
videos at the same time). They call the method to update a cache of frames in
its own video file using the video file descriptor. Finally I declared methods
which will be called from the main app which is using this plugin to retrieve
cached frames from cache.
As you can see, I did everything to let it works separately with each new opened video. It seems the problem is inside of FFmpeg. There might be some restrictions I’m not aware of.
================UPDATE=================
Sources of Main: https://pastebin.com/DfGH0BRZ
Sources of Videofile class: https://pastebin.com/WjdS532B
Sources of FFmpegReader class: https://pastebin.com/aPHpBvBvHope it’s gonna help...
-