
Recherche avancée
Médias (1)
-
The pirate bay depuis la Belgique
1er avril 2013, par
Mis à jour : Avril 2013
Langue : français
Type : Image
Autres articles (85)
-
Personnaliser en ajoutant son logo, sa bannière ou son image de fond
5 septembre 2013, parCertains thèmes prennent en compte trois éléments de personnalisation : l’ajout d’un logo ; l’ajout d’une bannière l’ajout d’une image de fond ;
-
Ecrire une actualité
21 juin 2013, parPrésentez les changements dans votre MédiaSPIP ou les actualités de vos projets sur votre MédiaSPIP grâce à la rubrique actualités.
Dans le thème par défaut spipeo de MédiaSPIP, les actualités sont affichées en bas de la page principale sous les éditoriaux.
Vous pouvez personnaliser le formulaire de création d’une actualité.
Formulaire de création d’une actualité Dans le cas d’un document de type actualité, les champs proposés par défaut sont : Date de publication ( personnaliser la date de publication ) (...) -
Publier sur MédiaSpip
13 juin 2013Puis-je poster des contenus à partir d’une tablette Ipad ?
Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir
Sur d’autres sites (12261)
-
Python ffmpeg does not save the mp4 clips to file
30 janvier 2021, par oo92I'm using the ffmpeg Python library to save 60 second mp4 clips to file from Twitch livestreams using its API. This is my code :


current_dir = os.getcwd()

client = TwitchClient(client_id='')
streams_now = client.streams.get_live_streams(limit=100, offset=900)
epoch = str(math.ceil(time.time()))

if not os.path.exists(current_dir + '/twitch_videos/'):
 os.mkdir(current_dir + '/twitch_videos/')

for i in range(0, 1):
 try:
 username = streams_now[i]['channel']['name']
 id = streams_now[i]['id']
 game = streams_now[i]['game']
 game = game.translate(str.maketrans({':': '-', ' ': '-', "'": '', '!': '', '&': '_', '.': '', '+': '_'}))
 streaming = streamlink.streams('http://twitch.tv/' + username)
 stream = streaming["best"].url

 twitch_stream = ffmpeg.input(stream)

 twitch_stream = ffmpeg.filter(twitch_stream,
 'fps',
 fps=1,
 round='up')

 twitch_stream = ffmpeg.output(twitch_stream,
 current_dir + '/twitch_videos/' + '%d_' + username + '_' + epoch + '.mp4',
 sc_threshold='0',
 g='60',
 f='segment',
 segment_time='600',
 segment_format_options='movflags=+faststart',
 reset_timestamps='1')frl3dqgn21bbpp6tajjvg5pdevczac
 ffmpeg.run(twitch_stream)


 except:
 pass



I am concatenating the path it should go to, to the name of the file. But the folder is empty after I take a look.


