
Recherche avancée
Médias (2)
-
Valkaama DVD Label
4 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Image
-
Podcasting Legal guide
16 mai 2011, par
Mis à jour : Mai 2011
Langue : English
Type : Texte
Autres articles (31)
-
ANNEXE : Les plugins utilisés spécifiquement pour la ferme
5 mars 2010, parLe site central/maître de la ferme a besoin d’utiliser plusieurs plugins supplémentaires vis à vis des canaux pour son bon fonctionnement. le plugin Gestion de la mutualisation ; le plugin inscription3 pour gérer les inscriptions et les demandes de création d’instance de mutualisation dès l’inscription des utilisateurs ; le plugin verifier qui fournit une API de vérification des champs (utilisé par inscription3) ; le plugin champs extras v2 nécessité par inscription3 (...)
-
Encoding and processing into web-friendly formats
13 avril 2011, parMediaSPIP automatically converts uploaded files to internet-compatible formats.
Video files are encoded in MP4, Ogv and WebM (supported by HTML5) and MP4 (supported by Flash).
Audio files are encoded in MP3 and Ogg (supported by HTML5) and MP3 (supported by Flash).
Where possible, text is analyzed in order to retrieve the data needed for search engine detection, and then exported as a series of image files.
All uploaded files are stored online in their original format, so you can (...) -
L’utiliser, en parler, le critiquer
10 avril 2011La première attitude à adopter est d’en parler, soit directement avec les personnes impliquées dans son développement, soit autour de vous pour convaincre de nouvelles personnes à l’utiliser.
Plus la communauté sera nombreuse et plus les évolutions seront rapides ...
Une liste de discussion est disponible pour tout échange entre utilisateurs.
Sur d’autres sites (5904)
-
when i record video with javacv it comes "java.lang.NoClassDefFoundError : org.bytedeco.javacpp.avutil"
9 avril 2020, par Pradeep SimbaI make a video recorder android app with javacv.
But, when i run this app this error occurs "java.lang.NoClassDefFoundError : org.bytedeco.javacpp.avutil".



How can I solve this error ?



gradle.build file



android {
 ..............
 packagingOptions {
 exclude 'META-INF/services/javax.annotation.processing.Processor'
 pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.properties'
 pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.xml'
 pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.properties'
 pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.xml'
 }
}

dependencies {

implementation group: 'org.bytedeco', name: 'javacv', version: '1.1'
implementation group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.0.0-1.1', classifier: 'android-arm'
implementation group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.8.1-1.1', classifier: 'android-arm'
implementation group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.0.0-1.1', classifier: 'android-x86'
implementation group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.8.1-1.1', classifier: 'android-x86'

}




My demo code VideoService which will invoke in MainActivity



package com.fs.fs.api;

import com.fs.fs.App;
import com.fs.fs.utils.DateUtils;
import com.fs.fs.utils.FileUtils;

import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.FrameRecorder;

import java.util.Date;

/**
 * Created by wyx on 2017/1/11.
 */
public class VideoService {
 private FFmpegFrameRecorder mFrameRecorder;
 private String path;

 private VideoService() {
 }

 private static class SingletonHolder {
 private static final VideoService INSTANCE = new VideoService();
 }

 public static VideoService getInstance() {
 return SingletonHolder.INSTANCE;
 }

 public void startRecordVideo() {
 String fileName = String.format("%s.%s", DateUtils.date2String(new Date(), "yyyyMMdd_HHmmss"), "mp4");
 path = FileUtils.getExternalFullPath(App.getInstance(), fileName);
 mFrameRecorder = new FFmpegFrameRecorder(path, 640, 480, 1);
 mFrameRecorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
 mFrameRecorder.setVideoOption("tune", "zerolatency");
 mFrameRecorder.setVideoOption("preset", "ultrafast");
 mFrameRecorder.setVideoOption("crf", "28");
 mFrameRecorder.setVideoBitrate(300 * 1000);
 mFrameRecorder.setFormat("mp4");

 mFrameRecorder.setFrameRate(30);
 mFrameRecorder.setAudioOption("crf", "0");
 mFrameRecorder.setSampleRate(48 * 1000);
 mFrameRecorder.setAudioBitrate(960 * 1000);
 mFrameRecorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
 try {
 mFrameRecorder.start();
 } catch (FrameRecorder.Exception e) {
 e.printStackTrace();
 }
 }

