The bus, which was carrying around 20 students from a local secondary school, was struck by the train in Millas about 18 kilometres west (11 miles) of the city of Perpignan, close to the Spanish border.
“The bus was very badly hit,” the public prosecutor in Perpignan, Jean-Jacques Fagny, said.
The dead and critically injured were all travelling in the bus. Of the 12 who suffered minor injuries, three were train passengers, police sources said.
France Bleu regional radio reported that the train ploughed into the rear of the bus. Pictures posted on French media showed the bus had been severed in two.
Around 70 emergency workers, backed by four helicopters, were deployed as part of the rescue effort. The crash site was cordoned off to the media.
Prime Minister Edouard Philippe, who flew to Millas by helicopter, said the process of identifying the victims was “extremely difficult”.
Twenty four people were caught up in the accident, including the four dead, with “11 people in critical condition and nine others in serious condition,” the prime minister added.
The injured were taken to hospitals in the region.
“The priority at this stage is to be able to give precise information to the families,” Philippe said.
'Vision of horror'
The local L'Independant paper cited one of the rail passengers, named only as Barbara, as saying the impact “was very powerful and we thought the train was going to derail”.
The reason for the collision was unclear. Local politician Robert Olive described the scene as a “vision of horror”.
The national railway operator SNCF told AFP that “according to witnesses, the level crossing was working as normal” but that an investigation would be carried out to confirm the cause.
The families of the children rushed to the scene to try to get news of their loves ones, an AFP reporter at the scene witnessed.
President Emmanuel Macron tweeted: “All my thoughts for the victims of this terrible accident involving a school bus, as well as their families. The state is fully mobilised to help them.”
Transport Minister Elisabeth Borne and SNCF head Guillaume Pepy were also made their way to the accident site.
“It's a terrible event,” Education Minister Jean-Michel Blanquer said, expressing “profound sadness”.
The security department for the Pyrenees area, where the collision took place, said the accident involved a train travelling west from Perpignan to the town of Villefranche de Conflent.
The accident is the third involving several fatalities on French railways in the past four years.
In 2015, a high-speed TGV train being tested on a stretch of the line between Paris and the eastern city of Strasbourg derailed after hitting a bridge at 243 kilometres-per-hour, killing 11 people onboard.
In 2013, seven people were killed when a commuter train slammed into a station south of Paris.
A signalling defect was blamed for that crash.