
Recherche avancée
Autres articles (73)
-
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 (...) -
Le profil des utilisateurs
12 avril 2011, parChaque utilisateur dispose d’une page de profil lui permettant de modifier ses informations personnelle. Dans le menu de haut de page par défaut, un élément de menu est automatiquement créé à l’initialisation de MediaSPIP, visible uniquement si le visiteur est identifié sur le site.
L’utilisateur a accès à la modification de profil depuis sa page auteur, un lien dans la navigation "Modifier votre profil" est (...) -
Configurer la prise en compte des langues
15 novembre 2010, parAccéder à la configuration et ajouter des langues prises en compte
Afin de configurer la prise en compte de nouvelles langues, il est nécessaire de se rendre dans la partie "Administrer" du site.
De là, dans le menu de navigation, vous pouvez accéder à une partie "Gestion des langues" permettant d’activer la prise en compte de nouvelles langues.
Chaque nouvelle langue ajoutée reste désactivable tant qu’aucun objet n’est créé dans cette langue. Dans ce cas, elle devient grisée dans la configuration et (...)
Sur d’autres sites (8152)
-
FFMPEG crop video output is black screen, sound is good [on hold]
11 janvier 2016, par Oum AlaaI cropped a video using ffmpeg command line, the output is black screen, the sound is clear and good :
ffmpeg -i Original.mp4 -t 00:00:29 -vf "crop=634:300:0:60" Done.mp4
ffmpeg version :
ffmpeg version 0.8.17-4:0.8.17-0ubuntu0.12.04.1, Copyright (c) 2000-2014 the Libav developers
built on Mar 16 2015 13:26:50 with gcc 4.6.3
video information :
mediainfo '--Inform=Video;%Width%x%Height%' Original.mp4
634x360Thanks in advance
-
ffmpeg : corrupt audio in usage of avfoundation
3 janvier 2016, par AndyI am trying to record my desktop screen (MacBook Pro (Retina, 15-inch, Mid 2014), OSX 10.10.5) with audio. First, I have to find the devices for recording, video:1 and audio:0 in my case.
User@User-MacBook-Pro:~/test$ ffmpeg -hide_banner -f avfoundation -list_devices true -i ""
[AVFoundation input device @ 0x7ff19a422320] AVFoundation video devices:
[AVFoundation input device @ 0x7ff19a422320] [0] FaceTime HD Camera
[AVFoundation input device @ 0x7ff19a422320] [1] Capture screen 0
[AVFoundation input device @ 0x7ff4b9c22320] [2] Capture screen 1
[AVFoundation input device @ 0x7ff19a422320] AVFoundation audio devices:
[AVFoundation input device @ 0x7ff19a422320] [0] Soundflower (2ch)
[AVFoundation input device @ 0x7ff19a422320] [1] Built-in Microphone
[AVFoundation input device @ 0x7ff19a422320] [2] Soundflower (64ch)
: Input/output errorThen I run to capture the screen :
ffmpeg -f avfoundation -i "1:0" out_desktop.mkv
and the audio of the output stutters terribly.
But if I use the second external screen (which is connect via HDMI) :ffmpeg -f avfoundation -i "2:0" out_ext.mkv
Then I have no audio problems.
So, what could be the cause of this behaviour ? Somehow the video device "Capture screen 0" causes the audio stutter.
Here are the full outputs of the two commands above, Screen 0 :
User@User-MacBook-Pro:~/test$ ffmpeg -f avfoundation -i "1:0" out.mkv
ffmpeg version 2.8.4 Copyright (c) 2000-2015 the FFmpeg developers
built with Apple LLVM version 7.0.2 (clang-700.1.81)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libvpx --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libass --enable-ffplay --enable-libspeex --enable-libschroedinger --enable-libfdk-aac --enable-libopus --enable-frei0r --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags=-I/usr/local/Cellar/openjpeg/1.5.2_1/include/openjpeg-1.5 --enable-nonfree --enable-vda
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 40.101 / 5. 40.101
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
[avfoundation @ 0x7fca1200da00] Selected pixel format (yuv420p) is not supported by the input device.
[avfoundation @ 0x7fca1200da00] Supported pixel formats:
[avfoundation @ 0x7fca1200da00] uyvy422
[avfoundation @ 0x7fca1200da00] yuyv422
[avfoundation @ 0x7fca1200da00] nv12
[avfoundation @ 0x7fca1200da00] 0rgb
[avfoundation @ 0x7fca1200da00] bgr0
[avfoundation @ 0x7fca1200da00] Overriding selected pixel format to use uyvy422 instead.
[avfoundation @ 0x7fca1200da00] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, avfoundation, from '1:0':
Duration: N/A, start: 11734.092500, bitrate: 2822 kb/s
Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 2880x1800, 1000k tbr, 1000k tbn, 1000k tbc
Stream #0:1: Audio: pcm_f32le, 44100 Hz, stereo, flt, 2822 kb/s
File 'out.mkv' already exists. Overwrite ? [y/N] y
No pixel format specified, yuv422p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264 @ 0x7fca1390e000] MB rate (20340000000) > level limit (2073600)
[libx264 @ 0x7fca1390e000] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2
[libx264 @ 0x7fca1390e000] profile High 4:2:2, level 5.2, 4:2:2 8-bit
[libx264 @ 0x7fca1390e000] 264 - core 148 r2601 a0cd7d3 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, matroska, to 'out.mkv':
Metadata:
encoder : Lavf56.40.101
Stream #0:0: Video: h264 (libx264) (H264 / 0x34363248), yuv422p, 2880x1800, q=-1--1, 1000k fps, 1k tbn, 1000k tbc
Metadata:
encoder : Lavc56.60.100 libx264
Stream #0:1: Audio: vorbis (libvorbis) (oV[0][0] / 0x566F), 44100 Hz, stereo, fltp
Metadata:
encoder : Lavc56.60.100 libvorbis
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (pcm_f32le (native) -> vorbis (libvorbis))
Press [q] to stop, [?] for help
frame= 969 fps= 29 q=-1.0 Lsize= 6911kB time=00:00:34.80 bitrate=1626.8kbits/s
video:6475kB audio:396kB subtitle:0kB other streams:0kB global headers:4kB muxing overhead: 0.591309%
[libx264 @ 0x7fca1390e000] frame I:4 Avg QP:15.77 size:1461092
[libx264 @ 0x7fca1390e000] frame P:246 Avg QP:16.00 size: 2608
[libx264 @ 0x7fca1390e000] frame B:719 Avg QP:13.91 size: 200
[libx264 @ 0x7fca1390e000] consecutive B-frames: 0.9% 0.4% 0.0% 98.7%
[libx264 @ 0x7fca1390e000] mb I I16..4: 11.6% 43.3% 45.2%
[libx264 @ 0x7fca1390e000] mb P I16..4: 0.0% 0.0% 0.1% P16..4: 0.4% 0.0% 0.0% 0.0% 0.0% skip:99.5%
[libx264 @ 0x7fca1390e000] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 0.2% 0.0% 0.0% direct: 0.0% skip:99.8% L0:39.9% L1:60.0% BI: 0.1%
[libx264 @ 0x7fca1390e000] 8x8 transform intra:41.6% inter:38.8%
[libx264 @ 0x7fca1390e000] coded y,uvDC,uvAC intra: 76.9% 77.9% 75.5% inter: 0.0% 0.1% 0.0%
[libx264 @ 0x7fca1390e000] i16 v,h,dc,p: 51% 34% 11% 4%
[libx264 @ 0x7fca1390e000] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 22% 17% 19% 7% 4% 3% 8% 5% 16%
[libx264 @ 0x7fca1390e000] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 21% 24% 10% 7% 6% 5% 8% 7% 12%
[libx264 @ 0x7fca1390e000] i8c dc,h,v,p: 59% 14% 18% 9%
[libx264 @ 0x7fca1390e000] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x7fca1390e000] ref P L0: 71.5% 3.4% 13.0% 12.1%
[libx264 @ 0x7fca1390e000] ref B L0: 46.6% 52.3% 1.1%
[libx264 @ 0x7fca1390e000] ref B L1: 95.1% 4.9%
[libx264 @ 0x7fca1390e000] kb/s:1525.48and Screen 1 :
User@User-MacBook-Pro:~/test$ ffmpeg -f avfoundation -i "2:0" out.mkv
ffmpeg version 2.8.4 Copyright (c) 2000-2015 the FFmpeg developers
built with Apple LLVM version 7.0.2 (clang-700.1.81)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libvpx --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libass --enable-ffplay --enable-libspeex --enable-libschroedinger --enable-libfdk-aac --enable-libopus --enable-frei0r --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags=-I/usr/local/Cellar/openjpeg/1.5.2_1/include/openjpeg-1.5 --enable-nonfree --enable-vda
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 40.101 / 5. 40.101
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
[avfoundation @ 0x7fc2e900da00] Selected pixel format (yuv420p) is not supported by the input device.
[avfoundation @ 0x7fc2e900da00] Supported pixel formats:
[avfoundation @ 0x7fc2e900da00] uyvy422
[avfoundation @ 0x7fc2e900da00] yuyv422
[avfoundation @ 0x7fc2e900da00] nv12
[avfoundation @ 0x7fc2e900da00] 0rgb
[avfoundation @ 0x7fc2e900da00] bgr0
[avfoundation @ 0x7fc2e900da00] Overriding selected pixel format to use uyvy422 instead.
[avfoundation @ 0x7fc2e900da00] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, avfoundation, from '2:0':
Duration: N/A, start: 11809.126333, bitrate: 2822 kb/s
Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 2560x1080, 1000k tbr, 1000k tbn, 1000k tbc
Stream #0:1: Audio: pcm_f32le, 44100 Hz, stereo, flt, 2822 kb/s
File 'out.mkv' already exists. Overwrite ? [y/N] y
No pixel format specified, yuv422p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264 @ 0x7fc2ea82ac00] MB rate (10880000000) > level limit (2073600)
[libx264 @ 0x7fc2ea82ac00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2
[libx264 @ 0x7fc2ea82ac00] profile High 4:2:2, level 5.2, 4:2:2 8-bit
[libx264 @ 0x7fc2ea82ac00] 264 - core 148 r2601 a0cd7d3 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, matroska, to 'out.mkv':
Metadata:
encoder : Lavf56.40.101
Stream #0:0: Video: h264 (libx264) (H264 / 0x34363248), yuv422p, 2560x1080, q=-1--1, 1000k fps, 1k tbn, 1000k tbc
Metadata:
encoder : Lavc56.60.100 libx264
Stream #0:1: Audio: vorbis (libvorbis) (oV[0][0] / 0x566F), 44100 Hz, stereo, fltp
Metadata:
encoder : Lavc56.60.100 libvorbis
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (pcm_f32le (native) -> vorbis (libvorbis))
Press [q] to stop, [?] for help
frame= 755 fps= 30 q=-1.0 Lsize= 1025kB time=00:00:26.65 bitrate= 315.1kbits/s
video:680kB audio:326kB subtitle:0kB other streams:0kB global headers:4kB muxing overhead: 2.003084%
[libx264 @ 0x7fc2ea82ac00] frame I:4 Avg QP:13.22 size:145661
[libx264 @ 0x7fc2ea82ac00] frame P:191 Avg QP:19.87 size: 250
[libx264 @ 0x7fc2ea82ac00] frame B:560 Avg QP:28.31 size: 116
[libx264 @ 0x7fc2ea82ac00] consecutive B-frames: 1.1% 0.0% 0.4% 98.5%
[libx264 @ 0x7fc2ea82ac00] mb I I16..4: 54.5% 29.2% 16.2%
[libx264 @ 0x7fc2ea82ac00] mb P I16..4: 0.2% 0.1% 0.0% P16..4: 0.1% 0.0% 0.0% 0.0% 0.0% skip:99.6%
[libx264 @ 0x7fc2ea82ac00] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 0.3% 0.0% 0.0% direct: 0.0% skip:99.7% L0:69.2% L1:30.8% BI: 0.0%
[libx264 @ 0x7fc2ea82ac00] 8x8 transform intra:31.7% inter:13.1%
[libx264 @ 0x7fc2ea82ac00] coded y,uvDC,uvAC intra: 10.9% 8.8% 8.5% inter: 0.0% 0.0% 0.0%
[libx264 @ 0x7fc2ea82ac00] i16 v,h,dc,p: 69% 31% 0% 0%
[libx264 @ 0x7fc2ea82ac00] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 27% 5% 67% 0% 0% 0% 0% 0% 0%
[libx264 @ 0x7fc2ea82ac00] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 38% 25% 14% 3% 3% 4% 5% 4% 5%
[libx264 @ 0x7fc2ea82ac00] i8c dc,h,v,p: 92% 3% 4% 0%
[libx264 @ 0x7fc2ea82ac00] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x7fc2ea82ac00] ref P L0: 76.3% 1.7% 16.8% 5.2%
[libx264 @ 0x7fc2ea82ac00] ref B L0: 38.9% 56.9% 4.2%
[libx264 @ 0x7fc2ea82ac00] ref B L1: 97.3% 2.7%
[libx264 @ 0x7fc2ea82ac00] kb/s:208.84EDIT
The main differences between the two (lengthy) outputs above via
wdiff -n output1 output2 |colordiff
is the resolution (
[-2880x1800,-] {+2560x1080,+}
) and the resulting MB rate ([-(20340000000)-] {+(10880000000)+}
). So, what could increase the performance offfmpeg
? -
ffmpeg Bmp to yuv : Crash at sws_scale
28 décembre 2015, par the-ownerThe context :
I have a succession of continuous bitmap and I want to encode them into a light video format.
I use ffmpeg version 2.8.3 (the build here), under qt5, qt IDE, and msvc2013 for win32.The problem :
My code crash at sws_scale () (and sometimes at avcodec_encode_video2()). When I explore the stack, the crash event occurs at sws_getCachedContext (). (I can only see the stack with these ffmpeg builds).
I only use these ffmpeg libraries (from the Qt .pro file) :LIBS += -lavcodec -lavformat -lswscale -lavutil
It’s swscale which bug. And this is the code :
void newVideo ()
{
ULONG_PTR gdiplusToken;
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
initBitmap (); //init bmp
int screenWidth = bmp.bmiHeader.biWidth;
int screenHeight = bmp.bmiHeader.biHeight;
AVCodec * codec;
AVCodecContext * c = NULL;
uint8_t * outbuf;
int i, out_size, outbuf_size;
avcodec_register_all();
qDebug () << "Video encoding\n";
// Find the mpeg1 video encoder
codec = avcodec_find_encoder(AV_CODEC_ID_H264);
if (!codec)
{
qDebug () << "Codec not found\n";
avcodec_close(c);
av_free(c);
return;
}
else
qDebug () << "H264 codec found\n";
c = avcodec_alloc_context3(codec);
c->bit_rate = 1000000;
c->width = 800; // resolution must be a multiple of two (1280x720),(1900x1080),(720x480)
c->height = 600;
c->time_base.num = 1; // framerate numerator
c->time_base.den = 25; // framerate denominator
c->gop_size = 30; // emit one intra frame every ten frames
c->max_b_frames = 1; // maximum number of b-frames between non b-frames
c->pix_fmt = AV_PIX_FMT_YUV420P; //Converstion RGB to YUV ?
c->codec_id = AV_CODEC_ID_H264;
struct SwsContext* fooContext = sws_getContext(screenWidth, screenHeight,
AV_PIX_FMT_RGB32,
c->width, c->height,
AV_PIX_FMT_YUV420P,
SWS_FAST_BILINEAR,
NULL, NULL, NULL);
// Open the encoder
if (avcodec_open2(c, codec, NULL) < 0)
{
qDebug () << "Could not open codec\n";
avcodec_close(c);
av_free(c);
return;
}
else qDebug () << "H264 codec opened\n";
outbuf_size = 100000 + c->width*c->height*(32>>3);//*(32>>3); // alloc image and output buffer
outbuf = static_cast(malloc(outbuf_size));
qDebug() << "Setting buffer size to: " << outbuf_size << "\n";
FILE* f = fopen("TEST.mpg","wb");
if(!f) qDebug() << "x - Cannot open video file for writing\n";
else qDebug() << "Opened video file for writing\n";
// encode 5 seconds of video
for (i = 0; i < STREAM_FRAME_RATE*STREAM_DURATION; i++) //the stop condition i < 5.0*5
{
qDebug () << "i = " << i;
fflush(stdout);
HBITMAP hBmp;
if (GetScreen(hBmp) == -1) return;
BYTE * pPixels;// = new BYTE [bmp.bmiHeader.biSizeImage];
pPixels = getPixels (hBmp);
DeleteObject (hBmp);
int nbytes = avpicture_get_size(AV_PIX_FMT_YUV420P, c->width, c->height);
uint8_t* outbuffer = (uint8_t*)av_malloc(nbytes*sizeof(uint8_t));
if(!outbuffer) // check if(outbuf) instead
{
qDebug () << "Bytes cannot be allocated";
return;
}
AVFrame* inpic = avcodec_alloc_frame(); //av_frame_alloc () ?
AVFrame* outpic = avcodec_alloc_frame();
outpic->pts = (int64_t)((float)i * (1000.0/((float)(c->time_base.den))) * 90);
if (avpicture_fill((AVPicture*) inpic, (uint8_t*) pPixels, AV_PIX_FMT_RGB32,
screenWidth, screenHeight) < 0)
qDebug () << "avpicture_fill Fill picture with image failed"; //Fill picture with image
if(avpicture_fill((AVPicture*) outpic, outbuffer, AV_PIX_FMT_YUV420P,
c->width, c->height) < 0)
qDebug () << "avpicture_fill failed";
if (av_image_alloc(outpic->data, outpic->linesize, c->width, c->height,
c->pix_fmt, 1) < 0)
qDebug () << "av_image_alloc failed";
inpic->data[0] += inpic->linesize[0]*(screenHeight - 1); // Flipping frame
inpic->linesize[0] = -inpic->linesize[0]; // Flipping frame
////////////////////////////HERE THE BUG////////////////////////////////
sws_scale(fooContext,
inpic->data, inpic->linesize,
0, c->height,
outpic->data, outpic->linesize); //HERE THE BUG
av_free_packet((AVPacket *)outbuf);
// encode the image
out_size = avcodec_encode_video2 (c, (AVPacket *) outbuf,
(AVFrame *) outbuf_size, (int *) outpic);
///////////////////////THE CODE DONT GO BEYOND/////////////////////////////////
qDebug () << "Encoding frame" << i <<" (size=" << out_size <<"\n";
fwrite(outbuf, 1, out_size, f);
delete [] pPixels;
av_free(outbuffer);
av_free(inpic);
av_freep(outpic);
}
// get the delayed frames
for(; out_size; i++)
{
fflush(stdout);
out_size = avcodec_encode_video2 (c, (AVPacket *) outbuf,
(AVFrame *) outbuf_size, NULL);
qDebug () << "Writing frame" << i <<" (size=" << out_size <<"\n";
fwrite(outbuf, 1, out_size, f);
}
// add sequence end code to have a real mpeg file
outbuf[0] = 0x00;
outbuf[1] = 0x00;
outbuf[2] = 0x01;
outbuf[3] = 0xb7;
fwrite(outbuf, 1, 4, f);
fclose(f);
avcodec_close(c);
free(outbuf);
av_free(c);
qDebug () << "Closed codec and Freed\n";
}And the output :
Video encoding
H264 codec found
H264 codec opened
Setting buffer size to: 2020000
Opened video file for writing
i = 0
**CRASH**I have thougth that my bitmap wasn’t good so I have crafted a bitmap just for testing, the code was :
uint8_t* pPixels = new uint8_t[Width * 3 * Height];
int x = 50;
for(unsigned int i = 0; i < Width * 3 * Height; i = i + 3) // loop for generating color changing images
{
pPixels [i] = x % 255; //R
pPixels [i + 1] = (x) % 255; //G
pPixels [i + 2] = (255 - x) % 255; //B
}However the crash continue. Perhaps, it might prove that it’s not the bitmap (pPixels) which has a problem.
If anyone know, why I get this bug : Maybe don’t I set one parameter well ? Or one ffmpeg deprecated function ? etc.
EDIT 1 27/12/15
Thanks to Ronald S. Bultje The function sws_scale () does not crash with this code, however I get an error from it bad dst image pointers. My code :
//DESTINATION FRAME
if (avpicture_alloc ((AVPicture*) dst_frame, AV_PIX_FMT_YUV420P, c->width, c->height) < 0)
{
qDebug () << "# avpicture_alloc failed";
return;
}
if(avpicture_fill((AVPicture*) dst_frame, NULL, AV_PIX_FMT_YUV420P,
c->width, c->height) < 0)
qDebug () << "avpicture_fill failed";
avcodec_align_dimensions2 (c, &c->width, &c->height, dst_frame->linesize);
//SOURCE FRAME
if (avpicture_fill((AVPicture*) src_frame, (uint8_t *) pPixels, AV_PIX_FMT_RGB32,
tmp_screenWidth, tmp_screenHeight) < 0)
qDebug () << "# avpicture_fill Fill picture with image failed"; //Fill picture with image
avcodec_align_dimensions2 (c, &tmp_screenWidth, &tmp_screenHeight, src_frame->linesize);
struct SwsContext* conversionContext = sws_getContext(tmp_screenWidth,tmp_screenHeight,AV_PIX_FMT_RGB32,c->width, c->height, AV_PIX_FMT_YUV420P,SWS_FAST_BILINEAR, NULL, NULL, NULL);
int output_Height = sws_scale(conversionContext,
src_frame->data, src_frame->linesize,
0, tmp_screenHeight,
dst_frame->data, dst_frame->linesize); //return 0 -> bad dst image pointers errorEDIT 2 28/12/15
I have tried to follow the Ronald S. Bultje’s suggestion and now I get a bad src image pointers error, I have investigated and worked many hours but I do not find a solution. Here, there is the new snippet :
AVFrame* src_frame = av_frame_alloc ();
AVFrame* dst_frame = av_frame_alloc ();
AVFrame* tmp_src_frame = av_frame_alloc ();
/*........I do not use them until this snippet..........*/
//DESTINATION
//avpicture_free ((AVPicture*)dst_frame);
avcodec_align_dimensions2 (c, &c->width, &c->height, dst_frame->linesize);
if (avpicture_alloc ((AVPicture*) dst_frame, AV_PIX_FMT_YUV420P, c->width, c->height) < 0)
{
qDebug () << "# avpicture_alloc failed";
return;
}
//SOURCE
//stride = src_frame->linesize [0] = ((((screenWidth * bitPerPixel) + 31) & ~31) >> 3); do I need to do that ?
//== stride - I have gotten this formula from : https://msdn.microsoft.com/en-us/library/windows/desktop/dd318229(v=vs.85).aspx
if (avpicture_fill((AVPicture*) src_frame, (uint8_t *) pPixels, AV_PIX_FMT_RGB32,
screenWidth, screenHeight) < 0)
qDebug () << "# avpicture_fill Fill picture with image failed"; //Fill picture with image
//linesize [0] == 21760 like commented stride
//Source TO TMP Source
avcodec_align_dimensions2 (c, &tmp_screenWidth, &tmp_screenHeight, tmp_src_frame->linesize);
if (avpicture_fill((AVPicture*) tmp_src_frame, NULL, AV_PIX_FMT_RGB32,
tmp_screenWidth, tmp_screenHeight) < 0)
qDebug () << "# avpicture_fill Fill picture with image failed"; //Fill picture with image
av_picture_copy ((AVPicture*) tmp_src_frame, (const AVPicture*) src_frame, AV_PIX_FMT_RGB32,
screenWidth, screenHeight);
struct SwsContext* conversionContext = sws_getContext(tmp_screenWidth, tmp_screenHeight,
AV_PIX_FMT_RGB32,
c->width, c->height,
AV_PIX_FMT_YUV420P,
SWS_FAST_BILINEAR,
NULL, NULL, NULL);
int output_Height = sws_scale(conversionContext,
tmp_src_frame->data, tmp_src_frame->linesize,
0, tmp_screenHeight,
dst_frame->data, dst_frame->linesize);
//ffmpeg error = bad src image pointers
// output_Height == 0EDIT 3
For temp Picture I have done an
avcode_align_dimension2()
then aavpicture_alloc()
for allocating memory andavpicture_fill()
in order to fill the picture pointer. Below the updated code ://DESTINATION
//avpicture_free ((AVPicture*)dst_frame);
avcodec_align_dimensions2 (c, &c->width, &c->height, dst_frame->linesize);
if (avpicture_alloc ((AVPicture*) dst_frame, AV_PIX_FMT_YUV420P, c->width, c->height) < 0)
{
qDebug () << "# avpicture_alloc failed";
return;
}
//SOURCE
//src_frame->linesize [0] = ((((screenWidth * bpp) + 31) & ~31) >> 3);
//src_frame->linesize [0] = stride;
if (avpicture_fill((AVPicture*) src_frame, (uint8_t *) pPixels, AV_PIX_FMT_RGB32,
screenWidth, screenHeight) < 0)
qDebug () << "# avpicture_fill Fill picture with image failed"; //Fill picture with image
//Source TO TMP Source
avcodec_align_dimensions2 (c, &tmp_screenWidth, &tmp_screenHeight, tmp_src_frame->linesize);
if (avpicture_alloc ((AVPicture*) tmp_src_frame, AV_PIX_FMT_RGB32, tmp_screenWidth, tmp_screenHeight) < 0)
{
qDebug () << "# avpicture_alloc failed";
return;
}
int outbuf_size = tmp_screenWidth*tmp_screenHeight*4;// alloc image and output buffer
outbuf = static_cast(malloc(outbuf_size));
if (avpicture_fill((AVPicture*) tmp_src_frame, outbuf, AV_PIX_FMT_RGB32,
tmp_screenWidth, tmp_screenHeight) < 0)
qDebug () << "# avpicture_fill Fill picture with image failed"; //Fill picture with image
av_picture_copy ((AVPicture*) tmp_src_frame, (const AVPicture*) src_frame, AV_PIX_FMT_RGB32,
tmp_screenWidth, tmp_screenHeight);
struct SwsContext* conversionContext = sws_getContext(tmp_screenWidth, tmp_screenHeight,
AV_PIX_FMT_RGB32,
c->width, c->height,
AV_PIX_FMT_YUV420P,
SWS_FAST_BILINEAR,
NULL, NULL, NULL);
int output_Height = sws_scale(conversionContext,
tmp_src_frame->data, tmp_src_frame->linesize,
0, tmp_screenHeight,
dst_frame->data, dst_frame->linesize);The call stack is as follow :
av_picture_copy()
is called thenav_image_copy()
then_VEC_memcpy()
thenfastcopy_I()
and crash ... The problem is not the dimensions (tmp_screenWidth/Height) ? (Withav_picture_copy ()
could we copy a picture P1 with dim W1xH1 to a picture P2 with dimension W2xH2 ?)EDIT 4
Crash at
av_picture_copy()
whichcall _aligned_malloc()
thenav_image_copy _VEC_memcpy()
andfastcopy_I()
//SOURCE
if (avpicture_fill((AVPicture*) src_frame, (uint8_t *) pPixels, AV_PIX_FMT_RGB32,
screenWidth, screenHeight) < 0)
qDebug () << "# avpicture_fill Fill picture with image failed"; //Fill picture with image
//Source TO TMP Source
avcodec_align_dimensions2 (c, &tmp_screenWidth, &tmp_screenHeight, tmp_src_frame->linesize);
if (avpicture_alloc ((AVPicture*) tmp_src_frame, AV_PIX_FMT_RGB32, tmp_screenWidth, tmp_screenHeight) < 0)
{
qDebug () << "# avpicture_alloc failed";
return;
}
av_picture_copy ((AVPicture*) tmp_src_frame, (const AVPicture*) src_frame, AV_PIX_FMT_RGB32,
tmp_screenWidth, tmp_screenHeight);