 public void stop() {
 if (mFrameRecorder != null) {
 try {
 mFrameRecorder.stop();
 mFrameRecorder.release();
 } catch (FrameRecorder.Exception e) {
 e.printStackTrace();
 }
 mFrameRecorder = null;
 }
 }

}




MainActivity



package com.fs.fs.activity;

import android.app.Activity;
import android.os.Bundle;

import com.fs.fs.R;
import com.fs.fs.api.VideoService;

import static java.lang.Thread.sleep;


public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);


 VideoService.getInstance().startRecordVideo();
 try {
 sleep(10 * 1000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 VideoService.getInstance().stop();
 }
}




Error



E/AndroidRuntime: FATAL EXCEPTION: main
 Process: com.example.usb, PID: 660
 java.lang.NoClassDefFoundError: org.bytedeco.javacpp.avutil
 at org.bytedeco.javacpp.Loader.load(Loader.java:590)
 at org.bytedeco.javacpp.Loader.load(Loader.java:530)
 at org.bytedeco.javacpp.avcodec$AVPacket.<clinit>(avcodec.java:1694)
 at org.bytedeco.javacv.FFmpegFrameRecorder.<init>(FFmpegFrameRecorder.java:149)
 at com.fs.fs.api.VideoService.startRecordVideo(VideoService.java:34)
 at com.fs.fs.activity.MainActivity.onCreate(MainActivity.java:75)
 at android.app.Activity.performCreate(Activity.java:5304)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2245)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2331)
 at android.app.ActivityThread.access$1000(ActivityThread.java:143)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:136)
 at android.app.ActivityThread.main(ActivityThread.java:5291)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:515)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
 at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.ClassNotFoundException: org.bytedeco.javacpp.avutil
 at java.lang.Class.classForName(Native Method)
 at java.lang.Class.forName(Class.java:251)
 at org.bytedeco.javacpp.Loader.load(Loader.java:585)
 at org.bytedeco.javacpp.Loader.load(Loader.java:530) 
 at org.bytedeco.javacpp.avcodec$AVPacket.<clinit>(avcodec.java:1694) 
 at org.bytedeco.javacv.FFmpegFrameRecorder.<init>(FFmpegFrameRecorder.java:149) 
 at com.fs.fs.api.VideoService.startRecordVideo(VideoService.java:34) 
 at com.fs.fs.activity.MainActivity.onCreate(MainActivity.java:75) 
 at android.app.Activity.performCreate(Activity.java:5304) 
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090) 
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2245) 
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2331) 
 at android.app.ActivityThread.access$1000(ActivityThread.java:143) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244) 
 at android.os.Handler.dispatchMessage(Handler.java:102) 
 at android.os.Looper.loop(Looper.java:136) 
 at android.app.ActivityThread.main(ActivityThread.java:5291) 
 at java.lang.reflect.Method.invokeNative(Native Method) 
 at java.lang.reflect.Method.invoke(Method.java:515) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 
 at dalvik.system.NativeStart.main(Native Method) 
 Caused by: java.lang.NoClassDefFoundError: org/bytedeco/javacpp/avutil
 at java.lang.Class.classForName(Native Method) 
 at java.lang.Class.forName(Class.java:251) 
 at org.bytedeco.javacpp.Loader.load(Loader.java:585) 
 at org.bytedeco.javacpp.Loader.load(Loader.java:530) 
 at org.bytedeco.javacpp.avcodec$AVPacket.<clinit>(avcodec.java:1694) 
 at org.bytedeco.javacv.FFmpegFrameRecorder.<init>(FFmpegFrameRecorder.java:149) 
 at com.fs.fs.api.VideoService.startRecordVideo(VideoService.java:34) 
 at com.fs.fs.activity.MainActivity.onCreate(MainActivity.java:75) 
 at android.app.Activity.performCreate(Activity.java:5304) 
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090) 
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2245) 
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2331) 
 at android.app.ActivityThread.access$1000(ActivityThread.java:143) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244) 
 at android.os.Handler.dispatchMessage(Handler.java:102) 
 at android.os.Looper.loop(Looper.java:136) 
 at android.app.ActivityThread.main(ActivityThread.java:5291) 
 at java.lang.reflect.Method.invokeNative(Native Method) 
 at java.lang.reflect.Method.invoke(Method.java:515) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 
 at dalvik.system.NativeStart.main(Native Method) 
 Caused by: java.lang.ClassNotFoundException: Didn't find class "org.bytedeco.javacpp.avutil" on path: DexPathList[[zip file "/data/app/com.fs.fs-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.fs.fs-2, /vendor/lib, /system/lib, /data/datalib]]
 at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
 at java.lang.Class.classForName(Native Method) 
 at java.lang.Class.forName(Class.java:251) 
 at org.bytedeco.javacpp.Loader.load(Loader.java:585) 
 at org.bytedeco.javacpp.Loader.load(Loader.java:530) 
 at org.bytedeco.javacpp.avcodec$AVPacket.<clinit>(avcodec.java:1694) 
 at org.bytedeco.javacv.FFmpegFrameRecorder.<init>(FFmpegFrameRecorder.java:149) 
 at com.fs.fs.api.VideoService.startRecordVideo(VideoService.java:34) 
 at com.fs.fs.activity.MainActivity.onCreate(MainActivity.java:75) 
 at android.app.Activity.performCreate(Activity.java:5304) 
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090) 
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2245) 
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2331) 
 at android.app.ActivityThread.access$1000(ActivityThread.java:143) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244) 
 at android.os.Handler.dispatchMessage(Handler.java:102) 
 at android.os.Looper.loop(Looper.java:136) 
 at android.app.ActivityThread.main(ActivityThread.java:5291) 
 at java.lang.reflect.Method.invokeNative(Native Method) 
 at java.lang.reflect.Method.invoke(Method.java:515) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 
 at dalvik.system.NativeStart.main(Native Method) 
