
Recherche avancée
Autres articles (65)
-
HTML5 audio and video support
13 avril 2011, parMediaSPIP uses HTML5 video and audio tags to play multimedia files, taking advantage of the latest W3C innovations supported by modern browsers.
The MediaSPIP player used has been created specifically for MediaSPIP and can be easily adapted to fit in with a specific theme.
For older browsers the Flowplayer flash fallback is used.
MediaSPIP allows for media playback on major mobile platforms with the above (...) -
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 -
MediaSPIP Core : La Configuration
9 novembre 2010, parMediaSPIP Core fournit par défaut trois pages différentes de configuration (ces pages utilisent le plugin de configuration CFG pour fonctionner) : une page spécifique à la configuration générale du squelettes ; une page spécifique à la configuration de la page d’accueil du site ; une page spécifique à la configuration des secteurs ;
Il fournit également une page supplémentaire qui n’apparait que lorsque certains plugins sont activés permettant de contrôler l’affichage et les fonctionnalités spécifiques (...)
Sur d’autres sites (8449)
-
Paid Advertising Performance – target the right customers and invest confidently
-
cmake installation of x265 for ffmpeg on Cygwin - executable location different from other codecs
6 mai, par bballdave025TL ;DR (with expected vs. real)


For a Cygwin build of
ffmpeg
, I'm installingx265
, and it seems to me that the executable ends up in the wrong place. I'll show some basic directory structure, then I'll show thetree
outputs for expected and real, both before and after thecmake
installation. For directories where I think this is important, I'll show the outputs before and after thecmake
installation.

My question has two parts. I used the following
cmake
andmake
commands,

# pwd => $HOME/programs/ffmpeg/ffmpeg_sources/x265/build/linux
PATH="$HOME/programs/ffmpeg/bin:$PATH" \
 cmake -G "Unix Makefiles" \
 -DCMAKE_INSTALL_PREFIX="$HOME/programs/ffmpeg/ffmpeg_build" \
 -DENABLE_SHARED=OFF \
 -DCMAKE_EXE_LINKER_FLAGS="-static" 
 ../../source
PATH="$HOME/programs/ffmpeg/bin:$PATH" make -j $(nproc)
make install



The result is below, with my real vs. expected, and there is a more detailed, more explicit, and hopefully more clear file with the info.
at pastebin.com/86wHrtxR.

Edit : I've made a copy of the detailed/explicit/clear file on my GitHub as a gist. This should be more secure. (The Pastebin version still exists, in case that is your preference.)


Now, for my two-part question :


- 

-
How can I change my
cmake
command so that myx265.exe
file ends up in$HOME/programs/ffmpeg/bin
with the proper linking, rather than$HOME/programs/ffmpeg/ffmpeg_build/bin
?

-
Would the build/linker/whatever figure things out for the
ffmpeg
build ?







I want to know the answer to question number 1 regardless of the answer to question number 2. I haven't used
cmake
with the-DVAR=var
flags before, and I'd like to take this opportunity to learn.

For the result :


Things surrounded by double curly brackets are
{{ expected }}
.

Things surrounded by double angle brackets are
<< real >>
, i.e. they exist after the installation is done.

If real matches expected, and the file/directory is new, I've surrounded it by double parentheses, i.e. double round brackets.
(( match ))


If something is not new (and thus has the same before and after) I haven't marked it.


me@MACHINE ~/programs/ffmpeg
 $ tree --charset=ascii bin
 bin
 |-- lame.exe
 |-- mp3rtp.exe
 |-- mp3x.exe
 `-- x264.exe
{{ `-- x265.exe }} ## Expected, not Exists

 me@MACHINE ~/programs/ffmpeg
 $ tree --charset=ascii \
 ffmpeg_build
 ffmpeg_build
<< |-- bin >> ## Not expected, Exists
<< | `-- x265.exe >> ## Not expected, Exists
 |-- include
 | |-- fdk-aac
 | | |-- aacdecoder_lib.h
 | | |-- aacenc_lib.h
 | | `-- ... <more files="files">
 | |-- lame
 | | `-- lame.h
 | |-- x264.h
 | `-- x264_config.h