-
CMD Batch Variable Won't Save FFprobe Output
15 juillet 2017, par Matt McManisI have an CMD Batch Script that will convert a folder of mp4 videos to webm.
You will need :
- FFmpeg/FFprobe installed and set in Environment Variables to run from CMD.
- A folder with an mp4 for FFprobe to parse.
To make it easy, this is only the first part of the script, showing the
Video Bitrate
variable.Here is a full script, just replace the paths.
https://pastebin.com/raw/3ng77ExzHow the Script works :
- Loops through all videos in folder
- Has FFprobe parse the Video’s Bitrate and save it to
%V
and
%vBitrate%
. - Has FFmpeg use
%V
. Such as-b:v %V
will become the parsed value
-b:v 9401k
. - Converts each video from mp4 to webm using the parsed Bitrate
Problem
I can’t get FFprobe’s Output to save to the variable. I’ve come up with a workaround, having it first save the bitrate value to a
temp file
, then import that to the%vBitrate%
variable.Example :
(%V > tmp_vBitrate) & SET /p vBitrate= < tmp_vBitrate
.
Works
Temp File Variable
cd "C:\Users\Matt\Videos\" && for %f in (*.mp4) do ffprobe -i "C:\Users\Matt\Desktop\Test\%~f" -select_streams v:0 -show_entries stream=bit_rate -v quiet -of csv="p=0" & for /f "tokens=*" %V in ("ffprobe -i "%~f" -select_streams v:0 -show_entries stream=bit_rate -v quiet -of csv=p=0") do (echo ) & (%V > tmp_vBitrate) & SET /p vBitrate= < tmp_vBitrate & del tmp_vBitrate & for /F %V in ('echo %vBitrate%') do (echo %V)
Does Not Work
Memory Variable
cd "C:\Users\Matt\Videos\" && for %f in (*.mp4) do ffprobe -i "C:\Users\Matt\Desktop\Test\%~f" -select_streams v:0 -show_entries stream=bit_rate -v quiet -of csv="p=0" & for /f "tokens=*" %V in ("ffprobe -i "%~f" -select_streams v:0 -show_entries stream=bit_rate -v quiet -of csv=p=0") do (echo ) & SET vBitrate=%V & for /F %V in ('echo %vBitrate%') do (echo %V)
Testing It
Run the first command. When it is finished, type
echo %vBitrate%
in CMD and press Enter. You’ll see the bitrate of the last mp4 file parsed.Do the same for the second command and you’ll see it doesn’t work.
Solution
I would like to get rid of the
Temp File Variable
and get the second command to work.(%V > tmp_vBitrate) & SET /p vBitrate= < tmp_vBitrate
to justSET vBitrate=%V
.Maybe this whole thing can be simplified ? Am I using the variables wrong ?
-
Problem : FFmpeg and C++ extract and save frame
26 mai 2021, par Simba_cl25I am doing a project where I must do the following : extract frames (along with the associated metadata - KLV) from a video given a period (for the moment every 10 seconds).
I have followed codes found on internet but I get an error that I can find a solution to.


extern "C" {
#include <libavcodec></libavcodec>avcodec.h>
#include <libavformat></libavformat>avformat.h>
#include <libavdevice></libavdevice>avdevice.h>
#include <libswscale></libswscale>swscale.h>
#include <libavfilter></libavfilter>avfilter.h>
#include <libswresample></libswresample>swresample.h>
#include <libavutil></libavutil>avutil.h>
#include <libavutil></libavutil>imgutils.h> 
}

static void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame);


