
Recherche avancée
Médias (1)
-
The Great Big Beautiful Tomorrow
28 octobre 2011, par
Mis à jour : Octobre 2011
Langue : English
Type : Texte
Autres articles (36)
-
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 -
Pas question de marché, de cloud etc...
10 avril 2011Le vocabulaire utilisé sur ce site essaie d’éviter toute référence à la mode qui fleurit allègrement
sur le web 2.0 et dans les entreprises qui en vivent.
Vous êtes donc invité à bannir l’utilisation des termes "Brand", "Cloud", "Marché" etc...
Notre motivation est avant tout de créer un outil simple, accessible à pour tout le monde, favorisant
le partage de créations sur Internet et permettant aux auteurs de garder une autonomie optimale.
Aucun "contrat Gold ou Premium" n’est donc prévu, aucun (...) -
Les formats acceptés
28 janvier 2010, parLes commandes suivantes permettent d’avoir des informations sur les formats et codecs gérés par l’installation local de ffmpeg :
ffmpeg -codecs ffmpeg -formats
Les format videos acceptés en entrée
Cette liste est non exhaustive, elle met en exergue les principaux formats utilisés : h264 : H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 m4v : raw MPEG-4 video format flv : Flash Video (FLV) / Sorenson Spark / Sorenson H.263 Theora wmv :
Les formats vidéos de sortie possibles
Dans un premier temps on (...)
Sur d’autres sites (4860)
-
FFmpeg : How to estimate number of samples in audio stream ?
14 août 2015, par MariusI’m currently writing a small application that’s making use of the FFmpeg library in order to decode audio files (especially avformat and swresample) in C++.
Now I need the total number of samples in an audio stream. I know that the exact number can only be found out by actually decoding all the frames, I just need an estimation. What is the preferred method here ? How can I find out the duration of a file ?
-
Decoding pcm_s16le with FFMPEG ?
31 juillet 2015, par Davide Caresiai have a problem decoding a wav file using ffmpeg. I’m new to it and i’m not quite used to it.
In my application i have to input the audio file and get an array of samples to work on.
I used ffmpeg to create a function that gets in input the path of the file, the position in time where to start to output the samples and the lenght of the chunk to decode in seconds.I have no reputation, so I had to make a gdrive directory where you can see the problem and the files on which I worked.
Here it is : https://goo.gl/8KnjAj
When I try to decode the file harp.wav everything runs fine, and I can plot the samples as in the image plot-harp.png
The file is a WAV file encoded as : pcm_u8, 11025 Hz, 1 channels, u8, 88 kb/s
The problems comes when i try to decode the file demo-unprocessed.wav.
It outputs a series of samples that has no sense. It outputs a serie of samples plotted as the image graph1-demo.jpg shows.The file is a WAV file encoded as : pcm_s16le, 44100 Hz, 1 channels, s16, 705 kb/s
IDK where the problem in my code is, I already checked the code before and after the decoding with FFMPEG, and it works absolutely fine.
Here is the code for the dataReader.cpp :
/* Start by including the necessary */
#include "dataReader.h"
#include <cstdlib>
#include <iostream>
#include <fstream>
#ifdef __cplusplus
extern "C" {
#endif
#include <libavcodec></libavcodec>avcodec.h>
#include <libavformat></libavformat>avformat.h>
#include <libavutil></libavutil>avutil.h>
#ifdef __cplusplus
}
#endif
using namespace std;
/* initialization function for audioChunk */
audioChunk::audioChunk(){
data=NULL;
size=0;
bitrate=0;
}
/* function to get back chunk lenght in seconds */
int audioChunk::getTimeLenght(){
return size/bitrate;
}
/* initialization function for audioChunk_dNorm */
audioChunk_dNorm::audioChunk_dNorm(){
data=NULL;
size=0;
bitrate=0;
}
/* function to get back chunk lenght in seconds */
int audioChunk_dNorm::getTimeLenght(){
return size/bitrate;
}
/* function to normalize audioChunk into audioChunk_dNorm */
void audioChunk_dNorm::fillAudioChunk(audioChunk* cnk){
size=cnk->size;
bitrate=cnk->bitrate;
double min=cnk->data[0];
double max=cnk->data[0];
for(int i=0;isize;i++){
if(*(cnk->data+i)>max) max=*(cnk->data+i);
else if(*(cnk->data+i)data+i);
}
data=new double[size];
for(int i=0;i/data[i]=cnk->data[i]+256*data[i+1];
if(data[i]!=255) data[i]=2*((cnk->data[i])-(max-min)/2)/(max-min);
else data[i]=0;
}
cout<<"bitrate "<* inizialize audioChunk */
audioChunk output;
/* Check input times */
if((start_time<0)||(lenght<0)) {
cout<<"Input times should be positive";
return output;
}
/* Start FFmpeg */
av_register_all();
/* Initialize the frame to read the data and verify memory allocation */
AVFrame* frame = av_frame_alloc();
if (!frame)
{
cout << "Error allocating the frame" << endl;
return output;
}
/* Initialization of the Context, to open the file */
AVFormatContext* formatContext = NULL;
/* Opening the file, and check if it has opened */
if (avformat_open_input(&formatContext, path_name, NULL, NULL) != 0)
{
av_frame_free(&frame);
cout << "Error opening the file" << endl;
return output;
}
/* Find the stream info, if not found, exit */
if (avformat_find_stream_info(formatContext, NULL) < 0)
{
av_frame_free(&frame);
avformat_close_input(&formatContext);
cout << "Error finding the stream info" << endl;
return output;
}
/* Check inputs to verify time input */
if(start_time>(formatContext->duration/1000000)){
cout<< "Error, start_time is over file duration"<* Chunk = number of samples to output */
long long int chunk = ((formatContext->bit_rate)*lenght/8);
/* Start = address of sample where start to read */
long long int start = ((formatContext->bit_rate)*start_time/8);
/* Tot_sampl = number of the samples in the file */
long long int tot_sampl = (formatContext->bit_rate)*(formatContext->duration)/8000000;
/* Set the lenght of chunk to avoid segfault and to read all the file */
if (start+chunk>tot_sampl) {chunk = tot_sampl-start;}
if (lenght==0) {start = 0; chunk = tot_sampl;}
/* initialize the array to output */
output.data = new unsigned char[chunk];
output.bitrate = formatContext->bit_rate;
output.size=chunk;
av_dump_format(formatContext,0,NULL,0);
cout<* Find the audio Stream, if no audio stream are found, clean and exit */
AVCodec* cdc = NULL;
int streamIndex = av_find_best_stream(formatContext, AVMEDIA_TYPE_AUDIO, -1, -1, &cdc, 0);
if (streamIndex < 0)
{
av_frame_free(&frame);
avformat_close_input(&formatContext);
cout << "Could not find any audio stream in the file" << endl;
return output;
}
/* Open the audio stream to read data in audioStream */
AVStream* audioStream = formatContext->streams[streamIndex];
/* Initialize the codec context */
AVCodecContext* codecContext = audioStream->codec;
codecContext->codec = cdc;
/* Open the codec, and verify if it has opened */
if (avcodec_open2(codecContext, codecContext->codec, NULL) != 0)
{
av_frame_free(&frame);
avformat_close_input(&formatContext);
cout << "Couldn't open the context with the decoder" << endl;
return output;
}
/* Initialize buffer to store compressed packets */
AVPacket readingPacket;
av_init_packet(&readingPacket);
int j=0;
int count = 0;
while(av_read_frame(formatContext, &readingPacket)==0){
if((count+readingPacket.size)>start){
if(readingPacket.stream_index == audioStream->index){
AVPacket decodingPacket = readingPacket;
// Audio packets can have multiple audio frames in a single packet
while (decodingPacket.size > 0){
// Try to decode the packet into a frame
// Some frames rely on multiple packets, so we have to make sure the frame is finished before
// we can use it
int gotFrame = 0;
int result = avcodec_decode_audio4(codecContext, frame, &gotFrame, &decodingPacket);
count += result;
if (result >= 0 && gotFrame)
{
decodingPacket.size -= result;
decodingPacket.data += result;
int a;
for(int i=0;idata[0][i];
j++;
if(j>=chunk) break;
}
// We now have a fully decoded audio frame
}
else
{
decodingPacket.size = 0;
decodingPacket.data = NULL;
}
if(j>=chunk) break;
}
}
}else count+=readingPacket.size;
// To prevent memory leak, must free packet.
av_free_packet(&readingPacket);
if(j>=chunk) break;
}
// Some codecs will cause frames to be buffered up in the decoding process. If the CODEC_CAP_DELAY flag
// is set, there can be buffered up frames that need to be flushed, so we'll do that
if (codecContext->codec->capabilities & CODEC_CAP_DELAY)
{
av_init_packet(&readingPacket);
// Decode all the remaining frames in the buffer, until the end is reached
int gotFrame = 0;
int a;
int result=avcodec_decode_audio4(codecContext, frame, &gotFrame, &readingPacket);
while (result >= 0 && gotFrame)
{
// We now have a fully decoded audio frame
for(int i=0;idata[0][i];
j++;
if(j>=chunk) break;
}
if(j>=chunk) break;
}
}
// Clean up!
av_free(frame);
avcodec_close(codecContext);
avformat_close_input(&formatContext);
cout<<"Ended Reading, "<code></fstream></iostream></cstdlib>Here is the dataReader.h
/*
* File: dataReader.h
* Author: davide
*
* Created on 27 luglio 2015, 11.11
*/
#ifndef DATAREADER_H
#define DATAREADER_H
/* function that reads a file and outputs an array of samples
* @ path_name = the path of the file to read
* @ start_time = the position where to start the data reading, 0 = start
* the time is in seconds, it can hold to 10e-6 seconds
* @ lenght = the lenght of the frame to extract the data,
* 0 = read all the file (do not use with big files)
* if lenght > of file duration, it reads through the end of file.
* the time is in seconds, it can hold to 10e-6 seconds
*/
#include
class audioChunk{
public:
uint8_t *data;
unsigned int size;
int bitrate;
int getTimeLenght();
audioChunk();
};
class audioChunk_dNorm{
public:
double* data;
unsigned int size;
int bitrate;
int getTimeLenght();
void fillAudioChunk(audioChunk* cnk);
audioChunk_dNorm();
};
audioChunk readData(const char* path_name, const double start_time, const double lenght);
#endif /* DATAREADER_H */And finally there is the main.cpp of the application.
/*
* File: main.cpp
* Author: davide
*
* Created on 28 luglio 2015, 17.04
*/
#include <cstdlib>
#include "dataReader.h"
#include "transforms.h"
#include "tognuplot.h"
#include <fstream>
#include <iostream>
using namespace std;
/*
*
*/
int main(int argc, char** argv) {
audioChunk *chunk1=new audioChunk;
audioChunk_dNorm *normChunk1=new audioChunk_dNorm;
*chunk1=readData("./audio/demo-unprocessed.wav",0,1);
normChunk1->fillAudioChunk(chunk1);
ofstream file1;
file1.open("./file/2wave.txt", std::ofstream::trunc);
if(file1.is_open()) {
for(int i=0;isize;i++) {
int a=chunk1->data[i];
file1<code></iostream></fstream></cstdlib>I can’t understand why the outputs goes like this. Is it possible that the decoder can’t convert the samples (pcm_16le, 16bits) into FFMPEG AVFrame.data, that stores the samples ad uint8_t ? And if it is it is there some way to make FFMPEG work for audio files that stores samples at more than 8 bits ?
The file graph1-demo_good.jpg is how the samples should be, extracted with a working LIBSNDFILE application that I made.
EDIT : Seems like the program can’t convert the decoded data, couples of little endian bytes stored in a couple of uint8_t unsigned char, into the destination format (that i set as unsigned char[]), because it stores the bits as little-endian 16 bytes. So the data into audioChunk.data is right, but I have to read it not as an unsigned char, but as a couple of little-endian bytes.
-
Segmenting only specific parts of a video file
30 mai 2013, par Christian P.I have some video files that I wish to serve up "dynamically", given the following workflow :
- Convert video from MP4 container to segmented .ts files with accompanying .m3u8 playlist
- Delete .ts files
- On request, generate .ts files (but only those requested, not for the entire video)
I can generate .ts files for the entire video using
ffmpeg
using this commandffmpeg -y -i video.mp4 -c:a copy -bsf:a aac_adtstoasc -c:v copy -bsf:v h264_mp4toannexb -flags -global_header -map 0 -f segment -segment_time 10 -segment_list playlist.m3u8 -segment_format mpegts chunk_%03d.ts
This is what I do in step 1 and it works just fine, video is playing fine. Due to disk constraints, I do not want to have two copies of every video (the original MP4 and the segmented .ts fies), so what I am trying to achieve is to find a command that will allow me to produce only the segments I need, on a per-request basis.
Given the command above we may produce a sample playlist like this :
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:12
#EXTINF:11.261267,
chunk_000.ts
#EXTINF:11.261256,
chunk_001.ts
#EXTINF:7.507511,
chunk_002.ts
#EXTINF:11.261256,
chunk_003.ts
#EXTINF:11.261267,
chunk_004.ts
#EXTINF:7.507511,
chunk_005.tsI have tried, using the
-ss
and-t
flags available inffmpeg
, to create only a specific segments. For instance I might skip the first to segments by adding-ss 22.522523
(the total length of the two first segments), but this produces chunks that are not byte-for-byte identical to the original chunks and as such unusable (the video playback just stops). Is there a way to haveffmpeg
(or another program) reproduce the same exact chunks, without producing all of them ?Short version : If I produce a playlist with chunks of an entire video (and accompanying .ts files), can I later reproduce a specific interval of those chunks that are byte-for-byte identical to the original chunks ?