(( | |-- x265.h )) ## Expected and Exists
(( | `-- x265_config.h )) ## Expected and Exists
 |-- lib
 | |-- libfdk-aac.a
 | |-- libfdk-aac.la
 | |-- libmp3lame.a
 | |-- libmp3lame.la
(( | |-- libx265.a )) ## Expected and Exists
 | `-- pkgconfig
 | |-- fdk-aac.pc
 | `-- x264.pc
(( | `-- x265.pc )) ## Expected and Exists
 `-- share
 |-- doc
 | ... <only lame="lame">
 `-- man
 ... <only lame="lame">
</only></only></more>


Other, possibly useful information about the build directory structure.


me@MACHINE ~/programs/ffmpeg
$ tree --charset=ascii -L 1 .
.
|-- bin
|-- ffmpeg_build
`-- ffmpeg_sources

3 directories, 0 files



For this next,
ffmpeg_sources
dir, I'm showing the after (which is both expected and real/exists) surrounded by double parentheses, i.e. double round brackets,(( <after> ))</after>
.

me@MACHINE ~/programs/ffmpeg
 $ tree --charset=ascii -L 1 ffmpeg_sources
 ffmpeg_sources
 |-- fdk-aac.zip
 |-- lame-svn
 |-- mstorsjo-fdk-aac-e7d8591
 |-- x264-snapshot-20191217-2245
 |-- x264-snapshot-20191217-2245.tar.bz2
 `-- x264-snapshot-20191218-README.txt
