
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 (63)
-
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 (...) -
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 -
Les autorisations surchargées par les plugins
27 avril 2010, parMediaspip core
autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs
Sur d’autres sites (10578)
-
FFMPEG android is processing slow
23 novembre 2015, par jpcI’m using https://github.com/WritingMinds/ffmpeg-android-java as my framework for FFMPEG
I’m trying to convert an image to a video using this command
ffmpeg -y -loop 1 -i input.jpg -strict -2 -vcodec mpeg4 -t 5 -pix_fmt yuv420p out.mp4
It took about 32 seconds to finish the process which is very slow for my requirements.
Is there a way to speed this up ? I’m thinking of something around 5 seconds, perhaps approximately equal to the specified length of the video
here’s the log btw
11-23 12:12:13.587 4228-4228/com.lo.and.dev W/com.lo.and.util: WARNING: linker: /data/data/com.lo.and.dev/files/ffmpeg has text relocations. This is wasting memory and prevents security hardening. Please fix.
11-23 12:12:13.607 4228-4228/com.lo.and.dev W/com.lo.and.util: ffmpeg version n2.4.2 Copyright (c) 2000-2014 the FFmpeg developers
11-23 12:12:13.607 4228-4228/com.lo.and.dev W/com.lo.and.util: built on Oct 7 2014 15:08:46 with gcc 4.8 (GCC)
11-23 12:12:13.607 4228-4228/com.lo.and.dev W/com.lo.and.util: configuration: --target-os=linux --cross-prefix=/home/sb/Source-Code/ffmpeg-android/toolchain-android/bin/arm-linux-androideabi- --arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/home/sb/Source-Code/ffmpeg-android/toolchain-android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi --enable-fontconfig --enable-pthreads --disable-debug --disable-ffserver --enable-version3 --enable-hardcoded-tables --disable-ffplay --disable-ffprobe --enable-gpl --enable-yasm --disable-doc --disable-shared --enable-static --pkg-config=/home/sb/Source-Code/ffmpeg-android/ffmpeg-pkg-config --prefix=/home/sb/Source-Code/ffmpeg-android/build/armeabi-v7a-neon --extra-cflags='-I/home/sb/Source-Code/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all -mfpu=neon' --extra-ldflags='-L/home/sb/Source-Code/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,-z,now -pie' --extra-libs='-lpng -lexpat -lm' --extra-cxxflags=
11-23 12:12:13.607 4228-4228/com.lo.and.dev W/com.lo.and.util: libavutil 54. 7.100 / 54. 7.100
11-23 12:12:13.607 4228-4228/com.lo.and.dev W/com.lo.and.util: libavcodec 56. 1.100 / 56. 1.100
11-23 12:12:13.607 4228-4228/com.lo.and.dev W/com.lo.and.util: libavformat 56. 4.101 / 56. 4.101
11-23 12:12:13.607 4228-4228/com.lo.and.dev W/com.lo.and.util: libavdevice 56. 0.100 / 56. 0.100
11-23 12:12:13.607 4228-4228/com.lo.and.dev W/com.lo.and.util: libavfilter 5. 1.100 / 5. 1.100
11-23 12:12:13.617 4228-4228/com.lo.and.dev W/com.lo.and.util: libswscale 3. 0.100 / 3. 0.100
11-23 12:12:13.617 4228-4228/com.lo.and.dev W/com.lo.and.util: libswresample 1. 1.100 / 1. 1.100
11-23 12:12:13.617 4228-4228/com.lo.and.dev W/com.lo.and.util: libpostproc 53. 0.100 / 53. 0.100
11-23 12:12:13.707 4228-4228/com.lo.and.dev W/com.lo.and.util: Input #0, image2, from '/storage/emulated/0/DCIM/Camera/20151122_172809.jpg':
11-23 12:12:13.707 4228-4228/com.lo.and.dev W/com.lo.and.util: Duration: 00:00:00.04, start: 0.000000, bitrate: 95165 kb/s
11-23 12:12:13.717 4228-4228/com.lo.and.dev W/com.lo.and.util: Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
11-23 12:12:13.727 4228-4228/com.lo.and.dev W/com.lo.and.util: [swscaler @ 0xb5d89000] deprecated pixel format used, make sure you did set range correctly
11-23 12:12:13.777 4228-4228/com.lo.and.dev W/com.lo.and.util: Output #0, mp4, to '/storage/emulated/0/DCIM/out.mp4':
11-23 12:12:13.777 4228-4228/com.lo.and.dev W/com.lo.and.util: Metadata:
11-23 12:12:13.777 4228-4228/com.lo.and.dev W/com.lo.and.util: encoder : Lavf56.4.101
11-23 12:12:13.777 4228-4228/com.lo.and.dev W/com.lo.and.util: Stream #0:0: Video: mpeg4 ( [0][0][0] / 0x0020), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 12800 tbn, 25 tbc
11-23 12:12:13.777 4228-4228/com.lo.and.dev W/com.lo.and.util: Metadata:
11-23 12:12:13.777 4228-4228/com.lo.and.dev W/com.lo.and.util: encoder : Lavc56.1.100 mpeg4
11-23 12:12:13.777 4228-4228/com.lo.and.dev W/com.lo.and.util: Stream mapping:
11-23 12:12:13.777 4228-4228/com.lo.and.dev W/com.lo.and.util: Stream #0:0 -> #0:0 (mjpeg (native) -> mpeg4 (native))
11-23 12:12:13.777 4228-4228/com.lo.and.dev W/com.lo.and.util: Press [q] to stop, [?] for help
11-23 12:12:14.707 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 3 fps=0.0 q=2.0 size= 343kB time=00:00:00.12 bitrate=23400.5kbits/s
11-23 12:12:15.247 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 5 fps=4.2 q=4.9 size= 345kB time=00:00:00.20 bitrate=14125.9kbits/s
11-23 12:12:15.737 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 7 fps=4.0 q=10.2 size= 347kB time=00:00:00.28 bitrate=10149.8kbits/s
11-23 12:12:16.467 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 10 fps=4.1 q=18.9 size= 350kB time=00:00:00.40 bitrate=7167.7kbits/s
11-23 12:12:17.037 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 12 fps=4.0 q=24.8 size= 352kB time=00:00:00.48 bitrate=6007.9kbits/s
11-23 12:12:17.567 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 14 fps=3.9 q=27.8 size= 403kB time=00:00:00.56 bitrate=5893.7kbits/s
11-23 12:12:18.337 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 17 fps=4.0 q=31.0 size= 406kB time=00:00:00.68 bitrate=4891.5kbits/s
11-23 12:12:18.847 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 19 fps=3.9 q=31.0 size= 408kB time=00:00:00.76 bitrate=4398.6kbits/s
11-23 12:12:19.607 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 22 fps=3.9 q=31.0 size= 411kB time=00:00:00.88 bitrate=3827.4kbits/s
11-23 12:12:20.107 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 24 fps=3.9 q=31.0 size= 413kB time=00:00:00.96 bitrate=3525.9kbits/s
11-23 12:12:20.637 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 26 fps=3.9 q=31.0 size= 460kB time=00:00:01.04 bitrate=3624.3kbits/s
11-23 12:12:21.157 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 28 fps=3.9 q=31.0 size= 462kB time=00:00:01.12 bitrate=3381.1kbits/s
11-23 12:12:21.667 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 30 fps=3.9 q=31.0 size= 464kB time=00:00:01.20 bitrate=3169.7kbits/s
11-23 12:12:22.167 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 32 fps=3.9 q=31.0 size= 466kB time=00:00:01.28 bitrate=2984.6kbits/s
11-23 12:12:22.897 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 35 fps=3.9 q=31.0 size= 469kB time=00:00:01.40 bitrate=2746.8kbits/s
11-23 12:12:23.657 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 38 fps=3.9 q=31.0 size= 517kB time=00:00:01.52 bitrate=2788.3kbits/s
11-23 12:12:24.387 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 41 fps=4.0 q=31.0 size= 521kB time=00:00:01.64 bitrate=2600.1kbits/s
11-23 12:12:24.887 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 43 fps=3.9 q=31.0 size= 523kB time=00:00:01.72 bitrate=2488.9kbits/s
11-23 12:12:25.417 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 45 fps=3.9 q=31.0 size= 525kB time=00:00:01.80 bitrate=2387.6kbits/s
11-23 12:12:25.967 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 47 fps=3.9 q=31.0 size= 527kB time=00:00:01.88 bitrate=2294.9kbits/s
11-23 12:12:26.477 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 49 fps=3.9 q=24.8 size= 572kB time=00:00:01.96 bitrate=2390.0kbits/s
11-23 12:12:27.297 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 52 fps=3.9 q=31.0 size= 577kB time=00:00:02.08 bitrate=2271.5kbits/s
11-23 12:12:27.987 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 55 fps=3.9 q=31.0 size= 580kB time=00:00:02.20 bitrate=2159.1kbits/s
11-23 12:12:28.737 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 58 fps=3.9 q=31.0 size= 583kB time=00:00:02.32 bitrate=2058.2kbits/s
11-23 12:12:29.247 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 60 fps=3.9 q=31.0 size= 585kB time=00:00:02.40 bitrate=1996.6kbits/s
11-23 12:12:30.017 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 63 fps=3.9 q=31.0 size= 633kB time=00:00:02.52 bitrate=2057.7kbits/s
11-23 12:12:30.557 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 65 fps=3.9 q=31.0 size= 635kB time=00:00:02.60 bitrate=2000.8kbits/s
11-23 12:12:31.057 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 67 fps=3.9 q=31.0 size= 637kB time=00:00:02.68 bitrate=1947.4kbits/s
11-23 12:12:31.627 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 69 fps=3.9 q=31.0 size= 639kB time=00:00:02.76 bitrate=1897.0kbits/s
11-23 12:12:32.167 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 71 fps=3.9 q=31.0 size= 641kB time=00:00:02.84 bitrate=1849.5kbits/s
11-23 12:12:32.927 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 74 fps=3.9 q=31.0 size= 689kB time=00:00:02.96 bitrate=1907.2kbits/s
11-23 12:12:33.407 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 76 fps=3.9 q=31.0 size= 691kB time=00:00:03.04 bitrate=1862.8kbits/s
11-23 12:12:34.157 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 79 fps=3.9 q=31.0 size= 694kB time=00:00:03.16 bitrate=1800.0kbits/s
11-23 12:12:34.657 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 81 fps=3.9 q=31.0 size= 696kB time=00:00:03.24 bitrate=1760.7kbits/s
11-23 12:12:35.217 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 83 fps=3.9 q=31.0 size= 698kB time=00:00:03.32 bitrate=1723.3kbits/s
11-23 12:12:35.777 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 85 fps=3.9 q=24.8 size= 744kB time=00:00:03.40 bitrate=1791.6kbits/s
11-23 12:12:36.297 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 87 fps=3.9 q=31.0 size= 747kB time=00:00:03.48 bitrate=1759.6kbits/s
11-23 12:12:36.827 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 89 fps=3.9 q=31.0 size= 750kB time=00:00:03.56 bitrate=1724.8kbits/s
11-23 12:12:37.547 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 92 fps=3.9 q=31.0 size= 753kB time=00:00:03.68 bitrate=1675.4kbits/s
11-23 12:12:38.297 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 95 fps=3.9 q=31.0 size= 756kB time=00:00:03.80 bitrate=1629.1kbits/s
11-23 12:12:38.797 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 97 fps=3.9 q=24.8 size= 801kB time=00:00:03.88 bitrate=1690.8kbits/s
11-23 12:12:39.547 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 100 fps=3.9 q=31.0 size= 806kB time=00:00:04.00 bitrate=1650.2kbits/s
11-23 12:12:40.047 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 102 fps=3.9 q=31.0 size= 808kB time=00:00:04.08 bitrate=1621.9kbits/s
11-23 12:12:40.807 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 105 fps=3.9 q=31.0 size= 811kB time=00:00:04.20 bitrate=1581.6kbits/s
11-23 12:12:41.267 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 107 fps=3.9 q=31.0 size= 813kB time=00:00:04.28 bitrate=1555.9kbits/s
11-23 12:12:42.057 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 110 fps=3.9 q=31.0 size= 861kB time=00:00:04.40 bitrate=1602.8kbits/s
11-23 12:12:42.557 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 112 fps=3.9 q=31.0 size= 863kB time=00:00:04.48 bitrate=1578.1kbits/s
11-23 12:12:43.307 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 115 fps=3.9 q=31.0 size= 866kB time=00:00:04.60 bitrate=1542.4kbits/s
11-23 12:12:43.817 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 117 fps=3.9 q=31.0 size= 868kB time=00:00:04.68 bitrate=1519.6kbits/s
11-23 12:12:44.517 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 120 fps=3.9 q=31.0 size= 871kB time=00:00:04.80 bitrate=1486.8kbits/s
11-23 12:12:45.277 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 123 fps=3.9 q=31.0 size= 919kB time=00:00:04.92 bitrate=1530.6kbits/s
11-23 12:12:45.987 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 125 fps=3.9 q=31.0 size= 921kB time=00:00:05.00 bitrate=1509.4kbits/s
11-23 12:12:45.987 4228-4228/com.lo.and.dev W/com.lo.and.util: frame= 125 fps=3.9 q=31.0 Lsize= 923kB time=00:00:05.00 bitrate=1511.6kbits/s
11-23 12:12:45.987 4228-4228/com.lo.and.dev W/com.lo.and.util: video:921kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.148301% -
RTSP relay using ffmpeg library
23 novembre 2015, par kiran_gI am implementing an RTSP relay using libavcodec (ffmpeg). Basically, it connects to an IP camera, which is an RTSP server, PULLs the stream and then PUSHes it to wowza. I am finding it very difficult to get any sample implementation for this in the internet. So I started implementing this using bits and pieces from here and there. I took code for code samples to a) read RTSP stream and write to file b)read from file and serve it over RTSP.
This is the current state of the code :
/*
* Copyright (c) 2010 Nicolas George
* Copyright (c) 2011 Stefano Sabatini
* Copyright (c) 2014 Andrey Utkin
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/**
* @file
* API example for demuxing, decoding, filtering, encoding and muxing
* @example transcoding.c
*/
#include <libavcodec></libavcodec>avcodec.h>
#include <libavformat></libavformat>avformat.h>
#include <libavfilter></libavfilter>avfiltergraph.h>
#include <libavfilter></libavfilter>buffersink.h>
#include <libavfilter></libavfilter>buffersrc.h>
#include <libavutil></libavutil>opt.h>
#include <libavutil></libavutil>pixdesc.h>
static AVFormatContext *ifmt_ctx,*temp;
static AVFormatContext *ofmt_ctx;
typedef struct FilteringContext {
AVFilterContext *buffersink_ctx;
AVFilterContext *buffersrc_ctx;
AVFilterGraph *filter_graph;
} FilteringContext;
static FilteringContext *filter_ctx;
static int open_input_file(const char *filename)
{
int ret;
unsigned int i;
ifmt_ctx = NULL;
if ((ret = avformat_open_input(&ifmt_ctx, filename, NULL, NULL)) < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
return ret;
}
if ((ret = avformat_find_stream_info(ifmt_ctx, NULL)) < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n");
return ret;
}
for (i = 0; i < ifmt_ctx->nb_streams; i++) {
AVStream *stream;
AVCodecContext *codec_ctx;
stream = ifmt_ctx->streams[i];
codec_ctx = stream->codec;
/* Reencode video & audio and remux subtitles etc. */
if (codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO
|| codec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
/* Open decoder */
ret = avcodec_open2(codec_ctx,
avcodec_find_decoder(codec_ctx->codec_id), NULL);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Failed to open decoder for stream #%u\n", i);
return ret;
}
}
}
av_dump_format(ifmt_ctx, 0, filename, 0);
return 0;
}
static int open_output_file(const char *filename)
{
AVStream *out_stream;
AVStream *in_stream;
AVCodecContext *dec_ctx, *enc_ctx;
AVCodec *encoder,*codec;
int ret;
unsigned int i;
ofmt_ctx = NULL;
avformat_open_input(&temp, "rtsp://localhost:8554/live", NULL, NULL);
avformat_alloc_output_context2(&ofmt_ctx, temp->oformat,"rtsp", filename);
if (!ofmt_ctx) {
av_log(NULL, AV_LOG_ERROR, "Could not create output context\n");
return AVERROR_UNKNOWN;
}
for (i = 0; i < ifmt_ctx->nb_streams; i++) {
out_stream = avformat_new_stream(ofmt_ctx, NULL);
if (!out_stream) {
av_log(NULL, AV_LOG_ERROR, "Failed allocating output stream\n");
return AVERROR_UNKNOWN;
}
in_stream = ifmt_ctx->streams[i];
dec_ctx = in_stream->codec;
enc_ctx = out_stream->codec;
if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO
|| dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
/* in this example, we choose transcoding to same codec */
encoder = avcodec_find_encoder(dec_ctx->codec_id);
printf("codec : %d",dec_ctx->codec_id);
if (!encoder) {
av_log(NULL, AV_LOG_FATAL, "Necessary encoder not found\n");
return AVERROR_INVALIDDATA;
}
/* In this example, we transcode to same properties (picture size,
* sample rate etc.). These properties can be changed for output
* streams easily using filters */
if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
enc_ctx->height = dec_ctx->height;
enc_ctx->width = dec_ctx->width;
enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;
/* take first format from list of supported formats */
enc_ctx->pix_fmt = encoder->pix_fmts[0];
//enc_ctx->codec_id = AV_CODEC_ID_H264;
/* video time_base can be set to whatever is handy and supported by encoder */
enc_ctx->time_base = dec_ctx->time_base;
} else {
enc_ctx->sample_rate = dec_ctx->sample_rate;
enc_ctx->channel_layout = dec_ctx->channel_layout;
enc_ctx->channels = av_get_channel_layout_nb_channels(enc_ctx->channel_layout);
/* take first format from list of supported formats */
enc_ctx->sample_fmt = encoder->sample_fmts[0];
enc_ctx->pix_fmt =AV_PIX_FMT_RGB24 ;
enc_ctx->time_base = (AVRational){1, enc_ctx->sample_rate};
}
/* Third parameter can be used to pass settings to encoder */
//codec = avcodec_find_encoder(AV_CODEC_ID_H264);
ret = avcodec_open2(enc_ctx, encoder, NULL);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot open video encoder for stream #%u\n", i);
return ret;
}
} else if (dec_ctx->codec_type == AVMEDIA_TYPE_UNKNOWN) {
av_log(NULL, AV_LOG_FATAL, "Elementary stream #%d is of unknown type, cannot proceed\n", i);
return AVERROR_INVALIDDATA;
} else {
/* if this stream must be remuxed */
ret = avcodec_copy_context(ofmt_ctx->streams[i]->codec,
ifmt_ctx->streams[i]->codec);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Copying stream context failed\n");
return ret;
}
}
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
}
av_dump_format(ofmt_ctx, 0, filename, 1);
if (!(ofmt_ctx->oformat->flags & AVFMT_NOFILE)) {
ret = avio_open(&ofmt_ctx->pb, filename, AVIO_FLAG_WRITE);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Could not open output file '%s'", filename);
return ret;
}
}
/* init muxer, write output file header */
ret = avformat_write_header(ofmt_ctx, NULL);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Error occurred when opening output file\n");
return ret;
}
return 0;
}
static int init_filter(FilteringContext* fctx, AVCodecContext *dec_ctx,
AVCodecContext *enc_ctx, const char *filter_spec)
{
char args[512];
int ret = 0;
AVFilter *buffersrc = NULL;
AVFilter *buffersink = NULL;
AVFilterContext *buffersrc_ctx = NULL;
AVFilterContext *buffersink_ctx = NULL;
AVFilterInOut *outputs = avfilter_inout_alloc();
AVFilterInOut *inputs = avfilter_inout_alloc();
AVFilterGraph *filter_graph = avfilter_graph_alloc();
if (!outputs || !inputs || !filter_graph) {
ret = AVERROR(ENOMEM);
goto end;
}
if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
buffersrc = avfilter_get_by_name("buffer");
buffersink = avfilter_get_by_name("buffersink");
if (!buffersrc || !buffersink) {
av_log(NULL, AV_LOG_ERROR, "filtering source or sink element not found\n");
ret = AVERROR_UNKNOWN;
goto end;
}
snprintf(args, sizeof(args),
"video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
dec_ctx->time_base.num, dec_ctx->time_base.den,
dec_ctx->sample_aspect_ratio.num,
dec_ctx->sample_aspect_ratio.den);
ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
args, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create buffer source\n");
goto end;
}
ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
NULL, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create buffer sink\n");
goto end;
}
ret = av_opt_set_bin(buffersink_ctx, "pix_fmts",
(uint8_t*)&enc_ctx->pix_fmt, sizeof(enc_ctx->pix_fmt),
AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output pixel format\n");
goto end;
}
} else if (dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
buffersrc = avfilter_get_by_name("abuffer");
buffersink = avfilter_get_by_name("abuffersink");
if (!buffersrc || !buffersink) {
av_log(NULL, AV_LOG_ERROR, "filtering source or sink element not found\n");
ret = AVERROR_UNKNOWN;
goto end;
}
if (!dec_ctx->channel_layout)
dec_ctx->channel_layout =
av_get_default_channel_layout(dec_ctx->channels);
snprintf(args, sizeof(args),
"time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=0x%"PRIx64,
dec_ctx->time_base.num, dec_ctx->time_base.den, dec_ctx->sample_rate,
av_get_sample_fmt_name(dec_ctx->sample_fmt),
dec_ctx->channel_layout);
ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
args, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer source\n");
goto end;
}
ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
NULL, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer sink\n");
goto end;
}
ret = av_opt_set_bin(buffersink_ctx, "sample_fmts",
(uint8_t*)&enc_ctx->sample_fmt, sizeof(enc_ctx->sample_fmt),
AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output sample format\n");
goto end;
}
ret = av_opt_set_bin(buffersink_ctx, "channel_layouts",
(uint8_t*)&enc_ctx->channel_layout,
sizeof(enc_ctx->channel_layout), AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output channel layout\n");
goto end;
}
ret = av_opt_set_bin(buffersink_ctx, "sample_rates",
(uint8_t*)&enc_ctx->sample_rate, sizeof(enc_ctx->sample_rate),
AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output sample rate\n");
goto end;
}
} else {
ret = AVERROR_UNKNOWN;
goto end;
}
/* Endpoints for the filter graph. */
outputs->name = av_strdup("in");
outputs->filter_ctx = buffersrc_ctx;
outputs->pad_idx = 0;
outputs->next = NULL;
inputs->name = av_strdup("out");
inputs->filter_ctx = buffersink_ctx;
inputs->pad_idx = 0;
inputs->next = NULL;
if (!outputs->name || !inputs->name) {
ret = AVERROR(ENOMEM);
goto end;
}
if ((ret = avfilter_graph_parse_ptr(filter_graph, filter_spec,
&inputs, &outputs, NULL)) < 0)
goto end;
if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0)
goto end;
/* Fill FilteringContext */
fctx->buffersrc_ctx = buffersrc_ctx;
fctx->buffersink_ctx = buffersink_ctx;
fctx->filter_graph = filter_graph;
end:
avfilter_inout_free(&inputs);
avfilter_inout_free(&outputs);
return ret;
}
static int init_filters(void)
{
const char *filter_spec;
unsigned int i;
int ret;
filter_ctx = av_malloc_array(ifmt_ctx->nb_streams, sizeof(*filter_ctx));
if (!filter_ctx)
return AVERROR(ENOMEM);
for (i = 0; i < ifmt_ctx->nb_streams; i++) {
filter_ctx[i].buffersrc_ctx = NULL;
filter_ctx[i].buffersink_ctx = NULL;
filter_ctx[i].filter_graph = NULL;
if (!(ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO
|| ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO))
continue;
if (ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
filter_spec = "null"; /* passthrough (dummy) filter for video */
else
filter_spec = "anull"; /* passthrough (dummy) filter for audio */
ret = init_filter(&filter_ctx[i], ifmt_ctx->streams[i]->codec,
ofmt_ctx->streams[i]->codec, filter_spec);
if (ret)
return ret;
}
return 0;
}
static int encode_write_frame(AVFrame *filt_frame, unsigned int stream_index, int *got_frame) {
int ret;
int got_frame_local;
AVPacket enc_pkt;
int (*enc_func)(AVCodecContext *, AVPacket *, const AVFrame *, int *) =
(ifmt_ctx->streams[stream_index]->codec->codec_type ==
AVMEDIA_TYPE_VIDEO) ? avcodec_encode_video2 : avcodec_encode_audio2;
if (!got_frame)
got_frame = &got_frame_local;
av_log(NULL, AV_LOG_INFO, "Encoding frame\n");
/* encode filtered frame */
enc_pkt.data = NULL;
enc_pkt.size = 0;
av_init_packet(&enc_pkt);
ret = enc_func(ofmt_ctx->streams[stream_index]->codec, &enc_pkt,
filt_frame, got_frame);
av_frame_free(&filt_frame);
if (ret < 0)
return ret;
if (!(*got_frame))
return 0;
/* prepare packet for muxing */
enc_pkt.stream_index = stream_index;
av_packet_rescale_ts(&enc_pkt,
ofmt_ctx->streams[stream_index]->codec->time_base,
ofmt_ctx->streams[stream_index]->time_base);
av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");
/* mux encoded frame */
ret = av_interleaved_write_frame(ofmt_ctx, &enc_pkt);
return ret;
}
static int filter_encode_write_frame(AVFrame *frame, unsigned int stream_index)
{
int ret;
AVFrame *filt_frame;
av_log(NULL, AV_LOG_INFO, "Pushing decoded frame to filters\n");
/* push the decoded frame into the filtergraph */
ret = av_buffersrc_add_frame_flags(filter_ctx[stream_index].buffersrc_ctx,
frame, 0);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n");
return ret;
}
/* pull filtered frames from the filtergraph */
while (1) {
filt_frame = av_frame_alloc();
if (!filt_frame) {
ret = AVERROR(ENOMEM);
break;
}
av_log(NULL, AV_LOG_INFO, "Pulling filtered frame from filters\n");
ret = av_buffersink_get_frame(filter_ctx[stream_index].buffersink_ctx,
filt_frame);
if (ret < 0) {
/* if no more frames for output - returns AVERROR(EAGAIN)
* if flushed and no more frames for output - returns AVERROR_EOF
* rewrite retcode to 0 to show it as normal procedure completion
*/
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
ret = 0;
av_frame_free(&filt_frame);
break;
}
filt_frame->pict_type = AV_PICTURE_TYPE_NONE;
ret = encode_write_frame(filt_frame, stream_index, NULL);
if (ret < 0)
break;
}
return ret;
}
static int flush_encoder(unsigned int stream_index)
{
int ret;
int got_frame;
if (!(ofmt_ctx->streams[stream_index]->codec->codec->capabilities &
AV_CODEC_CAP_DELAY))
return 0;
while (1) {
av_log(NULL, AV_LOG_INFO, "Flushing stream #%u encoder\n", stream_index);
ret = encode_write_frame(NULL, stream_index, &got_frame);
if (ret < 0)
break;
if (!got_frame)
return 0;
}
return ret;
}
int main(int argc, char **argv)
{
int ret;
AVPacket packet = { .data = NULL, .size = 0 };
AVFrame *frame = NULL;
enum AVMediaType type;
unsigned int stream_index;
unsigned int i;
int got_frame;
int (*dec_func)(AVCodecContext *, AVFrame *, int *, const AVPacket *);
if (argc != 3) {
av_log(NULL, AV_LOG_ERROR, "Usage: %s <input file="file" /> <output file="file">\n", argv[0]);
return 1;
}
av_register_all();
avfilter_register_all();
avformat_network_init();
if ((ret = open_input_file(argv[1])) < 0)
goto end;
if ((ret = open_output_file(argv[2])) < 0)
goto end;
if ((ret = init_filters()) < 0)
goto end;
/* read all packets */
while (1) {
if ((ret = av_read_frame(ifmt_ctx, &packet)) < 0)
break;
stream_index = packet.stream_index;
type = ifmt_ctx->streams[packet.stream_index]->codec->codec_type;
av_log(NULL, AV_LOG_DEBUG, "Demuxer gave frame of stream_index %u\n",
stream_index);
if (filter_ctx[stream_index].filter_graph) {
av_log(NULL, AV_LOG_DEBUG, "Going to reencode&filter the frame\n");
frame = av_frame_alloc();
if (!frame) {
ret = AVERROR(ENOMEM);
break;
}
av_packet_rescale_ts(&packet,
ifmt_ctx->streams[stream_index]->time_base,
ifmt_ctx->streams[stream_index]->codec->time_base);
dec_func = (type == AVMEDIA_TYPE_VIDEO) ? avcodec_decode_video2 :
avcodec_decode_audio4;
ret = dec_func(ifmt_ctx->streams[stream_index]->codec, frame,
&got_frame, &packet);
if (ret < 0) {
av_frame_free(&frame);
av_log(NULL, AV_LOG_ERROR, "Decoding failed\n");
break;
}
if (got_frame) {
frame->pts = av_frame_get_best_effort_timestamp(frame);
ret = filter_encode_write_frame(frame, stream_index);
av_frame_free(&frame);
if (ret < 0)
goto end;
} else {
av_frame_free(&frame);
}
} else {
/* remux this frame without reencoding */
av_packet_rescale_ts(&packet,
ifmt_ctx->streams[stream_index]->time_base,
ofmt_ctx->streams[stream_index]->time_base);
ret = av_interleaved_write_frame(ofmt_ctx, &packet);
if (ret < 0)
goto end;
}
av_packet_unref(&packet);
}
/* flush filters and encoders */
for (i = 0; i < ifmt_ctx->nb_streams; i++) {
/* flush filter */
if (!filter_ctx[i].filter_graph)
continue;
ret = filter_encode_write_frame(NULL, i);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Flushing filter failed\n");
goto end;
}
/* flush encoder */
ret = flush_encoder(i);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Flushing encoder failed\n");
goto end;
}
}
av_write_trailer(ofmt_ctx);
end:
av_packet_unref(&packet);
av_frame_free(&frame);
for (i = 0; i < ifmt_ctx->nb_streams; i++) {
avcodec_close(ifmt_ctx->streams[i]->codec);
if (ofmt_ctx && ofmt_ctx->nb_streams > i && ofmt_ctx->streams[i] && ofmt_ctx->streams[i]->codec)
avcodec_close(ofmt_ctx->streams[i]->codec);
if (filter_ctx && filter_ctx[i].filter_graph)
avfilter_graph_free(&filter_ctx[i].filter_graph);
}
av_free(filter_ctx);
avformat_close_input(&ifmt_ctx);
if (ofmt_ctx && !(ofmt_ctx->oformat->flags & AVFMT_NOFILE))
avio_closep(&ofmt_ctx->pb);
avformat_free_context(ofmt_ctx);
if (ret < 0)
av_log(NULL, AV_LOG_ERROR, "Error occurred: %s\n", av_err2str(ret));
return ret ? 1 : 0;
}
</output>When we run this we are getting this error :
Input #0, rtsp, from 'rtsp://localhost:8554/live':
Metadata:
title : Unnamed
comment : N/A
Duration: N/A, start: 5294.642467, bitrate: N/A
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 30 fps, 30 tbr, 90k tbn, 60 tbc
[libx264 @ 0xe87c80] Specified pixel format -1 is invalid or not supported
Cannot open video encoder for stream #0
codec : 28 and pix :12
Error occurred: Invalid argumentBut I could see that the correct pixel format macro "AV_PIX_FMT_YUV420P" is provided.
UPDATE 1 :
This is the section in ffmpeg where the error is thrown from(utils.c line 1547) :if (avctx->codec->pix_fmts) {
for (i = 0; avctx->codec->pix_fmts[i] != AV_PIX_FMT_NONE; i++)
if (avctx->pix_fmt == avctx->codec->pix_fmts[i])
break;
if (avctx->codec->pix_fmts[i] == AV_PIX_FMT_NONE
&& !((avctx->codec_id == AV_CODEC_ID_MJPEG || avctx->codec_id == AV_CODEC_ID_LJPEG)
&& avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL)) {
char buf[128];
snprintf(buf, sizeof(buf), "%d", avctx->pix_fmt);
av_log(avctx, AV_LOG_ERROR, "Specified pixel format %s is invalid or not supported\n",
(char *)av_x_if_null(av_get_pix_fmt_name(avctx->pix_fmt), buf));
ret = AVERROR(EINVAL);
goto free_and_end;
}Can someone suggest a solution for this.
Thanks
-
Issue in recording video
16 novembre 2015, par human123I am trying to record video in 480*480 resolution like in vine using javacv. As a starting point I used the sample provided in https://github.com/bytedeco/javacv/blob/master/samples/RecordActivity.java Video is getting recorded (but not in the desired resolution) and saved.
But the issue is that 480*480 resolution is not supported natively in android. So some pre processing needs to be done to get the video in desired resolution.
So once I was able to record video using code sample provided by javacv, next challenge was on how to pre process the video. On research it was found that efficient cropping is possible when final image width required is same as recorded image width. Such a solution was provided in the SO question,Recording video on Android using JavaCV (Updated 2014 02 17). I changed onPreviewFrame method as suggested in that answer.
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (audioRecord == null || audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
startTime = System.currentTimeMillis();
return;
}
if (RECORD_LENGTH > 0) {
int i = imagesIndex++ % images.length;
yuvImage = images[i];
timestamps[i] = 1000 * (System.currentTimeMillis() - startTime);
}
/* get video data */
imageWidth = 640;
imageHeight = 480
int finalImageHeight = 360;
if (yuvImage != null && recording) {
ByteBuffer bb = (ByteBuffer)yuvImage.image[0].position(0); // resets the buffer
final int startY = imageWidth*(imageHeight-finalImageHeight)/2;
final int lenY = imageWidth*finalImageHeight;
bb.put(data, startY, lenY);
final int startVU = imageWidth*imageHeight + imageWidth*(imageHeight-finalImageHeight)/4;
final int lenVU = imageWidth* finalImageHeight/2;
bb.put(data, startVU, lenVU);
try {
long t = 1000 * (System.currentTimeMillis() - startTime);
if (t > recorder.getTimestamp()) {
recorder.setTimestamp(t);
}
recorder.record(yuvImage);
} catch (FFmpegFrameRecorder.Exception e) {
Log.e(LOG_TAG, "problem with recorder():", e);
}
}
}
}Please also note that this solution was provided for an older version of javacv. The resulting video had a yellowish overlay covering 2/3rd part. Also there was empty section on left side as the video was not cropped correctly.
So my question is what is the most appropriate solution for cropping videos using latest version of javacv ?
Code after making change as suggested by Alex Cohn
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (audioRecord == null || audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
startTime = System.currentTimeMillis();
return;
}
if (RECORD_LENGTH > 0) {
int i = imagesIndex++ % images.length;
yuvImage = images[i];
timestamps[i] = 1000 * (System.currentTimeMillis() - startTime);
}
/* get video data */
imageWidth = 640;
imageHeight = 480;
destWidth = 480;
if (yuvImage != null && recording) {
ByteBuffer bb = (ByteBuffer)yuvImage.image[0].position(0); // resets the buffer
int start = 2*((imageWidth-destWidth)/4); // this must be even
for (int row=0; row2; row++) {
bb.put(data, start, destWidth);
start += imageWidth;
}
try {
long t = 1000 * (System.currentTimeMillis() - startTime);
if (t > recorder.getTimestamp()) {
recorder.setTimestamp(t);
}
recorder.record(yuvImage);
} catch (FFmpegFrameRecorder.Exception e) {
Log.e(LOG_TAG, "problem with recorder():", e);
}
}
}Screen shot from video generated with this code (destWidth 480) is
Next I tried capturing a video with destWidth speciified as 639. The result is
When destWidth is 639 video is repeating contents twice. When it is 480, contents are repeated 5 times and the green overlay and distortion is more.
Also When the destWidth = imageWidth, video is captured properly. ie, for 640*480 there is no repetition of video contents and no green overlay.
Converting frame to IplImage
When this question was asked first, I missed to mention that the record method in FFmpegFrameRecorder is now accepting object of type Frame whereas earlier it was IplImage object. So I tried to apply Alex Cohn’s solution by converting Frame to IplImage.
//---------------------------------------
// initialize ffmpeg_recorder
//---------------------------------------
private void initRecorder() {
Log.w(LOG_TAG,"init recorder");
imageWidth = 640;
imageHeight = 480;
if (RECORD_LENGTH > 0) {
imagesIndex = 0;
images = new Frame[RECORD_LENGTH * frameRate];
timestamps = new long[images.length];
for (int i = 0; i < images.length; i++) {
images[i] = new Frame(imageWidth, imageHeight, Frame.DEPTH_UBYTE, 2);
timestamps[i] = -1;
}
} else if (yuvImage == null) {
yuvImage = new Frame(imageWidth, imageHeight, Frame.DEPTH_UBYTE, 2);
Log.i(LOG_TAG, "create yuvImage");
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
yuvIplimage = converter.convert(yuvImage);
}
Log.i(LOG_TAG, "ffmpeg_url: " + ffmpeg_link);
recorder = new FFmpegFrameRecorder(ffmpeg_link, imageWidth, imageHeight, 1);
recorder.setFormat("flv");
recorder.setSampleRate(sampleAudioRateInHz);
// Set in the surface changed method
recorder.setFrameRate(frameRate);
Log.i(LOG_TAG, "recorder initialize success");
audioRecordRunnable = new AudioRecordRunnable();
audioThread = new Thread(audioRecordRunnable);
runAudioThread = true;
}
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (audioRecord == null || audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
startTime = System.currentTimeMillis();
return;
}
if (RECORD_LENGTH > 0) {
int i = imagesIndex++ % images.length;
yuvImage = images[i];
timestamps[i] = 1000 * (System.currentTimeMillis() - startTime);
}
/* get video data */
int destWidth = 640;
if (yuvIplimage != null && recording) {
ByteBuffer bb = yuvIplimage.getByteBuffer(); // resets the buffer
int start = 2*((imageWidth-destWidth)/4); // this must be even
for (int row=0; row2; row++) {
bb.put(data, start, destWidth);
start += imageWidth;
}
try {
long t = 1000 * (System.currentTimeMillis() - startTime);
if (t > recorder.getTimestamp()) {
recorder.setTimestamp(t);
}
recorder.record(yuvImage);
} catch (FFmpegFrameRecorder.Exception e) {
Log.e(LOG_TAG, "problem with recorder():", e);
}
}
}But the videos generated with this method contained only green frames.