I can say how popular one is over the other. But for public facing interfaces where you would normally use JSON or XML, protobuf can be an alternative. FlatBuffers are less safe, although they can be verified in some languages, and other languages are not very sensitive to buffer overruns.
Protobuf can take up less space than Flatbuffers when compressed, but Protobuf can use a lot more resources for parsing and allocation. JSON compresses relatively well. Normally I would recommend JSON for public APIs and FlatBuffers for internal message queues, or local file storage where you can trust the source, or perhaps sign the buffer. If your objective is performance use FlatBuffers. If your objective is safety and widest possible reach, use JSON. If undecided, use Protobuf. I think there is a case for using FlatBuffer schema to drive JSON and also Protobuf, so you can easily convert between these. But AFAIK there hasn't been much work on FlatBuffer / Protobuf interaction, although there has been some possibly not fully mature work on translating schemas between the two.
And reportedly, some find it easier to work with protobuf. At least there is a learning curve for using Flatbuffers correctly.