
Recherche avancée
Médias (1)
-
Revolution of Open-source and film making towards open film making
6 octobre 2011, par
Mis à jour : Juillet 2013
Langue : English
Type : Texte
Autres articles (76)
-
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 (...) -
XMP PHP
13 mai 2011, parDixit Wikipedia, XMP signifie :
Extensible Metadata Platform ou XMP est un format de métadonnées basé sur XML utilisé dans les applications PDF, de photographie et de graphisme. Il a été lancé par Adobe Systems en avril 2001 en étant intégré à la version 5.0 d’Adobe Acrobat.
Étant basé sur XML, il gère un ensemble de tags dynamiques pour l’utilisation dans le cadre du Web sémantique.
XMP permet d’enregistrer sous forme d’un document XML des informations relatives à un fichier : titre, auteur, historique (...)
Sur d’autres sites (9092)
-
errors while cmake compiling ffmpeg with custom libx265 which has opencv code in it
10 mai 2017, par Gibrani have changed libx265 with my code. now the new code dependency of opencv in it. so i changed the CMakeLists.txt of x265 source to solve it. i run exactly what i want it to do.
But when i compile it and add library as an external library in ffmpeg. ffmpeg gives the same dependency error of OpenCV like before because of this library. see the log below of ffmpeg.there is a configure file in ffmpeg i think by adding OpenCv dependency in it.
check_pkg_config x265 x265.h x265_api_get
pkg-config --exists --print-errors x265
check_func_headers x265.h x265_api_get -I/home/ryuk666/ffmpeg_build/include -L/home/ryuk666/ffmpeg_build/lib -lx265 -lstdc++ -lm -lrt -ldl
check_ld cc -I/home/ryuk666/ffmpeg_build/include -L/home/ryuk666/ffmpeg_build/lib -lx265 -lstdc++ -lm -lrt -ldl
check_cc -I/home/ryuk666/ffmpeg_build/include -L/home/ryuk666/ffmpeg_build/lib
BEGIN /tmp/ffconf.fTnjzKqn.c
1 #include
2 #include
3 long check_x265_api_get(void) { return (long) x265_api_get; }
4 int main(void) { int ret = 0;
5 ret |= ((intptr_t)check_x265_api_get) & 0xFFFF;
6 return ret; }
END /tmp/ffconf.fTnjzKqn.c
gcc -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -I/home/ryuk666/ffmpeg_build/include -std=c11 -fomit-frame-pointer -pthread -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/fribidi -I/usr/include/freetype2 -I/usr/include/freetype2 -I/usr/include/opus -I/home/ryuk666/ffmpeg_build/include -L/home/ryuk666/ffmpeg_build/lib -c -o /tmp/ffconf.OuPGoDMW.o /tmp/ffconf.fTnjzKqn.c
gcc -L/home/ryuk666/ffmpeg_build/lib -Wl,--as-needed -Wl,-z,noexecstack -I/home/ryuk666/ffmpeg_build/include -L/home/ryuk666/ffmpeg_build/lib -o /tmp/ffconf.RVzkkwqb /tmp/ffconf.OuPGoDMW.o -lx265 -lstdc++ -lm -lrt -ldl -lx264 -lpthread -lm -ldl -lvpx -lm -lpthread -lvpx -lm -lpthread -lvpx -lm -lpthread -lvpx -lm -lpthread -lvorbisenc -lvorbis -logg -ltheoraenc -ltheoradec -logg -lopus -lm -lmp3lame -lfreetype -lz -lpng12 -lz -lm -lfdk-aac -lm -lass -lm -lharfbuzz -lfontconfig -lexpat -lfreetype -lexpat -lfribidi -lfreetype -lz -lpng12 -lz -lm -lm -lz -pthread
/home/ryuk666/ffmpeg_build/lib/libx265.a(encoder.cpp.o): In function `afterMeanShift(cv::Mat&, int, std::vector >, cv::Size_<int>, std::vector >, cv::Mat, std::vector >)':
encoder.cpp:(.text+0x7abe): undefined reference to `cv::Mat::create(int, int const*, int)'
encoder.cpp:(.text+0x7ae0): undefined reference to `cv::Mat::zeros(cv::Size_<int>, int)'
encoder.cpp:(.text+0x7b17): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x7b91): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x7bad): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x7c29): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x7c45): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x7cbe): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x7d67): undefined reference to `cv::Mat::create(int, int const*, int)'
encoder.cpp:(.text+0x7d89): undefined reference to `cv::Mat::zeros(cv::Size_<int>, int)'
encoder.cpp:(.text+0x7dc0): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x7e39): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x7e55): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x7ed1): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x7eed): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x7f66): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x81bc): undefined reference to `cv::Mat::create(int, int const*, int)'
encoder.cpp:(.text+0x81de): undefined reference to `cv::Mat::zeros(cv::Size_<int>, int)'
encoder.cpp:(.text+0x8215): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x8291): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x82ad): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x8329): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x8345): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x83be): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x84aa): undefined reference to `cv::getStructuringElement(int, cv::Size_<int>, cv::Point_<int>)'
encoder.cpp:(.text+0x8598): undefined reference to `cv::morphologyEx(cv::_InputArray const&, cv::_OutputArray const&, int, cv::_InputArray const&, cv::Point_<int>, int, int, cv::Scalar_<double> const&)'
encoder.cpp:(.text+0x85e1): undefined reference to `cv::getStructuringElement(int, cv::Size_<int>, cv::Point_<int>)'
encoder.cpp:(.text+0x86c9): undefined reference to `cv::morphologyEx(cv::_InputArray const&, cv::_OutputArray const&, int, cv::_InputArray const&, cv::Point_<int>, int, int, cv::Scalar_<double> const&)'
encoder.cpp:(.text+0x8786): undefined reference to `cv::Mat::create(int, int const*, int)'
encoder.cpp:(.text+0x87a8): undefined reference to `cv::Mat::zeros(cv::Size_<int>, int)'
encoder.cpp:(.text+0x87df): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x8859): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x8875): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x88f1): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x890d): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x8986): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x89f1): undefined reference to `cv::threshold(cv::_InputArray const&, cv::_OutputArray const&, double, double, int)'
encoder.cpp:(.text+0x8cac): undefined reference to `cv::connectedComponentsWithStats(cv::_InputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, int, int)'
encoder.cpp:(.text+0x8e3f): undefined reference to `cv::compare(cv::_InputArray const&, cv::_InputArray const&, cv::_OutputArray const&, int)'
encoder.cpp:(.text+0x8e89): undefined reference to `cv::getStructuringElement(int, cv::Size_<int>, cv::Point_<int>)'
encoder.cpp:(.text+0x8f67): undefined reference to `cv::dilate(cv::_InputArray const&, cv::_OutputArray const&, cv::_InputArray const&, cv::Point_<int>, int, int, cv::Scalar_<double> const&)'
encoder.cpp:(.text+0x9031): undefined reference to `cv::Mat::copyTo(cv::_OutputArray const&) const'
encoder.cpp:(.text+0x9067): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x90f2): undefined reference to `cv::Mat::copySize(cv::Mat const&)'
encoder.cpp:(.text+0x9138): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x91b6): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x91d5): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x9255): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x9270): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x92e6): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x9305): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x9385): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x93a4): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x9425): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x9444): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x94c5): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x94e0): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x9556): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x9575): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x95f5): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x9614): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x9695): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x96b0): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x9726): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x9745): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x97c5): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0x97e4): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0x9865): undefined reference to `cv::fastFree(void*)'
/home/ryuk666/ffmpeg_build/lib/libx265.a(encoder.cpp.o): In function `meanShift2(cv::Mat, cv::Mat&, cv::Size_<int>, std::vector >&, std::vector >&, std::vector >)':
encoder.cpp:(.text+0x9a69): undefined reference to `cv::resize(cv::_InputArray const&, cv::_OutputArray const&, cv::Size_<int>, double, double, int)'
encoder.cpp:(.text+0x9b2b): undefined reference to `cv::Mat::copyTo(cv::_OutputArray const&) const'
encoder.cpp:(.text+0xa11c): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0xa191): undefined reference to `cv::Mat::deallocate()'
/home/ryuk666/ffmpeg_build/lib/libx265.a(encoder.cpp.o): In function `x265::Encoder::encode(x265_picture const*, x265_picture*)':
encoder.cpp:(.text+0xa2c3): undefined reference to `cvCreateImage'
encoder.cpp:(.text+0xa450): undefined reference to `cvSet2D'
encoder.cpp:(.text+0xa4cd): undefined reference to `cv::cvarrToMat(void const*, bool, bool, int, cv::AutoBuffer*)'
encoder.cpp:(.text+0xa5e9): undefined reference to `cv::Mat::copyTo(cv::_OutputArray const&) const'
encoder.cpp:(.text+0xa794): undefined reference to `cv::resize(cv::_InputArray const&, cv::_OutputArray const&, cv::Size_<int>, double, double, int)'
encoder.cpp:(.text+0xa86e): undefined reference to `cv::Mat::copyTo(cv::_OutputArray const&) const'
encoder.cpp:(.text+0xb1ec): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0xb262): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0xb300): undefined reference to `cv::resize(cv::_InputArray const&, cv::_OutputArray const&, cv::Size_<int>, double, double, int)'
encoder.cpp:(.text+0xb45e): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0xb4d4): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0xb565): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0xb5e0): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0xb5ff): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0xb67e): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0xb810): undefined reference to `cv::Mat::copyTo(cv::_OutputArray const&) const'
encoder.cpp:(.text+0xbad4): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0xbb3a): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0xbcd2): undefined reference to `cv::resize(cv::_InputArray const&, cv::_OutputArray const&, cv::Size_<int>, double, double, int)'
encoder.cpp:(.text+0xc01e): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0xc083): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0xc11b): undefined reference to `cv::resize(cv::_InputArray const&, cv::_OutputArray const&, cv::Size_<int>, double, double, int)'
encoder.cpp:(.text+0xc1ea): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0xc260): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0xc27b): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0xc2f1): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0xc310): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0xc38d): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0xc3ac): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0xc429): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0xc4dd): undefined reference to `cv::fastFree(void*)'
encoder.cpp:(.text+0xd5a0): undefined reference to `cv::Mat::deallocate()'
encoder.cpp:(.text+0xd6bc): undefined reference to `cv::Mat::copySize(cv::Mat const&)'
encoder.cpp:(.text+0xd7a6): undefined reference to `cv::Mat::copySize(cv::Mat const&)'
encoder.cpp:(.text+0xda4f): undefined reference to `cv::Mat::copySize(cv::Mat const&)'
collect2: error: ld returned 1 exit status
ERROR: x265 not found using pkg-config
</int></int></int></int></int></int></double></int></int></int></int></double></int></int></int></double></int></int></int></int></int></int></int> -
C++ ffmpeg and SDL2 video rendering memory leak
10 avril 2017, par kj192I have made a small program what plays a video in SDL2.0 and FFmpeg.
The software does work and do it is purpose.
I have left the software running and I have faced a huge memory consumption and started to look online what can I do against it.
I have used the following tutorials :
http://www.developersite.org/906-59411-FFMPEG
http://ardrone-ailab-u-tokyo.blogspot.co.uk/2012/07/212-ardrone-20-video-decording-ffmpeg.htmlI wonder if someone can give advice what do I do wrong. I have tried valgrind but I can’t find any information. I have did try to comment out sections and what I have seen even if I’m not rendering to the display the memory usage is growing and after delete something still not been freed up :
if (av_read_frame(pFormatCtx, &packet) >= 0)
the whole source code is here :
main :#include
#include <ios>
#include <iostream>
#include <fstream>
#include
#include <sdl2></sdl2>SDL.h>
#include "video.h"
using namespace std;
void memory()
{
using std::ios_base;
using std::ifstream;
using std::string;
double vm_usage = 0.0;
double resident_set = 0.0;
// 'file' stat seems to give the most reliable results
//
ifstream stat_stream("/proc/self/stat",ios_base::in);
// dummy vars for leading entries in stat that we don't care about
//
string pid, comm, state, ppid, pgrp, session, tty_nr;
string tpgid, flags, minflt, cminflt, majflt, cmajflt;
string utime, stime, cutime, cstime, priority, nice;
string O, itrealvalue, starttime;
// the two fields we want
//
unsigned long vsize;
long rss;
stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr
>> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt
>> utime >> stime >> cutime >> cstime >> priority >> nice
>> O >> itrealvalue >> starttime >> vsize >> rss; // don't care about the rest
stat_stream.close();
long page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024; // in case x86-64 is configured to use 2MB pages
vm_usage = vsize / 1024.0;
resident_set = rss * page_size_kb;
std::cout<<"VM: " << vm_usage << " RE:"<< resident_set << std::endl;
}
int main()
{
//This example using 1280x800 video
av_register_all();
if( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER ))
{
fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());
exit(1);
}
SDL_Window* sdlWindow = SDL_CreateWindow("Video Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1280, 800, SDL_WINDOW_OPENGL);
if( !sdlWindow )
{
fprintf(stderr, "SDL: could not set video mode - exiting\n");
exit(1);
}
SDL_Renderer* sdlRenderer = SDL_CreateRenderer(sdlWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE);
SDL_Texture* sdlTexture = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_YV12, SDL_TEXTUREACCESS_STREAMING, 1280, 800);
if(!sdlTexture)
{
return -1;
}
SDL_SetTextureBlendMode(sdlTexture,SDL_BLENDMODE_BLEND );
//VIDEO RESOLUTION
SDL_Rect sdlRect;
sdlRect.x = 0;
sdlRect.y = 0;
sdlRect.w = 1280;
sdlRect.h = 800;
memory();
for(int i = 1; i < 6; i++)
{
memory();
video* vid = new video("vid.mp4");
while (!vid -> getFinished())
{
memory();
vid -> Update(sdlTexture);
SDL_RenderCopy(sdlRenderer,sdlTexture,&sdlRect,&sdlRect);
SDL_RenderPresent(sdlRenderer);
}
delete vid;
memory();
}
SDL_DestroyTexture(sdlTexture);
SDL_DestroyRenderer(sdlRenderer);
SDL_DestroyWindow(sdlWindow);
SDL_Quit();
return 0;
}
</fstream></iostream></ios>video.cpp
#include "video.h"
video::video(const std::string& name) : _finished(false)
{
av_register_all();
pFormatCtx = NULL;
pCodecCtxOrig = NULL;
pCodecCtx = NULL;
pCodec = NULL;
pFrame = NULL;
sws_ctx = NULL;
if (avformat_open_input(&pFormatCtx, name.c_str(), NULL, NULL) != 0)
{
_finished = true; // Couldn't open file
}
// Retrieve stream information
if (avformat_find_stream_info(pFormatCtx, NULL) < 0)
{
_finished = true; // Couldn't find stream information
}
videoStream = -1;
for (i = 0; i < pFormatCtx->nb_streams; i++)
{
if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
{
videoStream = i;
break;
}
}
if (videoStream == -1)
{
_finished = true; // Didn't find a video stream
}
// Get a pointer to the codec context for the video stream
pCodecCtxOrig = pFormatCtx->streams[videoStream]->codec;
// Find the decoder for the video stream
pCodec = avcodec_find_decoder(pCodecCtxOrig->codec_id);
if (pCodec == NULL)
{
fprintf(stderr, "Unsupported codec!\n");
_finished = true; // Codec not found
}
pCodecCtx = avcodec_alloc_context3(pCodec);
if (avcodec_copy_context(pCodecCtx, pCodecCtxOrig) != 0)
{
fprintf(stderr, "Couldn't copy codec context");
_finished = true; // Error copying codec context
}
// Open codec
if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0)
{
_finished = true; // Could not open codec
}
// Allocate video frame
pFrame = av_frame_alloc();
sws_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,
pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height,
AV_PIX_FMT_YUV420P,
SWS_BILINEAR,
NULL,
NULL,
NULL);
yPlaneSz = pCodecCtx->width * pCodecCtx->height;
uvPlaneSz = pCodecCtx->width * pCodecCtx->height / 4;
yPlane = (Uint8*)malloc(yPlaneSz);
uPlane = (Uint8*)malloc(uvPlaneSz);
vPlane = (Uint8*)malloc(uvPlaneSz);
if (!yPlane || !uPlane || !vPlane)
{
fprintf(stderr, "Could not allocate pixel buffers - exiting\n");
exit(1);
}
uvPitch = pCodecCtx->width / 2;
}
void video::Update(SDL_Texture* texture)
{
if (av_read_frame(pFormatCtx, &packet) >= 0)
{
// Is this a packet from the video stream?
if (packet.stream_index == videoStream)
{
avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
// Did we get a video frame?
if (frameFinished)
{
AVPicture pict;
pict.data[0] = yPlane;
pict.data[1] = uPlane;
pict.data[2] = vPlane;
pict.linesize[0] = pCodecCtx->width;
pict.linesize[1] = uvPitch;
pict.linesize[2] = uvPitch;
// Convert the image into YUV format that SDL uses
sws_scale(sws_ctx, (uint8_t const * const *) pFrame->data,pFrame->linesize, 0, pCodecCtx->height, pict.data,pict.linesize);
SDL_UpdateYUVTexture(texture,NULL,yPlane,pCodecCtx->width,uPlane,uvPitch,vPlane,uvPitch);
}
}
// Free the packet that was allocated by av_read_frame
av_packet_unref(&packet);
av_freep(&packet);
}
else
{
av_packet_unref(&packet);
av_freep(&packet);
_finished = true;
}
}
bool video::getFinished()
{
return _finished;
}
video::~video()
{
av_packet_unref(&packet);
av_freep(&packet);
av_frame_free(&pFrame);
av_freep(&pFrame);
free(yPlane);
free(uPlane);
free(vPlane);
// Close the codec
avcodec_close(pCodecCtx);
avcodec_close(pCodecCtxOrig);
sws_freeContext(sws_ctx);
// Close the video file
for (int i = 0; i < pFormatCtx->nb_streams; i++)
{
AVStream *stream = pFormatCtx->streams[i];
avcodec_close(stream->codec);
}
avformat_close_input(&pFormatCtx);
/*av_dict_free(&optionsDict);
sws_freeContext(sws_ctx);
av_free_packet(&packet);
av_free(pFrameYUV);
av_free(buffer);
avcodec_close(pCodecCtx);
avformat_close_input(&pFormatCtx);*/
}video.h
#include <string>
#include <sdl2></sdl2>SDL.h>
#ifdef __cplusplus
extern "C" {
#endif
#include <libavcodec></libavcodec>avcodec.h>
#include <libavformat></libavformat>avformat.h>
#include <libswscale></libswscale>swscale.h>
#ifdef __cplusplus
}
#endif
class video
{
private:
bool _finished;
AVFormatContext *pFormatCtx;
int videoStream;
unsigned i;
AVCodecContext *pCodecCtxOrig;
AVCodecContext *pCodecCtx;
AVCodec *pCodec;
AVFrame *pFrame;
AVPacket packet;
int frameFinished;
struct SwsContext *sws_ctx;
Uint8 *yPlane, *uPlane, *vPlane;
size_t yPlaneSz, uvPlaneSz;
int uvPitch;
public:
video(const std::string& name);
~video();
void Update(SDL_Texture* texture);
bool getFinished();
};
</string>I’m looking forward to your answers
-
Playing Mp3 file using FFmpeg on Android
2 avril 2017, par satyresThis question has been asked a lot but no code has worked for me . i’ve been able to play a file decoded with ffmpeg on Android but it’s noisy and glitchy.
i’ve found code in book called "linux sound programming" using latest ffmpeg version to decode an mp3 file.
the code tries to decode an mp3 file to pcm and then put it in a file called output.
what i want to do is to get the byte decoded on the fly and send them to AudioTrack in Java.void JNICALL Java_com_example_home_hellondk_MainActivity_loadFile
(JNIEnv* env, jobject obj,jstring file,jbyteArray array)
{
jboolean isfilenameCopy;
const char * filename = (*env)->GetStringUTFChars(env, file,
&isfilenameCopy);
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID play = (*env)->GetMethodID(env, cls, "playSound", "([BI)V");
AVCodec *codec;
AVCodecContext *c= NULL;
int len;
FILE *f, *outfile;
uint8_t inbuf[AUDIO_INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
AVPacket avpkt;
AVFrame *decoded_frame = NULL;
AVFormatContext* container=NULL;
av_init_packet(&avpkt);
int num_streams = 0;
int sample_size = 0;
printf("Decode audio file %s \n", filename);
LOGE("Decode audio file %s\n", filename);
/* find the MPEG audio decoder */
/* codec = avcodec_find_decoder(AV_CODEC_ID_MP3);
if (!codec) {
fprintf(stderr, "Codec not found\n");
LOGE("Codec not found\n");
exit(1);
}*/
int lError;
if ((lError = avformat_open_input(&container, filename, NULL, NULL))
!= 0) {
LOGE("Error open source file: %d", lError);
exit(1);
}
if ((lError = avformat_find_stream_info(container,NULL)) < 0) {
LOGE("Error find stream information: %d", lError);
exit(1);
}
LOGE("Stage 1.5");
LOGE("audio format: %s", container->iformat->name);
LOGE("audio bitrate: %llu", container->bit_rate);
int stream_id = -1;
// To find the first audio stream. This process may not be necessary
// if you can gurarantee that the container contains only the desired
// audio stream
LOGE("nb_streams: %d", container->nb_streams);
int i;
for (i = 0; i < container->nb_streams; i++) {
if (container->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
stream_id = i;
LOGE("stream_id: %d", stream_id);
break;
}
}
AVCodecContext* codec_context = container->streams[stream_id]->codec;
codec = avcodec_find_decoder(codec_context->codec_id);
LOGE("stream_id: %d", stream_id);
LOGE("codec %s", codec->name);
if (!codec) {
fprintf(stderr, "codec not found\n");
exit(1);
}
c = avcodec_alloc_context3(codec);
if (!c) {
fprintf(stderr, "Could not allocate audio codec context\n");
LOGE("Could not allocate audio codec context\n");
exit(1);
}
/* open it */
if (avcodec_open2(c, codec, NULL) < 0) {
fprintf(stderr, "Could not open codec\n");
LOGE("Could not open codec\n");
exit(1);
}
f = fopen(filename, "rb");
if (!f) {
fprintf(stderr, "Could not open %s\n", filename);
LOGE("Could not open %s\n",filename);
exit(1);
}
const char *outfilename;
outfile = fopen(outfilename, "wb");
if (!outfile) {
av_free(c);
exit(1);
}
avpkt.data = inbuf;
avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
LOGE("Stage 5");
/* decode until eof */
while (avpkt.size > 0) {
int got_frame = 0;
if (!decoded_frame) {
if (!(decoded_frame = av_frame_alloc())) {
fprintf(stderr, "out of memory\n");
exit(1);
}
} else {
av_frame_unref(decoded_frame);
}
printf("Stream idx %d\n", avpkt.stream_index);
len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt);
if (len < 0) {
fprintf(stderr, "Error while decoding\n");
exit(1);
}
if (got_frame) {
printf("Decoded frame nb_samples %d, format %d\n",
decoded_frame->nb_samples,
decoded_frame->format);
if (decoded_frame->data[1] != NULL)
printf("Data[1] not null\n");
else
printf("Data[1] is null\n");
/* if a frame has been decoded, output it */
int data_size = av_samples_get_buffer_size(NULL, c->channels,
decoded_frame->nb_samples,
c->sample_fmt, 1);
// first time: count the number of planar streams
if (num_streams == 0) {
while (num_streams < AV_NUM_DATA_POINTERS &&
decoded_frame->data[num_streams] != NULL)
num_streams++;
printf("Number of streams %d\n", num_streams);
}
// first time: set sample_size from 0 to e.g 2 for 16-bit data
if (sample_size == 0) {
sample_size =
data_size / (num_streams * decoded_frame->nb_samples);
}
int m, n;
for (n = 0; n < decoded_frame->nb_samples; n++) {
// interleave the samples from the planar streams
for (m = 0; m < num_streams; m++) {
fwrite(&decoded_frame->data[m][n*sample_size],
1, sample_size, outfile);
}
}
/* jbyte *bytes = (*env)->GetByteArrayElements(env, array, NULL);
memcpy(bytes, decoded_frame->data[1], data_size);
(*env)->ReleaseByteArrayElements(env, array, bytes, 0);
(*env)->CallVoidMethod(env, obj, play, array, data_size);
*/
}
avpkt.size -= len;
avpkt.data += len;
if (avpkt.size < AUDIO_REFILL_THRESH) {
/* Refill the input buffer, to avoid trying to decode
* incomplete frames. Instead of this, one could also use
* a parser, or use a proper container format through
* libavformat. */
memmove(inbuf, avpkt.data, avpkt.size);
avpkt.data = inbuf;
len = fread(avpkt.data + avpkt.size, 1,
AUDIO_INBUF_SIZE - avpkt.size, f);
if (len > 0)
avpkt.size += len;
}
}
fclose(f);
avcodec_free_context(&c);
av_frame_free(&decoded_frame);
}the decoded bytes are in this section
fwrite(&decoded_frame->data[m][n*sample_size], 1, sample_size, outfile);
the code that let you send bytes to java is this :
jbyte *bytes = (*env)->GetByteArrayElements(env, array, NULL);
memcpy(bytes, decoded_frame->data[0], data_size);
(*env)->ReleaseByteArrayElements(env, array, bytes, 0);
(*env)->CallVoidMethod(env, obj, play, array, data_size);i’ve been working on it now for more than a week and nothing worked for me.
Thank you in advance for your help