The wooden-hulled ferry, Maejan, was approaching its destination in Aparri town in Cagayan province after an eight-hour journey from Calayan islands in the Luzon Strait when it overturned near the mouth of the Cagayan River on Sunday evening, said Senior Inspector Alex de los Santos.
He said passengers jumped into the cold water after strong waves broke the ferry's bamboo outrigger, causing it to bob wildly.
"They panicked and grabbed anything like water containers that will keep them afloat then jumped off the boat," de los Santos told The Associated Press by telephone.
He said most of the 46 survivors swam to shore in Aparri, about half a mile (kilometer) away, where police and villagers found them shivering close to midnight.
The dead — including a 1-year-old boy and a town councillor — were taken to funeral parlors, where relatives gathered to identify them.
He said no one recognized the dead boy. "There were no relatives. Most probably his parents perished with him."
De los Santos said coast guard and navy vessels joined the search for 33 people still missing, but bad weather was hampering the effort.
Coast guard chief Vice Adm. Wilfredo Tamayo said criminal charges will be filed against the owner and surviving crew members of the 28-ton Maejan, which was authorized to carry only 50 people.
Hours before the ferry capsized, three children fell into the sea as the vessel was lashed by huge waves, Calayan Mayor Joseph Llopis said. Two of the children were plucked alive, but it was not clear if they survived the final capsizing, said Llopis, who lost 10 of his relatives in the disaster.
The accident was especially tragic because many of the passengers from his town of 17,000 people were traveling to Aparri to buy food and other goods ahead of Christmas, Llopis said.
"There'll be no festive mood," Mr Llopis said. "Many of the dead were breadwinners."
Last month, a cargo ship sank in rough seas north of Cagayan, and passing vessels plucked 16 of 20 people from shark-infested waters. Weeks earlier, separate storms capsized two passenger boats in the central Philippines, drowning more than 50 people.
Sea accidents are common in the Philippine archipelago because of tropical storms, badly maintained boats and weak enforcement of safety regulations.
In December 1987, the ferry Dona Paz sank after colliding with a fuel tanker, killing more than 4,341 people in the world's worst peacetime maritime disaster.
The state weather bureau over the weekend warned of an approaching storm from the Pacific with winds of up to 60 miles (95 kilometers) per hour.
Tropical Storm Dolphin could become a typhoon before getting closer to the eastern Philippines in the next few days, according to forecasts. Ferr
Philippine maritime disaster.
At least 28 people drowned and were confirmed dead, 46 were rescued, while 34 others remain missing on Sunday, after an overcrowded passenger  capsized off waters in , a town of 17,000 people, the  police reported. 

'M/B Mae Jan', a wooden-hulled , was carrying 102 passengers, after an eight-hour voyage from  in the  for  when it capsized less than 300 meters (984 feet) from its destination, at 8:30 p.m. Its   broke due to strong waves, as it reached the mouth of the  ('Bannag' Rio Grande de Cagayan, 'Ilog ng Kagayan'), along  Linao, about 50 meters from the shoreline of Pallog village.

Divers from the combined teams of the  and  helped in the rescue operations. 11 of the fatalities, including the vessel owner, Arellano, and her daughter were identified. The police said  "there was a possibility that the boat was overloaded," saying that "there was also livestock on board."  Due to "trauma," the ferry's captain refused to talk to police.

The Pinacanauan River, seen just below the , is one of the major tributaries of the Cagayan River.
Meanwhile, the  (PCG) formed a Special Board of Marine Inquiry (SBMI) to investigate the sea tragedy. It ordered the "immediate dispatch of SAR-003 and MCS-3005 vessels and the PCG Islander for aerial surveillance." PCG noted the  possible overloading of the vessel since the boat's franchise authorized it to carry only 40 passengers and 10 crew members.

In November, a  sank in rough seas north of Cagayan, and passing vessels rescued 16 of 20 passengers. Weeks earlier, separate storms sank two passenger vessels in the central Philippines, drowning more than 50 people.

Prior to the ferry sinking, the  had issued  to , of approaching tropical storm "Ulysses" (international codename: Dolphin) from the Pacific with winds of up to 60 miles (95 kilometers) per hour, centered off southeastern , eastern Philippines.