</init></clinit></init></clinit></init></clinit></init></clinit>



How can i solve this error ?



Why error occurs ?


-
MP4 Created Using FFmpeg API Can't Be Played in Media Players
11 avril 2020, par RandyCroucherI've been struggling with this issue for days. There are similar issues posted here and around the web, but none of the solutions seem to work for me. They are possibly outdated ?



Here is the current iteration of code I'm using to generate the MP4 file.



It generates a simple 2 second .mp4 file that fails to play in any player I've tried. If I run that mp4 file back through the FFmpeg command line, it will generate a perfectly playable movie out of it. So the data is there.



Also, if you modify the output file name in this code from .mp4 to .avi, this code generates a playable avi file too. So whatever it is, it is tied to the H.264 format.



I'm sure I'm missing something simple, but for the life of me, I can't figure out what that is.



Any help would be greatly appreciated !



Here is a link to the VC++ project. MovieMaker.zip



MovieMaker.h



#pragma once

extern "C"
{
#include <libavcodec></libavcodec>avcodec.h>
#include <libavformat></libavformat>avformat.h>
#include <libswscale></libswscale>swscale.h>
#include <libavutil></libavutil>opt.h>
}

class FMovieMaker
{
public:
 ~FMovieMaker();

 bool Initialize(const char* FileName, int Width = 1920, int Height = 1080, int FPS = 30, int BitRate = 2000);
 bool RecordFrame(uint8_t* BGRAData);
 bool Finalize();