int main(int argc, const char * argv[])
{
 AVFormatContext *pFormatCtx;
 int i, videoStream;
 AVCodecContext *pCodecCtx = NULL;
 const AVCodec *pCodec = NULL;
 AVFrame *pFrame;
 AVFrame *pFrameRGB;
 AVPacket *packet = av_packet_alloc();
 AVStream *pStream;
 int numBytes;
 int64_t Duration;
 uint8_t *buffer;
 bool frameFinished = false;

 // Open video file - check for errors
 pFormatCtx = 0;
 if (avformat_open_input(&pFormatCtx, "00Video\\VideoR.ts", 0, 0) != 0)
 return -1; 

 if (avformat_find_stream_info(pFormatCtx, 0) < 0)
 return -1;

 if (av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, 0, 0) <0)
 return -1;

 av_dump_format(pFormatCtx, 0, "00Video\\VideoR.ts", false);


 // Find the first video stream
 videoStream = -1;
 for (i = 0; i < pFormatCtx->nb_streams; i++)
 if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
 {
 videoStream = i;
 break;
 }
 if (videoStream == -1)
 return -1; 
 


 // Find the decoder for the video stream
 pCodec = avcodec_find_decoder(pFormatCtx->streams[videoStream]->codecpar->codec_id);
 pCodecCtx = avcodec_alloc_context3(pCodec);

 if (pCodec == NULL)
 {
 fprintf(stderr, "Codec not found\n");
 return -1; 
 }


 if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0)
 {
 fprintf(stderr, "Could not open codec\n");
 return -1; 
 }

 // Hack to correct wrong frame rates that seem to be generated by some codecs
 if (pCodecCtx->time_base.num > 1000 && pCodecCtx->time_base.den == 1)
 pCodecCtx->time_base.den = 1000;




 // Allocate video frame - original frame 
 pFrame = av_frame_alloc();

 if (!pFrame) {
 fprintf(stderr, "Could not allocate video frame\n");
 return -1;
 }


 // Allocate an AVFrame structure
 pFrameRGB = av_frame_alloc();

 if (pFrameRGB == NULL)
 {
 fprintf(stderr, "Could not allocate video RGB frame\n");
 return -1;
 }

 
 Duration = av_rescale_q(vstrm->duration, vstrm->time_base, { 1,1000 });
 
 numBytes = av_image_get_buffer_size(pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, 0);
 buffer = (uint8_t*)av_malloc(numBytes * sizeof(uint8_t));


 av_image_fill_arrays(pFrameRGB->data, pFrameRGB->linesize, buffer, AV_PIX_FMT_RGB24, pCodecCtx->width, pCodecCtx->height, 1);
 
 
 
 
 i = 0;
 while (av_read_frame(pFormatCtx, packet) >= 0)
 {
 // Is this a packet from the video stream?
 if (packet->stream_index == videoStream)
 {
 int ret;
 ret = avcodec_send_packet(pCodecCtx, packet);
 if (ret < 0 || ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
 fprintf(stderr, "Error sending a packet for decoding\n");
 //break;
 }
 while (ret >= 0) {
 ret = avcodec_receive_frame(pCodecCtx, pFrame);
 if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
 return -1;
 else if (ret < 0) {
 fprintf(stderr, "Error during decoding\n");
 return -1;
 frameFinished = true;
 }


 // Did we get a video frame?
 if (frameFinished)
 {
 static struct SwsContext *img_convert_ctx;

 
 if (img_convert_ctx == NULL) {
 int w = pCodecCtx->width;
 int h = pCodecCtx->height;
 img_convert_ctx = sws_getContext(w, h,
 pCodecCtx->pix_fmt,
 w, h, AV_PIX_FMT_RGB24, SWS_FAST_BILINEAR,
 NULL, NULL, NULL);

 if (img_convert_ctx == NULL) {
 fprintf(stderr, "Cannot initialize the conversion context!\n");
 exit(1);
 }
 }

 int ret = sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0,
 pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);


 // Save the frame to disk
 if (i <= Duration)
 {
 SaveFrame(pFrameRGB, pCodecCtx->width, pCodecCtx->height, i);
 i += 10*1000;
 }
 }
 }

 
 }

 // Free the packet that was allocated by av_read_frame
 av_packet_unref(packet);
 }

 

 // Free the RGB image
 free(buffer);
 av_free(pFrameRGB);

 // Free the YUV frame
 av_free(pFrame);

 // Close the codec
 avcodec_close(pCodecCtx);

 // Close the video file
 avformat_close_input(&pFormatCtx);
 return 0;
 
}




static void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame)
{
 FILE *pFile;
 char szFilename[32];
 int y;


 // Open file
 sprintf(szFilename, "Im\\frame%d.png", iFrame);
 pFile = fopen(szFilename, "wb");
 if (pFile == NULL)
 return;

 // Write header
 fprintf(pFile, "P6\n%d %d\n255\n", width, height);
 // Write pixel data
 for (y = 0; y < height; y++)
 fwrite(pFrame->data[0] + y * pFrame->linesize[0], 1, width*3, pFile);

 // Close file
 fclose(pFile);
}



The error I get is :


[swscaler @ 03055A80] bad dst image pointers



I think is because


numBytes = av_image_get_buffer_size(pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, 0);



Returns a negative value ( -22) but I don't know why.


Thanks,