I am trying to encode mp4 video, but it doesn't open on my macbook because while it has the supported H264 codec, the container format is not MP4. So all I ask is how you would go about specifying the container format so I can generate video that is actually playable without using ffplay.
ffprobe version N-101948-g870bfe1 Copyright (c) 2007-2021 the FFmpeg developers
built with Apple LLVM version 10.0.1 (clang-1001.0.46.4)
configuration: --disable-asm --enable-shared --enable-libx264 --enable-gpl
libavutil 56. 72.100 / 56. 72.100
libavcodec 58.136.101 / 58.136.101
libavformat 58. 78.100 / 58. 78.100
libavdevice 58. 14.100 / 58. 14.100
libavfilter 7.111.100 / 7.111.100
libswscale 5. 10.100 / 5. 10.100
libswresample 3. 10.100 / 3. 10.100
libpostproc 55. 10.100 / 55. 10.100
Input #0, h264, from 'animation.mp4':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p(progressive), 1920x1080, 24.33 fps, 24 tbr, 1200k tbn, 48 tbc
void imagine::Camera::Record() {
if (recording_ == true)
throw std::runtime_error(
"you must close your camera before starting another recording"
);
recording_ = true;
output_file_ = std::fopen(output_.c_str(), "wb");
if (!output_file_)
throw std::runtime_error("failed to open file");
AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_H264);
if (!codec)
throw std::runtime_error("failed to find codec");
context_ = avcodec_alloc_context3(codec);
if (!context_)
throw std::runtime_error("failed to allocate video codec context");
packet_ = av_packet_alloc();
if (!packet_)
throw std::runtime_error("failed to allocate video packet");
py::tuple size = py::globals()["main_scene"].attr("size");
context_->width = size[0].cast<int>();
context_->height = size[1].cast<int>();
context_->bit_rate = 0.4 * fps_ * context_->width * context_->height;
context_->time_base = (AVRational){ 1, fps_ };
context_->framerate = (AVRational){ fps_, 1 };
context_->gop_size = 10;
context_->max_b_frames = 1;
context_->pix_fmt = AV_PIX_FMT_YUV420P;
if (avcodec_open2(context_, codec, NULL) < 0)
throw std::runtime_error("failed to open codec");
frame_ = av_frame_alloc();
if (!frame_)
throw std::runtime_error("failed to allocate video frame");
frame_->width = context_->width;
frame_->height = context_->height;
frame_->format = AV_PIX_FMT_YUV420P;
if (av_frame_get_buffer(frame_, 0) < 0)
throw std::runtime_error("failed to allocate the video frame data");
}