 bool IsInitialized() const { return bInitialized; }
 int GetWidth() const { return CodecContext ? CodecContext->width : 0; }
 int GetHeight() const { return CodecContext ? CodecContext->height : 0; }

private:
 bool EncodeFrame(bool bFinalize);
 void Log(const char* fmt, ...);

 AVOutputFormat* OutputFormat = nullptr;
 AVFormatContext* FormatContext = nullptr;
 AVCodecContext* CodecContext = nullptr;
 AVFrame* Frame = nullptr;
 SwsContext* ColorConverter = nullptr;
 int64_t RecordedFrames = 0;
 bool bInitialized = false;
};




MovieMaker.cpp



#include "MovieMaker.h"

FMovieMaker::~FMovieMaker()
{
 if (IsInitialized())
 Finalize();
}

bool FMovieMaker::Initialize(const char* FileName, int Width /*= 1920*/, int Height /*= 1080*/, int FPS /*= 30*/, int BitRate /*= 2000*/)
{
 OutputFormat = av_guess_format(nullptr, FileName, nullptr);
 if (!OutputFormat)
 {
 Log("Couldn't guess the output format from the filename: %s", FileName);
 return false;
 }

 AVCodecID CodecID = OutputFormat->video_codec;
 if (CodecID == AV_CODEC_ID_NONE)
 {
 Log("Could not determine a codec to use");
 return false;
 }

 /* allocate the output media context */
 int ErrorCode = avformat_alloc_output_context2(&FormatContext, OutputFormat, nullptr, FileName);
 if (ErrorCode < 0)
 {
 char Error[AV_ERROR_MAX_STRING_SIZE];
 av_make_error_string(Error, AV_ERROR_MAX_STRING_SIZE, ErrorCode);
 Log("Failed to allocate format context: %s", Error);
 return false;
 }
 else if (!FormatContext)
 {
 Log("Failed to get format from filename: %s", FileName);
 return false;
 }

 /* find the video encoder */
 const AVCodec* Codec = avcodec_find_encoder(CodecID);
 if (!Codec)
 {
 Log("Codec '%d' not found", CodecID);
 return false;
 }

 /* create the video stream */
 AVStream* Stream = avformat_new_stream(FormatContext, Codec);
 if (!Stream)
 {
 Log("Failed to allocate stream");
 return false;
 }

 /* create the codec context */
 CodecContext = avcodec_alloc_context3(Codec);
 if (!CodecContext)
 {
 Log("Could not allocate video codec context");
 return false;
 }

 Stream->codecpar->codec_id = OutputFormat->video_codec;
 Stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
 Stream->codecpar->width = Width;
 Stream->codecpar->height = Height;
 Stream->codecpar->format = AV_PIX_FMT_YUV420P;
 Stream->codecpar->bit_rate = (int64_t)BitRate * 1000;
 avcodec_parameters_to_context(CodecContext, Stream->codecpar);

 CodecContext->time_base = { 1, FPS };
 CodecContext->max_b_frames = 2;
 CodecContext->gop_size = 12;
 CodecContext->framerate = { FPS, 1 };

 if (Stream->codecpar->codec_id == AV_CODEC_ID_H264)
 av_opt_set(CodecContext, "preset", "medium", 0);
 else if (Stream->codecpar->codec_id == AV_CODEC_ID_H265)
 av_opt_set(CodecContext, "preset", "medium", 0);

 avcodec_parameters_from_context(Stream->codecpar, CodecContext);

 if (FormatContext->oformat->flags & AVFMT_GLOBALHEADER)
 CodecContext->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;

 if ((ErrorCode = avcodec_open2(CodecContext, Codec, NULL)) < 0)
 {
 char Error[AV_ERROR_MAX_STRING_SIZE];
 av_make_error_string(Error, AV_ERROR_MAX_STRING_SIZE, ErrorCode);
 Log("Failed to open codec: %s", Error);
 return false;
 }

 if (!(OutputFormat->flags & AVFMT_NOFILE))
 {
 if ((ErrorCode = avio_open(&FormatContext->pb, FileName, AVIO_FLAG_WRITE)) < 0)
 {
 char Error[AV_ERROR_MAX_STRING_SIZE];
 av_make_error_string(Error, AV_ERROR_MAX_STRING_SIZE, ErrorCode);
 Log("Failed to open file: %s", Error);
 return false;
 }
 }

 Stream->time_base = CodecContext->time_base;
 if ((ErrorCode = avformat_write_header(FormatContext, NULL)) < 0)
 {
 char Error[AV_ERROR_MAX_STRING_SIZE];
 av_make_error_string(Error, AV_ERROR_MAX_STRING_SIZE, ErrorCode);
 Log("Failed to write header: %s", Error);
 return false;
 }

 CodecContext->time_base = Stream->time_base;

 av_dump_format(FormatContext, 0, FileName, 1);

 // create the frame
 {
 Frame = av_frame_alloc();
 if (!Frame)
 {
 Log("Could not allocate video frame");
 return false;
 }
 Frame->format = CodecContext->pix_fmt;
 Frame->width = CodecContext->width;
 Frame->height = CodecContext->height;

 ErrorCode = av_frame_get_buffer(Frame, 32);
 if (ErrorCode < 0)
 {
 char Error[AV_ERROR_MAX_STRING_SIZE];
 av_make_error_string(Error, AV_ERROR_MAX_STRING_SIZE, ErrorCode);
 Log("Could not allocate the video frame data: %s", Error);
 return false;
 }
 }

 // create a color converter
 {
 ColorConverter = sws_getContext(CodecContext->width, CodecContext->height, AV_PIX_FMT_BGRA,
 CodecContext->width, CodecContext->height, AV_PIX_FMT_YUV420P, 0, 0, 0, 0);
 if (!ColorConverter)
 {
 Log("Could not allocate color converter");
 return false;
 }
 }

 bInitialized = true;
 return true;
}