(( `-- x265 ))

 3 directories, 3 files
(( 4 directories, 3 files ))




NOW, FOR SOME MORE DETAIL



What I'm Doing


I am working on a Cygwin build (vs. a Windows/mingw build) of
ffmpeg
. I am following an older guide by koohiimaster (archived). That guide says,



[W]e are not cross-compiling for windows ; we are compiling for Cygwin.




This 2014 guide doesn't have all of the codecs I want - I want as complete a build as possible - so I've also been referring to this ffmpeg-for-Ubuntu guide (archived), which I hope is kept up-to-date. It's referred to by koohiimaster.


Also, as a way of checking that I'm getting all the codecs I want, I've been looking at this FFmpeg for Windows guide from SuperUser


I'll give the basics of my steps below.
More details, as well as all the output is at pastebin.com/suL1nU6Z.

Edit : I've put the log of terminal input/output for all my steps into a gist at my GitHub as this seems safer than Pastebin.


A look at directory structure for the build


me@MACHINE ~/programs/ffmpeg
$ cd $HOME/programs/ffmpeg

me@MACHINE ~/programs/ffmpeg
$ tree --charset=ascii -d -L 1
.
|-- bin
|-- ffmpeg_build
`-- ffmpeg_sources

3 directories



Getting the source. Note that I had to
apt-cyg install mercurial
, though (with my Cygwin setup GUI/EXE in my Cygwin root directory, i.e.C:\cygwin64\setup-x86_64.exe
), I could also have done/setup-x86_64.exe install -q -P mercurial
.

cd ffmpeg_sources
hg clone https://bitbucket.org/multicoreware/x265



Running the
cmake
andmake
commands

cd x265/build/linux
PATH="$HOME/programs/ffmpeg/bin:$PATH" \
 cmake -G "Unix Makefiles" \
 -DCMAKE_INSTALL_PREFIX="$HOME/programs/ffmpeg/ffmpeg_build" \
 -DENABLE_SHARED=OFF \
 -DCMAKE_EXE_LINKER_FLAGS="-static" \
 ../../source
PATH="$HOME/programs/ffmpeg/bin:$PATH" make -j $(nproc)
make install



It was the last part (actually the very last line) of the
make install
output that worried me. Here is the whole output - it's not very long.

make[1]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
[ 20%] Built target encoder
make[2]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
[ 83%] Built target common
make[2]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
[ 84%] Built target x265-static
make[2]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
[100%] Built target cli
make[1]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
Install the project...
-- Install configuration: "Release"
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/lib/libx265.a
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/include/x265.h
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/include/x265_config.h
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/lib/pkgconfig/x265.pc
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/bin/x265.exe



As discussed in the TL ;DR section, I expected to see
x265.exe
at

home/me/programs/ffmpeg/bin/x265.exe


rather than the path given on the last line of output,


/home/me/programs/ffmpeg/ffmpeg_build/bin/x265.exe


This worries me especially because the first part of the
ffmpeg
install command that my instructions inform me to run is

PATH="$HOME/programs/ffmpeg/bin:$PATH" \
PKG_CONFIG_PATH="$HOME/programs/ffmpeg/ffmpeg_build/lib/pkgconfig" \
 ./configure \
 --prefix="$HOME/programs/ffmpeg/ffmpeg_build" \
 --extra-cflags="-I$HOME/programs/ffmpeg/ffmpeg_build/include" \
 --extra-ldflags="-L$HOME/programs/ffmpeg/ffmpeg_build/lib" \
 --bindir="$HOME/programs/ffmpeg/bin" \



... and on it goes ...


It would seem to me that the
.configure
script forffmpeg
won't find thex265
executable, since it's not in thebindir
.

I'll repeat my two-part question from before :


- 

- How can I change my
cmake
command so that myx265.exe
file ends up in$HOME/programs/ffmpeg/bin
with the proper linking, rather than$HOME/programs/ffmpeg/ffmpeg_build/bin
?




What I'm looking for here is something akin to the
--bindir
flag frommake
's./confiure
.

- 

- Would the build/linker/whatever figure things out for the
ffmpeg
build ?




I want to know the answer to question number 1 regardless of the answer to question number 2. I haven't used
cmake
with the-DVAR=var
flags before, and I'd like to take this opportunity to learn.


Where I've Looked & What I've Tried


I first started with the
man
page and the--help
forcmake
. That was scary. I was hoping that I'd find something useful around theCMAKE_INSTALL_PREFIX
stuff, but I wasn't sure what to make of it.

I tried
grep
ing throughcmake --help-full
(with 50 lines before and after whatever I was searching for), but got tripped up by the complexity. I've only used basiccmake
stuff, before, and I got more than a little lost.

Even with the
--help
, I don't know if I need to look at thehelp-manual
, thehelp-command
, thehelp-module
, thehelp-policy
, thehelp-variable
, or something else.

It seemed to me, in reading, that a "binary directory" is the top of the "build", whereas I thought it would be the dir named
bin
... I couldn't tell what things were meant to be used by the person creating the package rather than by me, who am trying to make/build the package from the command line.

I looked through what seemed to be a
cmake
wiki's Useful Variables page (archived), as well as at this thread at cmake.org (archived), which, along with this SO source and this and this and this and this SO sources, seemed to suggest using theCMAKE_RUNTIME_OUTPUT_DIRECTORY
variable (since theEXECUTABLE_OUTPUT-DIRECTORY
variable has been superseded by it). By the way, I couldn't tell which things should be used by the creator of the package vs. the consumer of the package - the consumer being me. I tried with

PATH="$HOME/programs/ffmpeg/bin:$PATH" \
 cmake -G "Unix Makefiles" \
 -DCMAKE_INSTALL_PREFIX="$HOME/programs/ffmpeg/ffmpeg_build" \
 -DCMAKE_RUNTIME_OUTPUT_DIRECTORY="$HOME/programs/ffmpeg/bin" \
 -DENABLE_SHARED=OFF \
 -DCMAKE_EXE_LINKER_FLAGS="-static" 
 ../../source
PATH="$HOME/



and have thought about fifty-or-so other -DVAR variables, but with any I have tried, I still get the same result. I still get the executable in what seems to be the wrong place.



System Details


$ date && date +'%s'
Tue, May 5, 2020 11:14:40 AM
1588698880
$ uname -a
CYGWIN_NT-10.0 MACHINE 3.1.4(0.340/5/3) 2020-02-19 08:49 x86_64 Cygwin
$ cmake --version
cmake version 3.14.5

CMake suite maintained and supported by Kitware (kitware.com/cmake).
$ bash --version | head -n 1
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin)
$ gcc --version | head -n 1
gcc (GCC) 9.3.0
$ g++ --version | head -n 1
g++ (GCC) 9.3.0
$ make --version | head -n 2
GNU Make 4.3
Built for x86_64-pc-cygwin



-
-
FFmpeg Opus choppy sound UPDATED DESCRIPTION
2 juin 2020, par easy_breezyI'm using FFmpeg and try to encode and decode a raw PCM sound to Opus using a built-in FFmpeg "opus" codec. My input samples are raw PCM 8000 Hz 16 bit mono, in AV_SAMPLE_FMT_S16 format. Since Opus requires sample format AV_SAMPLE_FMT_FLTP and sample rate 48000 Hz only, so I resample my samples before encode them.



I have two instances of
ResamplerAudio
class that does the work of resampling audio samples and has a member ofSwrContext
, I use the first instance ofResamplerAudio
for resampling a raw PCM input audio before encoding and the second for resampling decoded audio to get it's format and sample rate the same as source values of input raw audio.


ResamplerAudio class has a function that init it's SwrContext member like this :



void ResamplerAudio::init(AVCodecContext *codecContext, int inSampleRate, int outSampleRate, AVSampleFormat inSampleFmt, AVSampleFormat outSampleFmt)
{
 swrContext = swr_alloc();
 if (!swrContext)
 {
 LOGE(TAG, "[init] Couldn't allocate swr context");
 return;
 }

 av_opt_set_int(swrContext, "in_channel_layout", (int64_t) codecContext->channel_layout, 0);
 av_opt_set_int(swrContext, "out_channel_layout", (int64_t) codecContext->channel_layout, 0);

 av_opt_set_int(swrContext, "in_channel_count", codecContext->channels, 0);
 av_opt_set_int(swrContext, "out_channel_count", codecContext->channels, 0);

 av_opt_set_int(swrContext, "in_sample_rate", inSampleRate, 0);
 av_opt_set_int(swrContext, "out_sample_rate", outSampleRate, 0);

 av_opt_set_sample_fmt(swrContext, "in_sample_fmt", inSampleFmt, 0);
 av_opt_set_sample_fmt(swrContext, "out_sample_fmt", outSampleFmt, 0);

 int ret = swr_init(swrContext);
 if (ret < 0)
 {
 LOGE(TAG, "[init] swr_init error: %s", av_err2str(ret));
 return;
 }

 LOGD(TAG, "[init] success codecContext->channel_layout: %d; inSampleRate: %d; outSampleRate: %d; inSampleFmt: %d; outSampleFmt: %d", (int) codecContext->channel_layout, inSampleRate, outSampleRate, inSampleFmt, outSampleFmt);
}




And I call
ResamplerAudio::init
function for the first instance ofResamplerAudio
(this instance do resamping a raw PCM input audio before encoding and I called itresamplerEncoder
) with the following args :


resamplerEncoder->init(contextEncoder, 8000, 48000, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP);




The second instance of
ResamplerAudio
(this instance do resamping after decoding audio from Opus and I called itresamplerDecoder
) I init with the following args :


resamplerDecoder->init(contextDecoder, 48000, 8000, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16);




The function of
ResamplerAudio
that does resampling looks like this :


std::vector ResamplerAudio::convert(uint8_t **inData, int inSamplesCount, int outChannels, int outFormat)
{
 std::vector result;
 uint8_t *dstData = NULL;
 const int dstNbSamples = swr_get_out_samples(swrContext, inSamplesCount);
 av_samples_alloc(&dstData, NULL, outChannels, dstNbSamples, AVSampleFormat(outFormat), 1);
 int resampledSize = swr_convert(swrContext, &dstData, dstNbSamples, (const uint8_t **)inData, inSamplesCount);
 int dstBufSize = av_samples_get_buffer_size(NULL, outChannels, resampledSize, AVSampleFormat(outFormat), 1);

 if (dstBufSize <= 0) return result;

 std::copy(&dstData[0], &dstData[dstBufSize], std::back_inserter(result));

 return result;
}




And I call
ResamplerAudio::convert
function before encoding with the following args :


// data - an array of raw pcm audio
// dataLength - the length of data array
// getSamplesCount() - function that calculates samples count
// frameEncode - AVFrame that using for encode audio
std::vector resampledData = resamplerEncoder->convert(&data, getSamplesCount(dataLength, frameEncode->channels, AV_SAMPLE_FMT_S16), frameEncode->channels, frameEncode->format);




getSamplesCount()
function looks like this :


getSamplesCount(int bytesCount, int channels, AVSampleFormat format)
{
 return bytesCount / av_get_bytes_per_sample(format) / channels;
}




After that I fill my
frameEncode
with resampled samples :


memcpy(&frame->data[0][0], &resampledData[0], sizeof(uint8_t) * resampledDataLength);




And pass
frameEncode
to encoding like thisencodeFrame(resampledDataLength)
:


void encodeFrame(int dataLength)
{
 /* send the frame for encoding */
 int ret = avcodec_send_frame(contextEncoder, frameEncode);
 if (ret < 0)
 {
 LOGE(TAG, "[encodeFrame] avcodec_send_frame error: %s", av_err2str(ret));
 return;
 }

 /* read all the available output packets (in general there may be any number of them */
 while (ret >= 0)
 {
 ret = avcodec_receive_packet(contextEncoder, packetEncode);
 if (ret < 0 && ret != AVERROR(EAGAIN)) LOGE(TAG, "[encodeFrame] error in avcodec_receive_packet: %s", av_err2str(ret));
 if (ret < 0) break;

 // encodedData - std::vector that stores encoded data
 std::copy(&packetEncode->data[0], &packetEncode->data[dataLength], std::back_inserter(encodedData));
 av_packet_unref(packetEncode);
 }
}




Then I decode my encoded samples and do resampling to get back them in source sample format and sample rate so I call
ResamplerAudio::convert
function forresamplerDecoder
with the following args :


// frameDecode - AVFrame that holds decoded audio
std::vector resampledData = resamplerDecoder->convert(frameDecode->data, frameDecode->nb_samples, frameDecode->channels, AV_SAMPLE_FMT_S16);




And result sound is choppy and I also noticed that the decoded array size is bigger than the source array size with raw pcm audio.



Please any ideas what I'm doing wrong ?



UPD 18.05.2020



I tested my resampling logic, I did resampling of raw pcm sound without any encoding and decoding routines. First I tried to convert the sample rate of input sound from 8000 Hz to 48000 Hz than I took resampled samples from step above and convert it's sample rate from 48000 Hz to 8000 Hz and the result sound is perfect and clean, also I did the same steps but I converted not a sample rate but a sample format from AV_SAMPLE_FMT_S16 to AV_SAMPLE_FMT_FLTP and vice versa and again the result sound is perfect and clean, also I got the same result when I coverted both a sample rate and a sample format.
So I assume that the problem of distorted and choppy sound is in my encoding or decoding routine, I think most likely in decoding routine because after decoding I ALWAYS get AVFrame with 960 nb_samples despite what was the size of input sound.



My decoding routine looks like this :



std::vector decode(uint8_t *data, unsigned int dataLength)
{
 decodedData.clear();

 int dataSize = dataLength;

 while (dataSize > 0)
 {
 if (!frameDecode)
 {
 frameDecode = av_frame_alloc();
 if (!frameDecode)
 {
 LOGE(TAG, "[decode] Couldn't allocate the frame");
 return EMPTY_DATA;
 }
 }

 ret = av_parser_parse2(parser, contextDecoder, &packetDecode->data, &packetDecode->size, &data[0], dataSize, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
 if (ret < 0) {
 LOGE(TAG, "[decode] av_parser_parse2 error: %s", av_err2str(ret));
 return EMPTY_DATA;
 }

 data += ret;
 dataSize -= ret;

 doDecode();
 }
 return decodedData;
}

void doDecode()
{
 if (packetDecode->size) {
 /* send the packet with the compressed data to the decoder */
 int ret = avcodec_send_packet(contextDecoder, packetDecode);
 if (ret < 0) LOGE(TAG, "[decode] avcodec_send_packet error: %s", av_err2str(ret));

 /* read all the output frames (in general there may be any number of them */
 while (ret >= 0)
 {
 ret = avcodec_receive_frame(contextDecoder, frameDecode);
 if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) LOGE(TAG, "[decode] avcodec_receive_frame error: %s", av_err2str(ret));
 if (ret < 0) break;

 std::vector resampledData = resamplerDecoder->convert(frameDecode->data, frameDecode->nb_samples, frameDecode->channels, AV_SAMPLE_FMT_S16);
 if (!resampledData.size()) continue;
 std::copy(&resampledData.data()[0], &resampledData.data()[resampledData.size()], std::back_inserter(decodedData));
 }
 }
}




UPD 30.05.2020



I decided to refuse to use FFmpeg in my project and use libopus 1.3.1 instead, so I made a wrapper around it and it works fine.