bool FMovieMaker::RecordFrame(uint8_t* BGRAData)
{
 if (!bInitialized)
 {
 Log("Cannot record frames on an uninitialized Video Recorder");
 return false;
 }

 /*make sure the frame data is writable */
 int ErrorCode = av_frame_make_writable(Frame);
 if (ErrorCode < 0)
 {
 char Error[AV_ERROR_MAX_STRING_SIZE];
 av_make_error_string(Error, AV_ERROR_MAX_STRING_SIZE, ErrorCode);
 Log("Could not make the frame writable: %s", Error);
 return false;
 }

 /* convert the bgra bitmap data into yuv frame data */
 int inLinesize[1] = { 4 * CodecContext->width }; // RGB stride
 sws_scale(ColorConverter, &BGRAData, inLinesize, 0, CodecContext->height, Frame->data, Frame->linesize);

 //Frame->pts = RecordedFrames++;
 Frame->pts = CodecContext->time_base.den / CodecContext->time_base.num * CodecContext->framerate.den / CodecContext->framerate.num * (RecordedFrames++);
 //The following assumes that codecContext->time_base = (AVRational){1, 1};
 //Frame->pts = frameduration * (RecordedFrames++) * Stream->time_base.den / (Stream->time_base.num * fps);
 //Frame->pts += av_rescale_q(1, CodecContext->time_base, Stream->time_base);

 return EncodeFrame(false);
}

bool FMovieMaker::EncodeFrame(bool bFinalize)
{
 /* send the frame to the encoder */
 int ErrorCode = avcodec_send_frame(CodecContext, bFinalize ? nullptr : Frame);
 if (ErrorCode < 0)
 {
 char Error[AV_ERROR_MAX_STRING_SIZE];
 av_make_error_string(Error, AV_ERROR_MAX_STRING_SIZE, ErrorCode);
 Log("Error sending a frame for encoding: %s", Error);
 return false;
 }

 AVPacket Packet;
 av_init_packet(&Packet);
 Packet.data = NULL;
 Packet.size = 0;
 Packet.flags |= AV_PKT_FLAG_KEY;
 Packet.pts = Frame->pts;

 if (avcodec_receive_packet(CodecContext, &Packet) == 0)
 {
 //std::cout << "pkt key: " << (Packet.flags & AV_PKT_FLAG_KEY) << " " << Packet.size << " " << (counter++) << std::endl;
 uint8_t* size = ((uint8_t*)Packet.data);
 //std::cout << "first: " << (int)size[0] << " " << (int)size[1] << " " << (int)size[2] << " " << (int)size[3] << " " << (int)size[4] << " " << (int)size[5] << " " << (int)size[6] << " " << (int)size[7] << std::endl;

 av_interleaved_write_frame(FormatContext, &Packet);
 av_packet_unref(&Packet);
 }

 return true;
}

bool FMovieMaker::Finalize()
{
 if (!bInitialized)
 {
 Log("Cannot finalize uninitialized Video Recorder");
 return false;
 }

 //DELAYED FRAMES
 AVPacket Packet;
 av_init_packet(&Packet);
 Packet.data = NULL;
 Packet.size = 0;

 for (;;)
 {
 avcodec_send_frame(CodecContext, NULL);
 if (avcodec_receive_packet(CodecContext, &Packet) == 0)
 {
 av_interleaved_write_frame(FormatContext, &Packet);
 av_packet_unref(&Packet);
 }
 else
 break;
 }

 av_write_trailer(FormatContext);
 if (!(OutputFormat->flags & AVFMT_NOFILE))
 {
 int ErrorCode = avio_close(FormatContext->pb);
 if (ErrorCode < 0)
 {
 char Error[AV_ERROR_MAX_STRING_SIZE];
 av_make_error_string(Error, AV_ERROR_MAX_STRING_SIZE, ErrorCode);
 Log("Failed to close file: %s", Error);
 }
 }

 if (Frame)
 {
 av_frame_free(&Frame);
 Frame = nullptr;
 }

 if (CodecContext)
 {
 avcodec_free_context(&CodecContext);
 CodecContext = nullptr;
 }

 if (FormatContext)
 {
 avformat_free_context(FormatContext);
 FormatContext = nullptr;
 }

 if (ColorConverter)
 {
 sws_freeContext(ColorConverter);
 ColorConverter = nullptr;
 }

 bInitialized = false;
 return true;
}

void FMovieMaker::Log(const char* fmt, ...)
{
 va_list args;
 fprintf(stderr, "LOG: ");
 va_start(args, fmt);
 vfprintf(stderr, fmt, args);
 va_end(args);
 fprintf(stderr, "\n");
}




Main.cpp



#include "MovieMaker.h"

uint8_t FtoB(float x)
{
 if (x <= 0.0f)
 return 0;
 if (x >= 1.0f)
 return 255;
 else
 return (uint8_t)(x * 255.0f);
}

void SetPixelColor(float X, float Y, float Width, float Height, float t, uint8_t* BGRA)
{
 t += 12.0f; // more interesting colors at this time

 float P[2] = { 0.1f * X - 25.0f, 0.1f * Y - 25.0f };
 float V = sqrtf(P[0] * P[0] + P[1] * P[1]);
 BGRA[0] = FtoB(sinf(V + t / 0.78f));
 BGRA[1] = FtoB(sinf(V + t / 10.0f));
 BGRA[2] = FtoB(sinf(V + t / 36e2f));
 BGRA[3] = 255;
}

int main()
{
 FMovieMaker MovieMaker;

 const char* FileName = "C:\\ffmpeg\\MyMovieMakerMovie.mp4";
 int Width = 640;
 int Height = 480;
 int FPS = 30;
 int BitRateKBS = 2000;

 if (MovieMaker.Initialize(FileName, Width, Height, FPS, BitRateKBS))
 {
 int Size = Width * 4 * Height;
 uint8_t* BGRAData = new uint8_t[Size];
 memset(BGRAData, 255, Size);

 for (float Frame = 0; Frame < 60; Frame++)
 {
 // fill the image data with something interesting
 for (float Y = 0; Y < Height; Y++)
 {
 for (float X = 0; X < Width; X++)
 {
 SetPixelColor(X, Y, (float)Width, (float)Height, Frame / (float)FPS, &BGRAData[(int)(Y * Width + X) * 4]);
 }
 }

 if (!MovieMaker.RecordFrame(BGRAData))
 break;
 }

 delete[] BGRAData;

 MovieMaker.Finalize();
 }
}




If I have the lines that add the
AV_CODEC_FLAG_GLOBAL_HEADER
flag like shown above, I get all sorts of issues in the output fromffprobe MyMovieMakerMovie.mp4
.


C:\ffmpeg>ffprobe MyMovieMakerMovie.mp4
ffprobe version 4.2.2 Copyright (c) 2007-2019 the FFmpeg developers
 built with gcc 9.2.1 (GCC) 20200122
 configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
 libavutil 56. 31.100 / 56. 31.100
 libavcodec 58. 54.100 / 58. 54.100
 libavformat 58. 29.100 / 58. 29.100
 libavdevice 58. 8.100 / 58. 8.100
 libavfilter 7. 57.100 / 7. 57.100
 libswscale 5. 5.100 / 5. 5.100
 libswresample 3. 5.100 / 3. 5.100
 libpostproc 55. 5.100 / 55. 5.100
[h264 @ 000001d44b795b00] non-existing PPS 0 referenced
[h264 @ 000001d44b795b00] decode_slice_header error
[h264 @ 000001d44b795b00] no frame!
...
[h264 @ 000001d44b795b00] non-existing PPS 0 referenced
[h264 @ 000001d44b795b00] decode_slice_header error
[h264 @ 000001d44b795b00] no frame!
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001d44b783880] decoding for stream 0 failed
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001d44b783880] Could not find codec parameters for stream 0 (Video: h264 (avc1 / 0x31637661), none, 640x480, 20528 kb/s): unspecified pixel format
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'MyMovieMakerMovie.mp4':
 Metadata:
 major_brand : isom
 minor_version : 512
 compatible_brands: isomiso2avc1mp41
 encoder : Lavf58.29.100
 Duration: 00:00:01.97, start: 0.000000, bitrate: 20529 kb/s
 Stream #0:0(und): Video: h264 (avc1 / 0x31637661), none, 640x480, 20528 kb/s, 30.51 fps, 30 tbr, 15360 tbn, 30720 tbc (default)
 Metadata:
 handler_name : VideoHandler




Without adding the
AV_CODEC_FLAG_GLOBAL_HEADER
flag, I get a clean output from ffprobe, but the video still doesn't play. Notice it thinks the frame rate is 30.51, I'm not sure why.


C:\ffmpeg>ffprobe MyMovieMakerMovie.mp4
ffprobe version 4.2.2 Copyright (c) 2007-2019 the FFmpeg developers
 built with gcc 9.2.1 (GCC) 20200122
 configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
 libavutil 56. 31.100 / 56. 31.100
 libavcodec 58. 54.100 / 58. 54.100
 libavformat 58. 29.100 / 58. 29.100
 libavdevice 58. 8.100 / 58. 8.100
 libavfilter 7. 57.100 / 7. 57.100
 libswscale 5. 5.100 / 5. 5.100
 libswresample 3. 5.100 / 3. 5.100
 libpostproc 55. 5.100 / 55. 5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'MyMovieMakerMovie.mp4':
 Metadata:
 major_brand : isom
 minor_version : 512
 compatible_brands: isomiso2avc1mp41
 encoder : Lavf58.29.100
 Duration: 00:00:01.97, start: 0.000000, bitrate: 20530 kb/s
 Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480, 20528 kb/s, 30.51 fps, 30 tbr, 15360 tbn, 60 tbc (default)
 Metadata:
 handler_name : VideoHandler



-
Paid Advertising Performance – target the right customers and invest confidently